/ Hex Artifact Content
Login

Artifact c097228bff4d33c6b8a270c9717b9f8339068776:


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 2f 2a 0a 2a 2a 20  tdlib.h>../*.** 
0340: 57 68 65 6e 20 66 75 6c 6c 2d 74 65 78 74 20 69  When full-text i
0350: 6e 64 65 78 20 6e 6f 64 65 73 20 61 72 65 20 6c  ndex nodes are l
0360: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 2c  oaded from disk,
0370: 20 74 68 65 20 62 75 66 66 65 72 20 74 68 61 74   the buffer that
0380: 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6c 6f 61   they.** are loa
0390: 64 65 64 20 69 6e 74 6f 20 68 61 73 20 74 68 65  ded into has the
03a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 75 6d 62 65   following numbe
03b0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
03c0: 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  dding at the end
03d0: 20 0a 2a 2a 20 6f 66 20 69 74 2e 20 69 2e 65 2e   .** of it. i.e.
03e0: 20 69 66 20 61 20 66 75 6c 6c 2d 74 65 78 74 20   if a full-text 
03f0: 69 6e 64 65 78 20 6e 6f 64 65 20 69 73 20 39 30  index node is 90
0400: 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
0410: 20 74 68 65 6e 20 61 20 62 75 66 66 65 72 0a 2a   then a buffer.*
0420: 2a 20 6f 66 20 39 32 30 20 62 79 74 65 73 20 69  * of 920 bytes i
0430: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
0440: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  it..**.** This m
0450: 65 61 6e 73 20 74 68 61 74 20 69 66 20 77 65 20  eans that if we 
0460: 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 69  have a pointer i
0470: 6e 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e  nto a buffer con
0480: 74 61 69 6e 69 6e 67 20 6e 6f 64 65 20 64 61 74  taining node dat
0490: 61 2c 0a 2a 2a 20 69 74 20 69 73 20 61 6c 77 61  a,.** it is alwa
04a0: 79 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  ys safe to read 
04b0: 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
04c0: 73 20 66 72 6f 6d 20 69 74 20 77 69 74 68 6f 75  s from it withou
04d0: 74 20 72 69 73 6b 69 6e 67 20 61 6e 0a 2a 2a 20  t risking an.** 
04e0: 6f 76 65 72 72 65 61 64 2c 20 65 76 65 6e 20 69  overread, even i
04f0: 66 20 74 68 65 20 6e 6f 64 65 20 64 61 74 61 20  f the node data 
0500: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 0a 2a 2f  is corrupted..*/
0510: 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 4e 4f  .#define FTS3_NO
0520: 44 45 5f 50 41 44 44 49 4e 47 20 28 46 54 53 33  DE_PADDING (FTS3
0530: 5f 56 41 52 49 4e 54 5f 4d 41 58 2a 32 29 0a 0a  _VARINT_MAX*2)..
0540: 2f 2a 0a 2a 2a 20 55 6e 64 65 72 20 63 65 72 74  /*.** Under cert
0550: 61 69 6e 20 63 69 72 63 75 6d 73 74 61 6e 63 65  ain circumstance
0560: 73 2c 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20  s, b-tree nodes 
0570: 28 64 6f 63 6c 69 73 74 73 29 20 63 61 6e 20 62  (doclists) can b
0580: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a  e loaded into.**
0590: 20 6d 65 6d 6f 72 79 20 69 6e 63 72 65 6d 65 6e   memory incremen
05a0: 74 61 6c 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  tally instead of
05b0: 20 61 6c 6c 20 61 74 20 6f 6e 63 65 2e 20 54 68   all at once. Th
05c0: 69 73 20 63 61 6e 20 62 65 20 61 20 62 69 67 20  is can be a big 
05d0: 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 77  performance.** w
05e0: 69 6e 20 28 72 65 64 75 63 65 64 20 49 4f 20 61  in (reduced IO a
05f0: 6e 64 20 43 50 55 29 20 69 66 20 53 51 4c 69 74  nd CPU) if SQLit
0600: 65 20 73 74 6f 70 73 20 63 61 6c 6c 69 6e 67 20  e stops calling 
0610: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
0620: 65 20 78 4e 65 78 74 28 29 0a 2a 2a 20 6d 65 74  e xNext().** met
0630: 68 6f 64 20 62 65 66 6f 72 65 20 72 65 74 72 69  hod before retri
0640: 65 76 69 6e 67 20 61 6c 6c 20 71 75 65 72 79 20  eving all query 
0650: 72 65 73 75 6c 74 73 20 28 61 73 20 6d 61 79 20  results (as may 
0660: 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
0670: 70 6c 65 2c 0a 2a 2a 20 69 66 20 61 20 71 75 65  ple,.** if a que
0680: 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63  ry has a LIMIT c
0690: 6c 61 75 73 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e  lause)..**.** In
06a0: 63 72 65 6d 65 6e 74 61 6c 20 6c 6f 61 64 69 6e  cremental loadin
06b0: 67 20 69 73 20 75 73 65 64 20 66 6f 72 20 62 2d  g is used for b-
06c0: 74 72 65 65 20 6e 6f 64 65 73 20 46 54 53 33 5f  tree nodes FTS3_
06d0: 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53  NODE_CHUNK_THRES
06e0: 48 4f 4c 44 20 0a 2a 2a 20 62 79 74 65 73 20 61  HOLD .** bytes a
06f0: 6e 64 20 6c 61 72 67 65 72 2e 20 4e 6f 64 65 73  nd larger. Nodes
0700: 20 61 72 65 20 6c 6f 61 64 65 64 20 69 6e 20 63   are loaded in c
0710: 68 75 6e 6b 73 20 6f 66 20 46 54 53 33 5f 4e 4f  hunks of FTS3_NO
0720: 44 45 5f 43 48 55 4e 4b 53 49 5a 45 20 62 79 74  DE_CHUNKSIZE byt
0730: 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  es..** The code 
0740: 69 73 20 77 72 69 74 74 65 6e 20 73 6f 20 74 68  is written so th
0750: 61 74 20 74 68 65 20 68 61 72 64 20 6c 6f 77 65  at the hard lowe
0760: 72 2d 6c 69 6d 69 74 20 66 6f 72 20 65 61 63 68  r-limit for each
0770: 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73   of these values
0780: 20 0a 2a 2a 20 69 73 20 31 2e 20 43 6c 65 61 72   .** is 1. Clear
0790: 6c 79 20 73 75 63 68 20 73 6d 61 6c 6c 20 76 61  ly such small va
07a0: 6c 75 65 73 20 77 6f 75 6c 64 20 62 65 20 69 6e  lues would be in
07b0: 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20 63  efficient, but c
07c0: 61 6e 20 62 65 20 75 73 65 66 75 6c 20 0a 2a 2a  an be useful .**
07d0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
07e0: 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  poses..**.** If 
07f0: 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 62  this module is b
0800: 75 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45  uilt with SQLITE
0810: 5f 54 45 53 54 20 64 65 66 69 6e 65 64 2c 20 74  _TEST defined, t
0820: 68 65 73 65 20 63 6f 6e 73 74 61 6e 74 73 20 6d  hese constants m
0830: 61 79 0a 2a 2a 20 62 65 20 6f 76 65 72 72 69 64  ay.** be overrid
0840: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 66  den at runtime f
0850: 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
0860: 73 65 73 2e 20 46 69 6c 65 20 66 74 73 33 5f 74  ses. File fts3_t
0870: 65 73 74 2e 63 20 63 6f 6e 74 61 69 6e 73 0a 2a  est.c contains.*
0880: 2a 20 61 20 54 63 6c 20 69 6e 74 65 72 66 61 63  * a Tcl interfac
0890: 65 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77 72  e to read and wr
08a0: 69 74 65 20 74 68 65 20 76 61 6c 75 65 73 2e 0a  ite the values..
08b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
08c0: 5f 54 45 53 54 0a 69 6e 74 20 74 65 73 74 5f 66  _TEST.int test_f
08d0: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 73 69  ts3_node_chunksi
08e0: 7a 65 20 3d 20 28 34 2a 31 30 32 34 29 3b 0a 69  ze = (4*1024);.i
08f0: 6e 74 20 74 65 73 74 5f 66 74 73 33 5f 6e 6f 64  nt test_fts3_nod
0900: 65 5f 63 68 75 6e 6b 5f 74 68 72 65 73 68 6f 6c  e_chunk_threshol
0910: 64 20 3d 20 28 34 2a 31 30 32 34 29 2a 34 3b 0a  d = (4*1024)*4;.
0920: 23 20 64 65 66 69 6e 65 20 46 54 53 33 5f 4e 4f  # define FTS3_NO
0930: 44 45 5f 43 48 55 4e 4b 53 49 5a 45 20 20 20 20  DE_CHUNKSIZE    
0940: 20 20 20 74 65 73 74 5f 66 74 73 33 5f 6e 6f 64     test_fts3_nod
0950: 65 5f 63 68 75 6e 6b 73 69 7a 65 0a 23 20 64 65  e_chunksize.# de
0960: 66 69 6e 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43  fine FTS3_NODE_C
0970: 48 55 4e 4b 5f 54 48 52 45 53 48 4f 4c 44 20 74  HUNK_THRESHOLD t
0980: 65 73 74 5f 66 74 73 33 5f 6e 6f 64 65 5f 63 68  est_fts3_node_ch
0990: 75 6e 6b 5f 74 68 72 65 73 68 6f 6c 64 0a 23 65  unk_threshold.#e
09a0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 46 54 53  lse.# define FTS
09b0: 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49 5a 45  3_NODE_CHUNKSIZE
09c0: 20 28 34 2a 31 30 32 34 29 20 0a 23 20 64 65 66   (4*1024) .# 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 5f 54 48 52 45 53 48 4f 4c 44 20 28 46  UNK_THRESHOLD (F
09f0: 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49  TS3_NODE_CHUNKSI
0a00: 5a 45 2a 34 29 0a 23 65 6e 64 69 66 0a 0a 74 79  ZE*4).#endif..ty
0a10: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 65 6e  pedef struct Pen
0a20: 64 69 6e 67 4c 69 73 74 20 50 65 6e 64 69 6e 67  dingList Pending
0a30: 4c 69 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74  List;.typedef st
0a40: 72 75 63 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65  ruct SegmentNode
0a50: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79   SegmentNode;.ty
0a60: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 65 67  pedef struct Seg
0a70: 6d 65 6e 74 57 72 69 74 65 72 20 53 65 67 6d 65  mentWriter Segme
0a80: 6e 74 57 72 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a  ntWriter;../*.**
0a90: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
0aa0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61  the following da
0ab0: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ta structure is 
0ac0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 64 6f  used to build do
0ad0: 63 6c 69 73 74 73 0a 2a 2a 20 69 6e 63 72 65 6d  clists.** increm
0ae0: 65 6e 74 61 6c 6c 79 2e 20 53 65 65 20 66 75 6e  entally. See fun
0af0: 63 74 69 6f 6e 20 66 74 73 33 50 65 6e 64 69 6e  ction fts3Pendin
0b00: 67 4c 69 73 74 41 70 70 65 6e 64 28 29 20 66 6f  gListAppend() fo
0b10: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74  r details..*/.st
0b20: 72 75 63 74 20 50 65 6e 64 69 6e 67 4c 69 73 74  ruct PendingList
0b30: 20 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a   {.  int nData;.
0b40: 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20    char *aData;. 
0b50: 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 20 20 73   int nSpace;.  s
0b60: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61  qlite3_int64 iLa
0b70: 73 74 44 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74  stDocid;.  sqlit
0b80: 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 43 6f  e3_int64 iLastCo
0b90: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  l;.  sqlite3_int
0ba0: 36 34 20 69 4c 61 73 74 50 6f 73 3b 0a 7d 3b 0a  64 iLastPos;.};.
0bb0: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 63 75 72  ../*.** Each cur
0bc0: 73 6f 72 20 68 61 73 20 61 20 28 70 6f 73 73 69  sor has a (possi
0bd0: 62 6c 79 20 65 6d 70 74 79 29 20 6c 69 6e 6b 65  bly empty) linke
0be0: 64 20 6c 69 73 74 20 6f 66 20 74 68 65 20 66 6f  d list of the fo
0bf0: 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 73 2e  llowing objects.
0c00: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 33 44  .*/.struct Fts3D
0c10: 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 7b 0a 20  eferredToken {. 
0c20: 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e   Fts3PhraseToken
0c30: 20 2a 70 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20   *pToken;       
0c40: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
0c50: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 78 70  orresponding exp
0c60: 72 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74  r token */.  int
0c70: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0c90: 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 6d 75 73  Column token mus
0ca0: 74 20 6f 63 63 75 72 20 69 6e 20 2a 2f 0a 20 20  t occur in */.  
0cb0: 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
0cc0: 6e 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  n *pNext;       
0cd0: 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20  /* Next in list 
0ce0: 6f 66 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65  of deferred toke
0cf0: 6e 73 20 2a 2f 0a 20 20 50 65 6e 64 69 6e 67 4c  ns */.  PendingL
0d00: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69          /* Docli
0d20: 73 74 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20  st is assembled 
0d30: 68 65 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  here */.};../*.*
0d40: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0d50: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0d60: 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  is used to itera
0d70: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  te through the t
0d80: 65 72 6d 73 20 6f 6e 0a 2a 2a 20 61 20 63 6f 6e  erms on.** a con
0d90: 74 69 67 75 6f 75 73 20 73 65 74 20 6f 66 20 73  tiguous set of s
0da0: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 6c 65  egment b-tree le
0db0: 61 66 20 6e 6f 64 65 73 2e 20 41 6c 74 68 6f 75  af nodes. Althou
0dc0: 67 68 20 74 68 65 20 64 65 74 61 69 6c 73 20 6f  gh the details o
0dd0: 66 0a 2a 2a 20 74 68 69 73 20 73 74 72 75 63 74  f.** this struct
0de0: 75 72 65 20 61 72 65 20 6f 6e 6c 79 20 6d 61 6e  ure are only man
0df0: 69 70 75 6c 61 74 65 64 20 62 79 20 63 6f 64 65  ipulated by code
0e00: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 6f   in this file, o
0e10: 70 61 71 75 65 20 68 61 6e 64 6c 65 73 0a 2a 2a  paque handles.**
0e20: 20 6f 66 20 74 79 70 65 20 46 74 73 33 53 65 67   of type Fts3Seg
0e30: 52 65 61 64 65 72 2a 20 61 72 65 20 61 6c 73 6f  Reader* are also
0e40: 20 75 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e   used by code in
0e50: 20 66 74 73 33 2e 63 20 74 6f 20 69 74 65 72 61   fts3.c to itera
0e60: 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 65  te through.** te
0e70: 72 6d 73 20 77 68 65 6e 20 71 75 65 72 79 69 6e  rms when queryin
0e80: 67 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  g the full-text 
0e90: 69 6e 64 65 78 2e 20 53 65 65 20 66 75 6e 63 74  index. See funct
0ea0: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71  ions:.**.**   sq
0eb0: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
0ec0: 65 72 4e 65 77 28 29 0a 2a 2a 20 20 20 73 71 6c  erNew().**   sql
0ed0: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
0ee0: 72 46 72 65 65 28 29 0a 2a 2a 20 20 20 73 71 6c  rFree().**   sql
0ef0: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
0f00: 72 49 74 65 72 61 74 65 28 29 0a 2a 2a 0a 2a 2a  rIterate().**.**
0f10: 20 4d 65 74 68 6f 64 73 20 75 73 65 64 20 74 6f   Methods used to
0f20: 20 6d 61 6e 69 70 75 6c 61 74 65 20 46 74 73 33   manipulate Fts3
0f30: 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63 74  SegReader struct
0f40: 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74  ures:.**.**   ft
0f50: 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 28  s3SegReaderNext(
0f60: 29 0a 2a 2a 20 20 20 66 74 73 33 53 65 67 52 65  ).**   fts3SegRe
0f70: 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 29  aderFirstDocid()
0f80: 0a 2a 2a 20 20 20 66 74 73 33 53 65 67 52 65 61  .**   fts3SegRea
0f90: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 29 0a 2a  derNextDocid().*
0fa0: 2f 0a 73 74 72 75 63 74 20 46 74 73 33 53 65 67  /.struct Fts3Seg
0fb0: 52 65 61 64 65 72 20 7b 0a 20 20 69 6e 74 20 69  Reader {.  int i
0fc0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
0fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0fe0: 64 65 78 20 77 69 74 68 69 6e 20 6c 65 76 65 6c  dex within level
0ff0: 2c 20 6f 72 20 30 78 37 46 46 46 46 46 46 46 20  , or 0x7FFFFFFF 
1000: 66 6f 72 20 50 54 20 2a 2f 0a 0a 20 20 73 71 6c  for PT */..  sql
1010: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
1020: 74 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  tBlock;      /* 
1030: 52 6f 77 69 64 20 6f 66 20 66 69 72 73 74 20 6c  Rowid of first l
1040: 65 61 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61  eaf block to tra
1050: 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  verse */.  sqlit
1060: 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
1070: 64 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20 52 6f  dBlock;    /* Ro
1080: 77 69 64 20 6f 66 20 66 69 6e 61 6c 20 6c 65 61  wid of final lea
1090: 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65  f block to trave
10a0: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
10b0: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
10c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
10d0: 64 20 6f 66 20 66 69 6e 61 6c 20 62 6c 6f 63 6b  d of final block
10e0: 20 69 6e 20 73 65 67 6d 65 6e 74 20 28 6f 72 20   in segment (or 
10f0: 30 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  0) */.  sqlite3_
1100: 69 6e 74 36 34 20 69 43 75 72 72 65 6e 74 42 6c  int64 iCurrentBl
1110: 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ock;    /* Curre
1120: 6e 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 28 6f  nt leaf block (o
1130: 72 20 30 29 20 2a 2f 0a 0a 20 20 63 68 61 72 20  r 0) */..  char 
1140: 2a 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  *aNode;         
1150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1160: 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64 61  inter to node da
1170: 74 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ta (or NULL) */.
1180: 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20 20    int nNode;    
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
11b0: 66 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f 72  fer at aNode (or
11c0: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f   0) */.  int nPo
11d0: 70 75 6c 61 74 65 3b 20 20 20 20 20 20 20 20 20  pulate;         
11e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
11f0: 30 2c 20 62 79 74 65 73 20 6f 66 20 62 75 66 66  0, bytes of buff
1200: 65 72 20 61 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65  er aNode[] loade
1210: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  d */.  sqlite3_b
1220: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
1230: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
1240: 20 4e 55 4c 4c 2c 20 62 6c 6f 62 20 68 61 6e 64   NULL, blob hand
1250: 6c 65 20 74 6f 20 72 65 61 64 20 6e 6f 64 65 20  le to read node 
1260: 2a 2f 0a 0a 20 20 46 74 73 33 48 61 73 68 45 6c  */..  Fts3HashEl
1270: 65 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65 6d 3b  em **ppNextElem;
1280: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
1290: 20 73 65 74 20 62 79 20 66 74 73 33 53 65 67 52   set by fts3SegR
12a0: 65 61 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65  eaderNext(). The
12b0: 73 65 20 6d 61 79 20 62 65 20 72 65 61 64 20 64  se may be read d
12c0: 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  irectly.  ** by 
12d0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79  the caller. They
12e0: 20 61 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20   are valid from 
12f0: 74 68 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74  the time Segment
1300: 52 65 61 64 65 72 4e 65 77 28 29 20 72 65 74 75  ReaderNew() retu
1310: 72 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53  rns.  ** until S
1320: 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74  egmentReaderNext
1330: 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1340: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1350: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28  SQLITE_OK.  ** (
1360: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  i.e. SQLITE_DONE
1370: 29 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  )..  */.  int nT
1380: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
1390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13a0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
13b0: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
13c0: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20    char *zTerm;  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
13f0: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1400: 20 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63    int nTermAlloc
1410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1420: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1430: 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66  ize of zTerm buf
1440: 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  fer */.  char *a
1450: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
1460: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1470: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 6f  ter to doclist o
1480: 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
1490: 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
14a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
14b0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
14c0: 64 6f 63 6c 69 73 74 20 69 6e 20 63 75 72 72 65  doclist in curre
14d0: 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f  nt entry */..  /
14e0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
14f0: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
1500: 65 64 20 62 79 20 66 74 73 33 53 65 67 52 65 61  ed by fts3SegRea
1510: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 29 20 74  derNextDocid() t
1520: 6f 20 69 74 65 72 61 74 65 20 0a 20 20 2a 2a 20  o iterate .  ** 
1530: 74 68 72 6f 75 67 68 20 74 68 65 20 63 75 72 72  through the curr
1540: 65 6e 74 20 64 6f 63 6c 69 73 74 20 28 61 44 6f  ent doclist (aDo
1550: 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 29 2e  clist/nDoclist).
1560: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f  .  */.  char *pO
1570: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 69 6e 74  ffsetList;.  int
1580: 20 6e 4f 66 66 73 65 74 4c 69 73 74 3b 20 20 20   nOffsetList;   
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 70  For descending p
15b0: 65 6e 64 69 6e 67 20 73 65 67 2d 72 65 61 64 65  ending seg-reade
15c0: 72 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c  rs only */.  sql
15d0: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69  ite3_int64 iDoci
15e0: 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66  d;.};..#define f
15f0: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
1600: 6e 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70  nding(p) ((p)->p
1610: 70 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64  pNextElem!=0).#d
1620: 65 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61  efine fts3SegRea
1630: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29  derIsRootOnly(p)
1640: 20 28 28 70 29 2d 3e 61 4e 6f 64 65 3d 3d 28 63   ((p)->aNode==(c
1650: 68 61 72 20 2a 29 26 28 70 29 5b 31 5d 29 0a 0a  har *)&(p)[1])..
1660: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
1670: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1680: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ure is used to c
1690: 72 65 61 74 65 20 61 20 73 65 67 6d 65 6e 74 20  reate a segment 
16a0: 62 2d 74 72 65 65 20 69 6e 20 74 68 65 0a 2a 2a  b-tree in the.**
16b0: 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 69   database. The i
16c0: 6e 74 65 72 6e 61 6c 20 64 65 74 61 69 6c 73 20  nternal details 
16d0: 6f 66 20 74 68 69 73 20 74 79 70 65 20 61 72 65  of this type are
16e0: 20 6f 6e 6c 79 20 61 63 63 65 73 73 65 64 20 62   only accessed b
16f0: 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  y the.** followi
1700: 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
1710: 0a 2a 2a 20 20 20 66 74 73 33 53 65 67 57 72 69  .**   fts3SegWri
1720: 74 65 72 41 64 64 28 29 0a 2a 2a 20 20 20 66 74  terAdd().**   ft
1730: 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68  s3SegWriterFlush
1740: 28 29 0a 2a 2a 20 20 20 66 74 73 33 53 65 67 57  ().**   fts3SegW
1750: 72 69 74 65 72 46 72 65 65 28 29 0a 2a 2f 0a 73  riterFree().*/.s
1760: 74 72 75 63 74 20 53 65 67 6d 65 6e 74 57 72 69  truct SegmentWri
1770: 74 65 72 20 7b 0a 20 20 53 65 67 6d 65 6e 74 4e  ter {.  SegmentN
1780: 6f 64 65 20 2a 70 54 72 65 65 3b 20 20 20 20 20  ode *pTree;     
1790: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
17a0: 65 72 20 74 6f 20 69 6e 74 65 72 69 6f 72 20 74  er to interior t
17b0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
17c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
17d0: 20 69 46 69 72 73 74 3b 20 20 20 20 20 20 20 20   iFirst;        
17e0: 20 20 20 2f 2a 20 46 69 72 73 74 20 73 6c 6f 74     /* First slot
17f0: 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 77   in %_segments w
1800: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 73 71 6c 69  ritten */.  sqli
1810: 74 65 33 5f 69 6e 74 36 34 20 69 46 72 65 65 3b  te3_int64 iFree;
1820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1830: 65 78 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e  ext free slot in
1840: 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20   %_segments */. 
1850: 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
1880: 72 65 76 69 6f 75 73 20 74 65 72 6d 20 62 75 66  revious term buf
1890: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  fer */.  int nTe
18a0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
18b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18c0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
18d0: 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  Term */.  int nM
18e0: 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  alloc;          
18f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1900: 65 20 6f 66 20 6d 61 6c 6c 6f 63 27 64 20 62 75  e of malloc'd bu
1910: 66 66 65 72 20 61 74 20 7a 4d 61 6c 6c 6f 63 20  ffer at zMalloc 
1920: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c  */.  char *zMall
1930: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
1940: 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64       /* Malloc'd
1950: 20 73 70 61 63 65 20 28 70 6f 73 73 69 62 6c 79   space (possibly
1960: 29 20 75 73 65 64 20 66 6f 72 20 7a 54 65 72 6d  ) used for zTerm
1970: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b   */.  int nSize;
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 20 61   allocation at a
19b0: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  Data */.  int nD
19c0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
19e0: 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 61 44  es of data in aD
19f0: 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ata */.  char *a
1a00: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
1a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1a20: 74 65 72 20 74 6f 20 62 6c 6f 63 6b 20 66 72 6f  ter to block fro
1a30: 6d 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b  m malloc() */.};
1a40: 0a 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53 65 67  ../*.** Type Seg
1a50: 6d 65 6e 74 4e 6f 64 65 20 69 73 20 75 73 65 64  mentNode is used
1a60: 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   by the followin
1a70: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
1a80: 73 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 74  s to create.** t
1a90: 68 65 20 69 6e 74 65 72 69 6f 72 20 70 61 72 74  he interior part
1aa0: 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   of the segment 
1ab0: 62 2b 2d 74 72 65 65 20 73 74 72 75 63 74 75 72  b+-tree structur
1ac0: 65 73 20 28 65 76 65 72 79 74 68 69 6e 67 20 65  es (everything e
1ad0: 78 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c 65 61  xcept.** the lea
1ae0: 66 20 6e 6f 64 65 73 29 2e 20 54 68 65 73 65 20  f nodes). These 
1af0: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74 79  functions and ty
1b00: 70 65 20 61 72 65 20 6f 6e 6c 79 20 65 76 65 72  pe are only ever
1b10: 20 75 73 65 64 20 62 79 20 63 6f 64 65 0a 2a 2a   used by code.**
1b20: 20 77 69 74 68 69 6e 20 74 68 65 20 66 74 73 33   within the fts3
1b30: 53 65 67 57 72 69 74 65 72 58 58 58 28 29 20 66  SegWriterXXX() f
1b40: 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74 69 6f  amily of functio
1b50: 6e 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ns described abo
1b60: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33  ve..**.**   fts3
1b70: 4e 6f 64 65 41 64 64 54 65 72 6d 28 29 0a 2a 2a  NodeAddTerm().**
1b80: 20 20 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65     fts3NodeWrite
1b90: 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65  ().**   fts3Node
1ba0: 46 72 65 65 28 29 0a 2a 2a 0a 2a 2a 20 57 68 65  Free().**.** Whe
1bb0: 6e 20 61 20 62 2b 74 72 65 65 20 69 73 20 77 72  n a b+tree is wr
1bc0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
1bd0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 61 73  abase (either as
1be0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 6d   a result of a m
1bf0: 65 72 67 65 0a 2a 2a 20 6f 72 20 74 68 65 20 70  erge.** or the p
1c00: 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 61 62  ending-terms tab
1c10: 6c 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64  le being flushed
1c20: 29 2c 20 6c 65 61 76 65 73 20 61 72 65 20 77 72  ), leaves are wr
1c30: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
1c40: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1c50: 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 79   as soon as they
1c60: 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20   are completely 
1c70: 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 65 20 69  populated. The i
1c80: 6e 74 65 72 69 6f 72 20 6f 66 0a 2a 2a 20 74 68  nterior of.** th
1c90: 65 20 74 72 65 65 20 69 73 20 61 73 73 65 6d 62  e tree is assemb
1ca0: 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e  led in memory an
1cb0: 64 20 77 72 69 74 74 65 6e 20 6f 75 74 20 6f 6e  d written out on
1cc0: 6c 79 20 6f 6e 63 65 20 61 6c 6c 20 6c 65 61 76  ly once all leav
1cd0: 65 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  es have.** been 
1ce0: 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20 73 74  populated and st
1cf0: 6f 72 65 64 2e 20 54 68 69 73 20 69 73 20 4f 6b  ored. This is Ok
1d00: 2c 20 61 73 20 74 68 65 20 62 2b 2d 74 72 65 65  , as the b+-tree
1d10: 20 66 61 6e 6f 75 74 20 69 73 20 75 73 75 61 6c   fanout is usual
1d20: 6c 79 0a 2a 2a 20 76 65 72 79 20 6c 61 72 67 65  ly.** very large
1d30: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  , meaning that t
1d40: 68 65 20 69 6e 74 65 72 69 6f 72 20 6f 66 20 74  he interior of t
1d50: 68 65 20 74 72 65 65 20 63 6f 6e 73 75 6d 65 73  he tree consumes
1d60: 20 72 65 6c 61 74 69 76 65 6c 79 20 0a 2a 2a 20   relatively .** 
1d70: 6c 69 74 74 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a  little memory..*
1d80: 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65 6e 74  /.struct Segment
1d90: 4e 6f 64 65 20 7b 0a 20 20 53 65 67 6d 65 6e 74  Node {.  Segment
1da0: 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b 20 20  Node *pParent;  
1db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65           /* Pare
1dc0: 6e 74 20 6e 6f 64 65 20 28 6f 72 20 4e 55 4c 4c  nt node (or NULL
1dd0: 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 29 20   for root node) 
1de0: 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  */.  SegmentNode
1df0: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20   *pRight;       
1e00: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1e10: 74 6f 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  to right-sibling
1e20: 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64   */.  SegmentNod
1e30: 65 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20  e *pLeftmost;   
1e40: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1e50: 20 74 6f 20 6c 65 66 74 2d 6d 6f 73 74 20 6e 6f   to left-most no
1e60: 64 65 20 6f 66 20 74 68 69 73 20 64 65 70 74 68  de of this depth
1e70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79   */.  int nEntry
1e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ea0: 6f 66 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e  of terms written
1eb0: 20 74 6f 20 6e 6f 64 65 20 73 6f 20 66 61 72 20   to node so far 
1ec0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72 6d  */.  char *zTerm
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1ef0: 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  to previous term
1f00: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
1f10: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1f40: 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e  in zTerm */.  in
1f50: 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20  t nMalloc;      
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f70: 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63 27   Size of malloc'
1f80: 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61 6c  d buffer at zMal
1f90: 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  loc */.  char *z
1fa0: 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  Malloc;         
1fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c           /* Mall
1fc0: 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f 73 73  oc'd space (poss
1fd0: 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20 7a  ibly) used for z
1fe0: 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  Term */.  int nD
1ff0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2010: 65 73 20 6f 66 20 76 61 6c 69 64 20 64 61 74 61  es of valid data
2020: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61   so far */.  cha
2030: 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2050: 4e 6f 64 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a  Node data */.};.
2060: 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 20 76 61 6c  ./*.** Valid val
2070: 75 65 73 20 66 6f 72 20 74 68 65 20 73 65 63 6f  ues for the seco
2080: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66  nd argument to f
2090: 74 73 33 53 71 6c 53 74 6d 74 28 29 2e 0a 2a 2f  ts3SqlStmt()..*/
20a0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c  .#define SQL_DEL
20b0: 45 54 45 5f 43 4f 4e 54 45 4e 54 20 20 20 20 20  ETE_CONTENT     
20c0: 20 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e          0.#defin
20d0: 65 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59 20 20  e SQL_IS_EMPTY  
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44   1.#define SQL_D
2100: 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e  ELETE_ALL_CONTEN
2110: 54 20 20 20 20 20 20 20 20 20 32 20 0a 23 64 65  T         2 .#de
2120: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2130: 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 20 20 20 20  ALL_SEGMENTS    
2140: 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 53 51      3.#define SQ
2150: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47  L_DELETE_ALL_SEG
2160: 44 49 52 20 20 20 20 20 20 20 20 20 20 34 0a 23  DIR          4.#
2170: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2180: 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 20 20 20  E_ALL_DOCSIZE   
2190: 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20        5.#define 
21a0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
21b0: 54 41 54 20 20 20 20 20 20 20 20 20 20 20 20 36  TAT            6
21c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c  .#define SQL_SEL
21d0: 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52  ECT_CONTENT_BY_R
21e0: 4f 57 49 44 20 20 20 20 37 0a 23 64 65 66 69 6e  OWID    7.#defin
21f0: 65 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45  e SQL_NEXT_SEGME
2200: 4e 54 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20  NT_INDEX        
2210: 20 38 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 49   8.#define SQL_I
2220: 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53 20 20  NSERT_SEGMENTS  
2230: 20 20 20 20 20 20 20 20 20 20 39 0a 23 64 65 66            9.#def
2240: 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  ine SQL_NEXT_SEG
2250: 4d 45 4e 54 53 5f 49 44 20 20 20 20 20 20 20 20  MENTS_ID        
2260: 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53 51 4c    10.#define SQL
2270: 5f 49 4e 53 45 52 54 5f 53 45 47 44 49 52 20 20  _INSERT_SEGDIR  
2280: 20 20 20 20 20 20 20 20 20 20 20 31 31 0a 23 64             11.#d
2290: 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54  efine SQL_SELECT
22a0: 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 20 20 20  _LEVEL          
22b0: 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65 20 53      12.#define S
22c0: 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f  QL_SELECT_LEVEL_
22d0: 52 41 4e 47 45 20 20 20 20 20 20 20 20 31 33 0a  RANGE        13.
22e0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
22f0: 43 54 5f 4c 45 56 45 4c 5f 43 4f 55 4e 54 20 20  CT_LEVEL_COUNT  
2300: 20 20 20 20 20 20 31 34 0a 23 64 65 66 69 6e 65        14.#define
2310: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44   SQL_SELECT_SEGD
2320: 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 20 20 20 31  IR_MAX_LEVEL   1
2330: 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45  5.#define SQL_DE
2340: 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45  LETE_SEGDIR_LEVE
2350: 4c 20 20 20 20 20 20 20 31 36 0a 23 64 65 66 69  L       16.#defi
2360: 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  ne SQL_DELETE_SE
2370: 47 4d 45 4e 54 53 5f 52 41 4e 47 45 20 20 20 20  GMENTS_RANGE    
2380: 20 31 37 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   17.#define SQL_
2390: 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 20  CONTENT_INSERT  
23a0: 20 20 20 20 20 20 20 20 20 20 31 38 0a 23 64 65            18.#de
23b0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
23c0: 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20 20 20  DOCSIZE         
23d0: 20 20 20 31 39 0a 23 64 65 66 69 6e 65 20 53 51     19.#define SQ
23e0: 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a  L_REPLACE_DOCSIZ
23f0: 45 20 20 20 20 20 20 20 20 20 20 20 32 30 0a 23  E           20.#
2400: 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43  define SQL_SELEC
2410: 54 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20  T_DOCSIZE       
2420: 20 20 20 20 20 32 31 0a 23 64 65 66 69 6e 65 20       21.#define 
2430: 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 54 4f  SQL_SELECT_DOCTO
2440: 54 41 4c 20 20 20 20 20 20 20 20 20 20 20 32 32  TAL           22
2450: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52 45 50  .#define SQL_REP
2460: 4c 41 43 45 5f 44 4f 43 54 4f 54 41 4c 20 20 20  LACE_DOCTOTAL   
2470: 20 20 20 20 20 20 20 32 33 0a 0a 23 64 65 66 69         23..#defi
2480: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c  ne SQL_SELECT_AL
2490: 4c 5f 50 52 45 46 49 58 5f 4c 45 56 45 4c 20 20  L_PREFIX_LEVEL  
24a0: 20 32 34 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   24.#define SQL_
24b0: 44 45 4c 45 54 45 5f 41 4c 4c 5f 54 45 52 4d 53  DELETE_ALL_TERMS
24c0: 5f 53 45 47 44 49 52 20 20 20 32 35 0a 0a 23 64  _SEGDIR   25..#d
24d0: 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45  efine SQL_DELETE
24e0: 5f 53 45 47 44 49 52 5f 52 41 4e 47 45 20 20 20  _SEGDIR_RANGE   
24f0: 20 20 20 20 32 36 0a 0a 2f 2a 0a 2a 2a 20 54 68      26../*.** Th
2500: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2510: 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  sed to obtain an
2520: 20 53 51 4c 69 74 65 20 70 72 65 70 61 72 65 64   SQLite prepared
2530: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
2540: 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 73 74 61  e.** for the sta
2550: 74 65 6d 65 6e 74 20 69 64 65 6e 74 69 66 69 65  tement identifie
2560: 64 20 62 79 20 74 68 65 20 73 65 63 6f 6e 64 20  d by the second 
2570: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 73 75 63  argument. If suc
2580: 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 2a 70 70 20  cessful,.** *pp 
2590: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 72 65  is set to the re
25a0: 71 75 65 73 74 65 64 20 73 74 61 74 65 6d 65 6e  quested statemen
25b0: 74 20 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c  t handle and SQL
25c0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
25d0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
25e0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
25f0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2600: 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
2610: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  o 0..**.** If ar
2620: 67 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20  gument apVal is 
2630: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
2640: 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  t must point to 
2650: 61 6e 20 61 72 72 61 79 20 77 69 74 68 0a 2a 2a  an array with.**
2660: 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e   at least as man
2670: 79 20 65 6e 74 72 69 65 73 20 61 73 20 74 68 65  y entries as the
2680: 20 72 65 71 75 65 73 74 65 64 20 73 74 61 74 65   requested state
2690: 6d 65 6e 74 20 68 61 73 20 62 6f 75 6e 64 20 0a  ment has bound .
26a0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 2e 20 54  ** parameters. T
26b0: 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 62 6f  he values are bo
26c0: 75 6e 64 20 74 6f 20 74 68 65 20 73 74 61 74 65  und to the state
26d0: 6d 65 6e 74 73 20 70 61 72 61 6d 65 74 65 72 73  ments parameters
26e0: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
26f0: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
2700: 69 6e 74 20 66 74 73 33 53 71 6c 53 74 6d 74 28  int fts3SqlStmt(
2710: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2740: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
2750: 69 6e 74 20 65 53 74 6d 74 2c 20 20 20 20 20 20  int eStmt,      
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 51  /* One of the SQ
2780: 4c 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74 73 20  L_XXX constants 
2790: 61 62 6f 76 65 20 2a 2f 0a 20 20 73 71 6c 69 74  above */.  sqlit
27a0: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 2c 20 20 20  e3_stmt **pp,   
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
27c0: 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e  T: Statement han
27d0: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
27e0: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
27f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
2800: 65 73 20 74 6f 20 62 69 6e 64 20 74 6f 20 73 74  es to bind to st
2810: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
2820: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 71  const char *azSq
2830: 6c 5b 5d 20 3d 20 7b 0a 2f 2a 20 30 20 20 2a 2f  l[] = {./* 0  */
2840: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
2850: 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 57  Q.'%q_content' W
2860: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 3f 22 2c  HERE rowid = ?",
2870: 0a 2f 2a 20 31 20 20 2a 2f 20 20 22 53 45 4c 45  ./* 1  */  "SELE
2880: 43 54 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45  CT NOT EXISTS(SE
2890: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
28a0: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20  %Q.'%q_content' 
28b0: 57 48 45 52 45 20 72 6f 77 69 64 21 3d 3f 29 22  WHERE rowid!=?)"
28c0: 2c 0a 2f 2a 20 32 20 20 2a 2f 20 20 22 44 45 4c  ,./* 2  */  "DEL
28d0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
28e0: 63 6f 6e 74 65 6e 74 27 22 2c 0a 2f 2a 20 33 20  content'",./* 3 
28f0: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
2900: 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74  M %Q.'%q_segment
2910: 73 27 22 2c 0a 2f 2a 20 34 20 20 2a 2f 20 20 22  s'",./* 4  */  "
2920: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
2930: 25 71 5f 73 65 67 64 69 72 27 22 2c 0a 2f 2a 20  %q_segdir'",./* 
2940: 35 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  5  */  "DELETE F
2950: 52 4f 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73 69  ROM %Q.'%q_docsi
2960: 7a 65 27 22 2c 0a 2f 2a 20 36 20 20 2a 2f 20 20  ze'",./* 6  */  
2970: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
2980: 27 25 71 5f 73 74 61 74 27 22 2c 0a 2f 2a 20 37  '%q_stat'",./* 7
2990: 20 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 25 73    */  "SELECT %s
29a0: 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 22 2c   WHERE rowid=?",
29b0: 0a 2f 2a 20 38 20 20 2a 2f 20 20 22 53 45 4c 45  ./* 8  */  "SELE
29c0: 43 54 20 28 53 45 4c 45 43 54 20 6d 61 78 28 69  CT (SELECT max(i
29d0: 64 78 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  dx) FROM %Q.'%q_
29e0: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
29f0: 76 65 6c 20 3d 20 3f 29 20 2b 20 31 22 2c 0a 2f  vel = ?) + 1",./
2a00: 2a 20 39 20 20 2a 2f 20 20 22 49 4e 53 45 52 54  * 9  */  "INSERT
2a10: 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65 67   INTO %Q.'%q_seg
2a20: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 2c 20  ments'(blockid, 
2a30: 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c  block) VALUES(?,
2a40: 20 3f 29 22 2c 0a 2f 2a 20 31 30 20 2a 2f 20 20   ?)",./* 10 */  
2a50: 22 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  "SELECT coalesce
2a60: 28 28 53 45 4c 45 43 54 20 6d 61 78 28 62 6c 6f  ((SELECT max(blo
2a70: 63 6b 69 64 29 20 46 52 4f 4d 20 25 51 2e 27 25  ckid) FROM %Q.'%
2a80: 71 5f 73 65 67 6d 65 6e 74 73 27 29 20 2b 20 31  q_segments') + 1
2a90: 2c 20 31 29 22 2c 0a 2f 2a 20 31 31 20 2a 2f 20  , 1)",./* 11 */ 
2aa0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
2ab0: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 56 41 4c  .'%q_segdir' VAL
2ac0: 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29  UES(?,?,?,?,?,?)
2ad0: 22 2c 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ",..          /*
2ae0: 20 52 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73   Return segments
2af0: 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f   in order from o
2b00: 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e  ldest to newest.
2b10: 2a 2f 20 0a 2f 2a 20 31 32 20 2a 2f 20 20 22 53  */ ./* 12 */  "S
2b20: 45 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74  ELECT idx, start
2b30: 5f 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65  _block, leaves_e
2b40: 6e 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c  nd_block, end_bl
2b50: 6f 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20  ock, root ".    
2b60: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51          "FROM %Q
2b70: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
2b80: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44  RE level = ? ORD
2b90: 45 52 20 42 59 20 69 64 78 20 41 53 43 22 2c 0a  ER BY idx ASC",.
2ba0: 2f 2a 20 31 33 20 2a 2f 20 20 22 53 45 4c 45 43  /* 13 */  "SELEC
2bb0: 54 20 69 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f  T idx, start_blo
2bc0: 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62  ck, leaves_end_b
2bd0: 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c  lock, end_block,
2be0: 20 72 6f 6f 74 20 22 0a 20 20 20 20 20 20 20 20   root ".        
2bf0: 20 20 20 20 22 46 52 4f 4d 20 25 51 2e 27 25 71      "FROM %Q.'%q
2c00: 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c  _segdir' WHERE l
2c10: 65 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41  evel BETWEEN ? A
2c20: 4e 44 20 3f 22 0a 20 20 20 20 20 20 20 20 20 20  ND ?".          
2c30: 20 20 22 4f 52 44 45 52 20 42 59 20 6c 65 76 65    "ORDER BY leve
2c40: 6c 20 44 45 53 43 2c 20 69 64 78 20 41 53 43 22  l DESC, idx ASC"
2c50: 2c 0a 0a 2f 2a 20 31 34 20 2a 2f 20 20 22 53 45  ,../* 14 */  "SE
2c60: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2c70: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
2c80: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  ' WHERE level = 
2c90: 3f 22 2c 0a 2f 2a 20 31 35 20 2a 2f 20 20 22 53  ?",./* 15 */  "S
2ca0: 45 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29  ELECT max(level)
2cb0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
2cc0: 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c  dir' WHERE level
2cd0: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
2ce0: 22 2c 0a 0a 2f 2a 20 31 36 20 2a 2f 20 20 22 44  ",../* 16 */  "D
2cf0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
2d00: 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20  q_segdir' WHERE 
2d10: 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 31  level = ?",./* 1
2d20: 37 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52  7 */  "DELETE FR
2d30: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e  OM %Q.'%q_segmen
2d40: 74 73 27 20 57 48 45 52 45 20 62 6c 6f 63 6b 69  ts' WHERE blocki
2d50: 64 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  d BETWEEN ? AND 
2d60: 3f 22 2c 0a 2f 2a 20 31 38 20 2a 2f 20 20 22 49  ?",./* 18 */  "I
2d70: 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 27 25  NSERT INTO %Q.'%
2d80: 71 5f 63 6f 6e 74 65 6e 74 27 20 56 41 4c 55 45  q_content' VALUE
2d90: 53 28 25 73 29 22 2c 0a 2f 2a 20 31 39 20 2a 2f  S(%s)",./* 19 */
2da0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
2db0: 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 20 57  Q.'%q_docsize' W
2dc0: 48 45 52 45 20 64 6f 63 69 64 20 3d 20 3f 22 2c  HERE docid = ?",
2dd0: 0a 2f 2a 20 32 30 20 2a 2f 20 20 22 52 45 50 4c  ./* 20 */  "REPL
2de0: 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f  ACE INTO %Q.'%q_
2df0: 64 6f 63 73 69 7a 65 27 20 56 41 4c 55 45 53 28  docsize' VALUES(
2e00: 3f 2c 3f 29 22 2c 0a 2f 2a 20 32 31 20 2a 2f 20  ?,?)",./* 21 */ 
2e10: 20 22 53 45 4c 45 43 54 20 73 69 7a 65 20 46 52   "SELECT size FR
2e20: 4f 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a  OM %Q.'%q_docsiz
2e30: 65 27 20 57 48 45 52 45 20 64 6f 63 69 64 3d 3f  e' WHERE docid=?
2e40: 22 2c 0a 2f 2a 20 32 32 20 2a 2f 20 20 22 53 45  ",./* 22 */  "SE
2e50: 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20  LECT value FROM 
2e60: 25 51 2e 27 25 71 5f 73 74 61 74 27 20 57 48 45  %Q.'%q_stat' WHE
2e70: 52 45 20 69 64 3d 30 22 2c 0a 2f 2a 20 32 33 20  RE id=0",./* 23 
2e80: 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54  */  "REPLACE INT
2e90: 4f 20 25 51 2e 27 25 71 5f 73 74 61 74 27 20 56  O %Q.'%q_stat' V
2ea0: 41 4c 55 45 53 28 30 2c 3f 29 22 2c 0a 2f 2a 20  ALUES(0,?)",./* 
2eb0: 32 34 20 2a 2f 20 20 22 22 2c 0a 2f 2a 20 32 35  24 */  "",./* 25
2ec0: 20 2a 2f 20 20 22 22 2c 0a 0a 2f 2a 20 32 36 20   */  "",../* 26 
2ed0: 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  */ "DELETE FROM 
2ee0: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
2ef0: 48 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45  HERE level BETWE
2f00: 45 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 0a 20 20  EN ? AND ?",..  
2f10: 7d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  };.  int rc = SQ
2f20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
2f30: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
2f40: 0a 20 20 61 73 73 65 72 74 28 20 53 69 7a 65 6f  .  assert( Sizeo
2f50: 66 41 72 72 61 79 28 61 7a 53 71 6c 29 3d 3d 53  fArray(azSql)==S
2f60: 69 7a 65 6f 66 41 72 72 61 79 28 70 2d 3e 61 53  izeofArray(p->aS
2f70: 74 6d 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tmt) );.  assert
2f80: 28 20 65 53 74 6d 74 3c 53 69 7a 65 6f 66 41 72  ( eStmt<SizeofAr
2f90: 72 61 79 28 61 7a 53 71 6c 29 20 26 26 20 65 53  ray(azSql) && eS
2fa0: 74 6d 74 3e 3d 30 20 29 3b 0a 20 20 0a 20 20 70  tmt>=0 );.  .  p
2fb0: 53 74 6d 74 20 3d 20 70 2d 3e 61 53 74 6d 74 5b  Stmt = p->aStmt[
2fc0: 65 53 74 6d 74 5d 3b 0a 20 20 69 66 28 20 21 70  eStmt];.  if( !p
2fd0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 63 68 61 72  Stmt ){.    char
2fe0: 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 69 66 28 20   *zSql;.    if( 
2ff0: 65 53 74 6d 74 3d 3d 53 51 4c 5f 43 4f 4e 54 45  eStmt==SQL_CONTE
3000: 4e 54 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20  NT_INSERT ){.   
3010: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
3020: 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b  3_mprintf(azSql[
3030: 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20  eStmt], p->zDb, 
3040: 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 7a 57 72  p->zName, p->zWr
3050: 69 74 65 45 78 70 72 6c 69 73 74 29 3b 0a 20 20  iteExprlist);.  
3060: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 6d    }else if( eStm
3070: 74 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f  t==SQL_SELECT_CO
3080: 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 20 29  NTENT_BY_ROWID )
3090: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
30a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
30b0: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
30c0: 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a  zReadExprlist);.
30d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30e0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
30f0: 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53  mprintf(azSql[eS
3100: 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d  tmt], p->zDb, p-
3110: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
3120: 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a     if( !zSql ){.
3130: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3140: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
3150: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
3160: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
3170: 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
3180: 31 2c 20 26 70 53 74 6d 74 2c 20 4e 55 4c 4c 29  1, &pStmt, NULL)
3190: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
31a0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
31b0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
31c0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
31d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
31e0: 61 53 74 6d 74 5b 65 53 74 6d 74 5d 20 3d 20 70  aStmt[eStmt] = p
31f0: 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Stmt;.    }.  }.
3200: 20 20 69 66 28 20 61 70 56 61 6c 20 29 7b 0a 20    if( apVal ){. 
3210: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
3220: 74 20 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69 74  t nParam = sqlit
3230: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
3240: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
3250: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
3260: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
3270: 6e 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nParam; i++){.  
3280: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3290: 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d  _bind_value(pStm
32a0: 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d  t, i+1, apVal[i]
32b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
32c0: 70 70 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65  pp = pStmt;.  re
32d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
32e0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 6c 65 63  ic int fts3Selec
32f0: 74 44 6f 63 73 69 7a 65 28 0a 20 20 46 74 73 33  tDocsize(.  Fts3
3300: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
3310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3320: 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
3330: 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c   */.  int eStmt,
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20        /* Either 
3360: 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53 49  SQL_SELECT_DOCSI
3370: 5a 45 20 6f 72 20 44 4f 43 54 4f 54 41 4c 20 2a  ZE or DOCTOTAL *
3380: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
3390: 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20  4 iDocid,       
33a0: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20      /* Docid to 
33b0: 62 69 6e 64 20 66 6f 72 20 53 51 4c 5f 53 45 4c  bind for SQL_SEL
33c0: 45 43 54 5f 44 4f 43 53 49 5a 45 20 2a 2f 0a 20  ECT_DOCSIZE */. 
33d0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
33e0: 70 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20  ppStmt          
33f0: 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65   /* OUT: Stateme
3400: 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a  nt handle */.){.
3410: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
3420: 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20  pStmt = 0;      
3430: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 72    /* Statement r
3440: 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 66 74  equested from ft
3450: 73 33 53 71 6c 53 74 6d 74 28 29 20 2a 2f 0a 20  s3SqlStmt() */. 
3460: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
3490: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 65 53  */..  assert( eS
34a0: 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f  tmt==SQL_SELECT_
34b0: 44 4f 43 53 49 5a 45 20 7c 7c 20 65 53 74 6d 74  DOCSIZE || eStmt
34c0: 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43  ==SQL_SELECT_DOC
34d0: 54 4f 54 41 4c 20 29 3b 0a 0a 20 20 72 63 20 3d  TOTAL );..  rc =
34e0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 54 61   fts3SqlStmt(pTa
34f0: 62 2c 20 65 53 74 6d 74 2c 20 26 70 53 74 6d 74  b, eStmt, &pStmt
3500: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
3510: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3520: 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f   if( eStmt==SQL_
3530: 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 20 29  SELECT_DOCSIZE )
3540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
3550: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
3560: 2c 20 31 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20  , 1, iDocid);.  
3570: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
3580: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
3590: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
35a0: 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 73 71 6c 69  LITE_ROW || sqli
35b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
35c0: 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c 49 54  pStmt, 0)!=SQLIT
35d0: 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
35e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
35f0: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
3600: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3610: 4f 4b 20 29 20 72 63 20 3d 20 46 54 53 5f 43 4f  OK ) rc = FTS_CO
3620: 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
3630: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
3640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
3650: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3660: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 74    }.  }..  *ppSt
3670: 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65  mt = pStmt;.  re
3680: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
3690: 73 71 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63  sqlite3Fts3Selec
36a0: 74 44 6f 63 74 6f 74 61 6c 28 0a 20 20 46 74 73  tDoctotal(.  Fts
36b0: 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20  3Table *pTab,   
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36d0: 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  Fts3 table handl
36e0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
36f0: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20  tmt **ppStmt    
3700: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
3710: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
3720: 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  */.){.  return f
3730: 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65  ts3SelectDocsize
3740: 28 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43  (pTab, SQL_SELEC
3750: 54 5f 44 4f 43 54 4f 54 41 4c 2c 20 30 2c 20 70  T_DOCTOTAL, 0, p
3760: 70 53 74 6d 74 29 3b 0a 7d 0a 0a 69 6e 74 20 73  pStmt);.}..int s
3770: 71 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63 74  qlite3Fts3Select
3780: 44 6f 63 73 69 7a 65 28 0a 20 20 46 74 73 33 54  Docsize(.  Fts3T
3790: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
37a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
37b0: 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  s3 table handle 
37c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
37d0: 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20  64 iDocid,      
37e0: 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f       /* Docid to
37f0: 20 72 65 61 64 20 73 69 7a 65 20 64 61 74 61 20   read size data 
3800: 66 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  for */.  sqlite3
3810: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
3820: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
3830: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
3840: 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
3850: 20 66 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69   fts3SelectDocsi
3860: 7a 65 28 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c  ze(pTab, SQL_SEL
3870: 45 43 54 5f 44 4f 43 53 49 5a 45 2c 20 69 44 6f  ECT_DOCSIZE, iDo
3880: 63 69 64 2c 20 70 70 53 74 6d 74 29 3b 0a 7d 0a  cid, ppStmt);.}.
3890: 0a 2f 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74  ./*.** Similar t
38a0: 6f 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e  o fts3SqlStmt().
38b0: 20 45 78 63 65 70 74 2c 20 61 66 74 65 72 20 62   Except, after b
38c0: 69 6e 64 69 6e 67 20 74 68 65 20 70 61 72 61 6d  inding the param
38d0: 65 74 65 72 73 20 69 6e 0a 2a 2a 20 61 72 72 61  eters in.** arra
38e0: 79 20 61 70 56 61 6c 5b 5d 20 74 6f 20 74 68 65  y apVal[] to the
38f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
3900: 64 65 6e 74 69 66 69 65 64 20 62 79 20 65 53 74  dentified by eSt
3910: 6d 74 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e  mt, the statemen
3920: 74 0a 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64  t.** is executed
3930: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ..**.** Returns 
3940: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
3950: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75   statement is su
3960: 63 63 65 73 73 66 75 6c 6c 79 20 65 78 65 63 75  ccessfully execu
3970: 74 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 53 51  ted, or an.** SQ
3980: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
3990: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
39a0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 71  atic void fts3Sq
39b0: 6c 45 78 65 63 28 0a 20 20 69 6e 74 20 2a 70 52  lExec(.  int *pR
39c0: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
39d0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
39e0: 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
39f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
3a00: 2a 20 54 68 65 20 46 54 53 33 20 74 61 62 6c 65  * The FTS3 table
3a10: 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c   */.  int eStmt,
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a30: 2a 20 49 6e 64 65 78 20 6f 66 20 73 74 61 74 65  * Index of state
3a40: 6d 65 6e 74 20 74 6f 20 65 76 61 6c 75 61 74 65  ment to evaluate
3a50: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
3a60: 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 2f  lue **apVal    /
3a70: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20  * Parameters to 
3a80: 62 69 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  bind */.){.  sql
3a90: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
3aa0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
3ab0: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
3ac0: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
3ad0: 74 6d 74 28 70 2c 20 65 53 74 6d 74 2c 20 26 70  tmt(p, eStmt, &p
3ae0: 53 74 6d 74 2c 20 61 70 56 61 6c 29 3b 20 0a 20  Stmt, apVal); . 
3af0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3b00: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
3b10: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
3b20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
3b30: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
3b40: 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 7d  }.  *pRC = rc;.}
3b50: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
3b60: 6e 63 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74  nction ensures t
3b70: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
3b80: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 20 73 68  as obtained a sh
3b90: 61 72 65 64 2d 63 61 63 68 65 0a 2a 2a 20 74 61  ared-cache.** ta
3ba0: 62 6c 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ble-lock on the 
3bb0: 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
3bc0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
3bd0: 64 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  d before reading
3be0: 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
3bf0: 65 20 66 74 73 33 20 74 61 62 6c 65 2e 20 49 66  e fts3 table. If
3c00: 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6e 6f   this lock is no
3c10: 74 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74  t acquired first
3c20: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
3c30: 6c 6c 65 72 20 6d 61 79 20 65 6e 64 20 75 70 20  ller may end up 
3c40: 68 6f 6c 64 69 6e 67 20 72 65 61 64 2d 6c 6f 63  holding read-loc
3c50: 6b 73 20 6f 6e 20 74 68 65 20 25 5f 73 65 67 6d  ks on the %_segm
3c60: 65 6e 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69  ents and %_segdi
3c70: 72 0a 2a 2a 20 74 61 62 6c 65 73 2c 20 62 75 74  r.** tables, but
3c80: 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   no read-lock on
3c90: 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
3ca0: 61 62 6c 65 2e 20 49 66 20 74 68 69 73 20 68 61  able. If this ha
3cb0: 70 70 65 6e 73 20 0a 2a 2a 20 61 20 73 65 63 6f  ppens .** a seco
3cc0: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  nd connection wi
3cd0: 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 77 72  ll be able to wr
3ce0: 69 74 65 20 74 6f 20 74 68 65 20 66 74 73 33 20  ite to the fts3 
3cf0: 74 61 62 6c 65 2c 20 62 75 74 0a 2a 2a 20 61 74  table, but.** at
3d00: 74 65 6d 70 74 69 6e 67 20 74 6f 20 63 6f 6d 6d  tempting to comm
3d10: 69 74 20 74 68 6f 73 65 20 77 72 69 74 65 73 20  it those writes 
3d20: 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c  might return SQL
3d30: 49 54 45 5f 4c 4f 43 4b 45 44 20 6f 72 0a 2a 2a  ITE_LOCKED or.**
3d40: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
3d50: 48 41 52 45 44 43 41 43 48 45 20 28 62 65 63 61  HAREDCACHE (beca
3d60: 75 73 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 61  use the commit a
3d70: 74 74 65 6d 70 74 73 20 74 6f 20 6f 62 74 61 69  ttempts to obtai
3d80: 6e 20 0a 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  n .** write-lock
3d90: 73 20 6f 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  s on the %_segme
3da0: 6e 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72  nts and %_segdir
3db0: 20 2a 2a 20 74 61 62 6c 65 73 29 2e 20 0a 2a 2a   ** tables). .**
3dc0: 0a 2a 2a 20 57 65 20 74 72 79 20 74 6f 20 61 76  .** We try to av
3dd0: 6f 69 64 20 74 68 69 73 20 62 65 63 61 75 73 65  oid this because
3de0: 20 69 66 20 46 54 53 33 20 72 65 74 75 72 6e 73   if FTS3 returns
3df0: 20 61 6e 79 20 65 72 72 6f 72 20 77 68 65 6e 20   any error when 
3e00: 63 6f 6d 6d 69 74 74 69 6e 67 0a 2a 2a 20 61 20  committing.** a 
3e10: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
3e20: 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
3e30: 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
3e40: 64 20 62 61 63 6b 2e 20 41 6e 64 20 74 68 69 73  d back. And this
3e50: 20 69 73 0a 2a 2a 20 6e 6f 74 20 77 68 61 74 20   is.** not what 
3e60: 75 73 65 72 73 20 65 78 70 65 63 74 20 77 68 65  users expect whe
3e70: 6e 20 74 68 65 79 20 67 65 74 20 53 51 4c 49 54  n they get SQLIT
3e80: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
3e90: 41 43 48 45 2e 20 49 74 20 63 61 6e 0a 2a 2a 20  ACHE. It can.** 
3ea0: 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 66 20  still happen if 
3eb0: 74 68 65 20 75 73 65 72 20 72 65 61 64 73 20 64  the user reads d
3ec0: 61 74 61 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ata directly fro
3ed0: 6d 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  m the %_segments
3ee0: 20 6f 72 0a 2a 2a 20 25 5f 73 65 67 64 69 72 20   or.** %_segdir 
3ef0: 74 61 62 6c 65 73 20 69 6e 73 74 65 61 64 20 6f  tables instead o
3f00: 66 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 20  f going through 
3f10: 46 54 53 33 20 74 68 6f 75 67 68 2e 0a 2a 2a 0a  FTS3 though..**.
3f20: 2a 2a 20 54 68 69 73 20 72 65 61 73 6f 6e 69 6e  ** This reasonin
3f30: 67 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79  g does not apply
3f40: 20 74 6f 20 61 20 63 6f 6e 74 65 6e 74 3d 78 78   to a content=xx
3f50: 78 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  x table..*/.int 
3f60: 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 4c  sqlite3Fts3ReadL
3f70: 6f 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ock(Fts3Table *p
3f80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
3fb0: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
3fc0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
3fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
3fe0: 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 6f 62  ement used to ob
3ff0: 74 61 69 6e 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  tain lock */..  
4000: 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  if( p->zContentT
4010: 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  bl==0 ){.    rc 
4020: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
4030: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54   SQL_SELECT_CONT
4040: 45 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70  ENT_BY_ROWID, &p
4050: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
4060: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4070: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4080: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
4090: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
40a0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
40b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
40c0: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
40d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
40e0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
40f0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  _OK;.  }..  retu
4100: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4110: 53 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 61  Set *ppStmt to a
4120: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
4130: 65 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  e that may be us
4140: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
4150: 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 72 6f 77  rough.** all row
4160: 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69  s in the %_segdi
4170: 72 20 74 61 62 6c 65 2c 20 66 72 6f 6d 20 6f 6c  r table, from ol
4180: 64 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 20  dest to newest. 
4190: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
41a0: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
41b0: 4f 4b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  OK. If an error 
41c0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 72 65  occurs while pre
41d0: 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
41e0: 6d 65 6e 74 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ment, .** return
41f0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
4200: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
4210: 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  re is only ever 
4220: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
4230: 74 68 69 73 20 53 51 4c 20 73 74 61 74 65 6d 65  this SQL stateme
4240: 6e 74 20 63 6f 6d 70 69 6c 65 64 20 66 6f 72 0a  nt compiled for.
4250: 2a 2a 20 65 61 63 68 20 46 54 53 33 20 74 61 62  ** each FTS3 tab
4260: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  le..**.** The st
4270: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
4280: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
4290: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 25  lumns from the %
42a0: 5f 73 65 67 64 69 72 20 74 61 62 6c 65 3a 0a 2a  _segdir table:.*
42b0: 2a 0a 2a 2a 20 20 20 30 3a 20 69 64 78 0a 2a 2a  *.**   0: idx.**
42c0: 20 20 20 31 3a 20 73 74 61 72 74 5f 62 6c 6f 63     1: start_bloc
42d0: 6b 0a 2a 2a 20 20 20 32 3a 20 6c 65 61 76 65 73  k.**   2: leaves
42e0: 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20  _end_block.**   
42f0: 33 3a 20 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20  3: end_block.** 
4300: 20 20 34 3a 20 72 6f 6f 74 0a 2a 2f 0a 69 6e 74    4: root.*/.int
4310: 20 73 71 6c 69 74 65 33 46 74 73 33 41 6c 6c 53   sqlite3Fts3AllS
4320: 65 67 64 69 72 73 28 0a 20 20 46 74 73 33 54 61  egdirs(.  Fts3Ta
4330: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
4340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
4350: 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  3 table */.  int
4360: 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20   iIndex,        
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4380: 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e  Index for p->aIn
4390: 64 65 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  dex[] */.  int i
43a0: 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
43b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
43c0: 76 65 6c 20 74 6f 20 73 65 6c 65 63 74 20 2a 2f  vel to select */
43d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
43e0: 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20  **ppStmt        
43f0: 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6d 70 69     /* OUT: Compi
4400: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  led statement */
4410: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
4420: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
4430: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  tmt = 0;..  asse
4440: 72 74 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33  rt( iLevel==FTS3
4450: 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 7c  _SEGCURSOR_ALL |
4460: 7c 20 69 4c 65 76 65 6c 3e 3d 30 20 29 3b 0a 20  | iLevel>=0 );. 
4470: 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3c   assert( iLevel<
4480: 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
4490: 45 56 45 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  EVEL );.  assert
44a0: 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20 69  ( iIndex>=0 && i
44b0: 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20  Index<p->nIndex 
44c0: 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76 65 6c  );..  if( iLevel
44d0: 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 22 53 45  <0 ){.    /* "SE
44e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65  LECT * FROM %_se
44f0: 67 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c  gdir WHERE level
4500: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
4510: 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a   ORDER BY ..." *
4520: 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  /.    rc = fts3S
4530: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
4540: 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45  LECT_LEVEL_RANGE
4550: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
4560: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4570: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 73 71  _OK ){ .      sq
4580: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
4590: 53 74 6d 74 2c 20 31 2c 20 69 49 6e 64 65 78 2a  Stmt, 1, iIndex*
45a0: 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
45b0: 45 56 45 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  EVEL);.      sql
45c0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
45d0: 74 6d 74 2c 20 32 2c 20 28 69 49 6e 64 65 78 2b  tmt, 2, (iIndex+
45e0: 31 29 2a 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  1)*FTS3_SEGDIR_M
45f0: 41 58 4c 45 56 45 4c 2d 31 29 3b 0a 20 20 20 20  AXLEVEL-1);.    
4600: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
4610: 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  * "SELECT * FROM
4620: 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20   %_segdir WHERE 
4630: 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44 45 52 20  level = ? ORDER 
4640: 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20 72  BY ..." */.    r
4650: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
4660: 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45  p, SQL_SELECT_LE
4670: 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  VEL, &pStmt, 0);
4680: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
4690: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
46a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
46b0: 74 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76  t(pStmt, 1, iLev
46c0: 65 6c 2b 69 49 6e 64 65 78 2a 46 54 53 33 5f 53  el+iIndex*FTS3_S
46d0: 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 3b  EGDIR_MAXLEVEL);
46e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
46f0: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
4700: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
4710: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 73 69  *.** Append a si
4720: 6e 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61  ngle varint to a
4730: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 62 75 66   PendingList buf
4740: 66 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  fer. SQLITE_OK i
4750: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66  s returned.** if
4760: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
4770: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
4780: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
4790: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
47a0: 69 6f 6e 20 61 6c 73 6f 20 73 65 72 76 65 73 20  ion also serves 
47b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
47c0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75  PendingList stru
47d0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  cture itself..**
47e0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f   For example, to
47f0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 65   create a new Pe
4800: 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74  ndingList struct
4810: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
4820: 77 6f 0a 2a 2a 20 76 61 72 69 6e 74 73 3a 0a 2a  wo.** varints:.*
4830: 2a 0a 2a 2a 20 20 20 50 65 6e 64 69 6e 67 4c 69  *.**   PendingLi
4840: 73 74 20 2a 70 20 3d 20 30 3b 0a 2a 2a 20 20 20  st *p = 0;.**   
4850: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
4860: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20  ppendVarint(&p, 
4870: 31 29 3b 0a 2a 2a 20 20 20 66 74 73 33 50 65 6e  1);.**   fts3Pen
4880: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
4890: 72 69 6e 74 28 26 70 2c 20 32 29 3b 0a 2a 2f 0a  rint(&p, 2);.*/.
48a0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
48b0: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
48c0: 56 61 72 69 6e 74 28 0a 20 20 50 65 6e 64 69 6e  Varint(.  Pendin
48d0: 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20  gList **pp,     
48e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
48f0: 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
4900: 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75  PendingList stru
4910: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
4920: 69 6e 74 36 34 20 69 20 20 20 20 20 20 20 20 20  int64 i         
4930: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
4940: 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61   to append to da
4950: 74 61 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69  ta */.){.  Pendi
4960: 6e 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b  ngList *p = *pp;
4970: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
4980: 6f 72 20 67 72 6f 77 20 74 68 65 20 50 65 6e 64  or grow the Pend
4990: 69 6e 67 4c 69 73 74 20 61 73 20 72 65 71 75 69  ingList as requi
49a0: 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70  red. */.  if( !p
49b0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   ){.    p = sqli
49c0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
49d0: 66 28 2a 70 29 20 2b 20 31 30 30 29 3b 0a 20 20  f(*p) + 100);.  
49e0: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
49f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4a00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
4a10: 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 31 30 30   p->nSpace = 100
4a20: 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d  ;.    p->aData =
4a30: 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a   (char *)&p[1];.
4a40: 20 20 20 20 70 2d 3e 6e 44 61 74 61 20 3d 20 30      p->nData = 0
4a50: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
4a60: 20 70 2d 3e 6e 44 61 74 61 2b 46 54 53 33 5f 56   p->nData+FTS3_V
4a70: 41 52 49 4e 54 5f 4d 41 58 2b 31 3e 70 2d 3e 6e  ARINT_MAX+1>p->n
4a80: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74  Space ){.    int
4a90: 20 6e 4e 65 77 20 3d 20 70 2d 3e 6e 53 70 61 63   nNew = p->nSpac
4aa0: 65 20 2a 20 32 3b 0a 20 20 20 20 70 20 3d 20 73  e * 2;.    p = s
4ab0: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
4ac0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 6e  , sizeof(*p) + n
4ad0: 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21 70  New);.    if( !p
4ae0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4af0: 33 5f 66 72 65 65 28 2a 70 70 29 3b 0a 20 20 20  3_free(*pp);.   
4b00: 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20     *pp = 0;.    
4b10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4b20: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
4b30: 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65   p->nSpace = nNe
4b40: 77 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  w;.    p->aData 
4b50: 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b  = (char *)&p[1];
4b60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
4b70: 64 20 74 68 65 20 6e 65 77 20 73 65 72 69 61 6c  d the new serial
4b80: 69 7a 65 64 20 76 61 72 69 6e 74 20 74 6f 20 74  ized varint to t
4b90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
4ba0: 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 6e 44 61 74  st. */.  p->nDat
4bb0: 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
4bc0: 50 75 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 44  PutVarint(&p->aD
4bd0: 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 2c 20 69  ata[p->nData], i
4be0: 29 3b 0a 20 20 70 2d 3e 61 44 61 74 61 5b 70 2d  );.  p->aData[p-
4bf0: 3e 6e 44 61 74 61 5d 20 3d 20 27 5c 30 27 3b 0a  >nData] = '\0';.
4c00: 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74    *pp = p;.  ret
4c10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4c20: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 64 6f  ../*.** Add a do
4c30: 63 69 64 2f 63 6f 6c 75 6d 6e 2f 70 6f 73 69 74  cid/column/posit
4c40: 69 6f 6e 20 65 6e 74 72 79 20 74 6f 20 61 20 50  ion entry to a P
4c50: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
4c60: 74 75 72 65 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a  ture. Non-zero.*
4c70: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
4c80: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 69   the structure i
4c90: 73 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  s sqlite3_reallo
4ca0: 63 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ced as part of a
4cb0: 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 74  dding.** the ent
4cc0: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a  ry. Otherwise, z
4cd0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ero..**.** If an
4ce0: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
4cf0: 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  s, *pRc is set t
4d00: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62  o SQLITE_NOMEM b
4d10: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
4d20: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 61 6c 77 61  .** Zero is alwa
4d30: 79 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74  ys returned in t
4d40: 68 69 73 20 63 61 73 65 2e 20 4f 74 68 65 72 77  his case. Otherw
4d50: 69 73 65 2c 20 69 66 20 6e 6f 20 4f 4f 4d 20 65  ise, if no OOM e
4d60: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
4d70: 69 74 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  it is set to SQL
4d80: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
4d90: 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e  c int fts3Pendin
4da0: 67 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  gListAppend(.  P
4db0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c  endingList **pp,
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4dd0: 2a 20 49 4e 2f 4f 55 54 3a 20 50 65 6e 64 69 6e  * IN/OUT: Pendin
4de0: 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20  gList structure 
4df0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
4e00: 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20  64 iDocid,      
4e10: 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f       /* Docid fo
4e20: 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a  r entry to add *
4e30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
4e40: 34 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  4 iCol,         
4e50: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f      /* Column fo
4e60: 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a  r entry to add *
4e70: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
4e80: 34 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  4 iPos,         
4e90: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
4ea0: 6f 66 20 74 65 72 6d 20 66 6f 72 20 65 6e 74 72  of term for entr
4eb0: 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e  y to add */.  in
4ec0: 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20  t *pRc          
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ee0: 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64   OUT: Return cod
4ef0: 65 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e  e */.){.  Pendin
4f00: 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a  gList *p = *pp;.
4f10: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4f20: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
4f30: 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74 44   !p || p->iLastD
4f40: 6f 63 69 64 3c 3d 69 44 6f 63 69 64 20 29 3b 0a  ocid<=iDocid );.
4f50: 0a 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e  .  if( !p || p->
4f60: 69 4c 61 73 74 44 6f 63 69 64 21 3d 69 44 6f 63  iLastDocid!=iDoc
4f70: 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  id ){.    sqlite
4f80: 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 20 3d  3_int64 iDelta =
4f90: 20 69 44 6f 63 69 64 20 2d 20 28 70 20 3f 20 70   iDocid - (p ? p
4fa0: 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3a 20 30  ->iLastDocid : 0
4fb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
4fc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
4fd0: 3e 6e 44 61 74 61 3c 70 2d 3e 6e 53 70 61 63 65  >nData<p->nSpace
4fe0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4ff0: 28 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44  ( p->aData[p->nD
5000: 61 74 61 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ata]==0 );.     
5010: 20 70 2d 3e 6e 44 61 74 61 2b 2b 3b 0a 20 20 20   p->nData++;.   
5020: 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
5030: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33  E_OK!=(rc = fts3
5040: 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
5050: 64 56 61 72 69 6e 74 28 26 70 2c 20 69 44 65 6c  dVarint(&p, iDel
5060: 74 61 29 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ta)) ){.      go
5070: 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 70  to pendinglistap
5080: 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  pend_out;.    }.
5090: 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20      p->iLastCol 
50a0: 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 69 4c 61  = -1;.    p->iLa
50b0: 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 70  stPos = 0;.    p
50c0: 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3d 20 69  ->iLastDocid = i
50d0: 44 6f 63 69 64 3b 0a 20 20 7d 0a 20 20 69 66 28  Docid;.  }.  if(
50e0: 20 69 43 6f 6c 3e 30 20 26 26 20 70 2d 3e 69 4c   iCol>0 && p->iL
50f0: 61 73 74 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a  astCol!=iCol ){.
5100: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
5110: 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e  K!=(rc = fts3Pen
5120: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
5130: 72 69 6e 74 28 26 70 2c 20 31 29 29 0a 20 20 20  rint(&p, 1)).   
5140: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
5150: 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e  (rc = fts3Pendin
5160: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
5170: 74 28 26 70 2c 20 69 43 6f 6c 29 29 0a 20 20 20  t(&p, iCol)).   
5180: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
5190: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64  endinglistappend
51a0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
51b0: 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 69 43  p->iLastCol = iC
51c0: 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74  ol;.    p->iLast
51d0: 50 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  Pos = 0;.  }.  i
51e0: 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
51f0: 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 3e 70    assert( iPos>p
5200: 2d 3e 69 4c 61 73 74 50 6f 73 20 7c 7c 20 28 69  ->iLastPos || (i
5210: 50 6f 73 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 61  Pos==0 && p->iLa
5220: 73 74 50 6f 73 3d 3d 30 29 20 29 3b 0a 20 20 20  stPos==0) );.   
5230: 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
5240: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
5250: 74 28 26 70 2c 20 32 2b 69 50 6f 73 2d 70 2d 3e  t(&p, 2+iPos-p->
5260: 69 4c 61 73 74 50 6f 73 29 3b 0a 20 20 20 20 69  iLastPos);.    i
5270: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5280: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 61   ){.      p->iLa
5290: 73 74 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20  stPos = iPos;.  
52a0: 20 20 7d 0a 20 20 7d 0a 0a 20 70 65 6e 64 69 6e    }.  }.. pendin
52b0: 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3a  glistappend_out:
52c0: 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20  .  *pRc = rc;.  
52d0: 69 66 28 20 70 21 3d 2a 70 70 20 29 7b 0a 20 20  if( p!=*pp ){.  
52e0: 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 20 20 72    *pp = p;.    r
52f0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
5300: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5310: 2a 20 46 72 65 65 20 61 20 50 65 6e 64 69 6e 67  * Free a Pending
5320: 4c 69 73 74 20 6f 62 6a 65 63 74 20 61 6c 6c 6f  List object allo
5330: 63 61 74 65 64 20 62 79 20 66 74 73 33 50 65 6e  cated by fts3Pen
5340: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 29  dingListAppend()
5350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5360: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
5370: 44 65 6c 65 74 65 28 50 65 6e 64 69 6e 67 4c 69  Delete(PendingLi
5380: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71  st *pList){.  sq
5390: 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74  lite3_free(pList
53a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
53b0: 61 6e 20 65 6e 74 72 79 20 74 6f 20 6f 6e 65 20  an entry to one 
53c0: 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  of the pending-t
53d0: 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73  erms hash tables
53e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
53f0: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
5400: 41 64 64 4f 6e 65 28 0a 20 20 46 74 73 33 54 61  AddOne(.  Fts3Ta
5410: 62 6c 65 20 2a 70 2c 0a 20 20 69 6e 74 20 69 43  ble *p,.  int iC
5420: 6f 6c 2c 0a 20 20 69 6e 74 20 69 50 6f 73 2c 0a  ol,.  int iPos,.
5430: 20 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73    Fts3Hash *pHas
5440: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
5450: 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20 74 65 72    /* Pending ter
5460: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  ms hash table to
5470: 20 61 64 64 20 65 6e 74 72 79 20 74 6f 20 2a 2f   add entry to */
5480: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5490: 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 6e 54 6f  Token,.  int nTo
54a0: 6b 65 6e 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67  ken.){.  Pending
54b0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69  List *pList;.  i
54c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
54d0: 4b 3b 0a 0a 20 20 70 4c 69 73 74 20 3d 20 28 50  K;..  pList = (P
54e0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73  endingList *)fts
54f0: 33 48 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c  3HashFind(pHash,
5500: 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29   zToken, nToken)
5510: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
5520: 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
5530: 44 61 74 61 20 2d 3d 20 28 70 4c 69 73 74 2d 3e  Data -= (pList->
5540: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b  nData + nToken +
5550: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
5560: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  Elem));.  }.  if
5570: 28 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73  ( fts3PendingLis
5580: 74 41 70 70 65 6e 64 28 26 70 4c 69 73 74 2c 20  tAppend(&pList, 
5590: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 69  p->iPrevDocid, i
55a0: 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 72 63 29 20  Col, iPos, &rc) 
55b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  ){.    if( pList
55c0: 3d 3d 66 74 73 33 48 61 73 68 49 6e 73 65 72 74  ==fts3HashInsert
55d0: 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20  (pHash, zToken, 
55e0: 6e 54 6f 6b 65 6e 2c 20 70 4c 69 73 74 29 20 29  nToken, pList) )
55f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  {.      /* Mallo
5600: 63 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 69  c failed while i
5610: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
5620: 20 65 6e 74 72 79 2e 20 54 68 69 73 20 63 61 6e   entry. This can
5630: 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20   only .      ** 
5640: 68 61 70 70 65 6e 20 69 66 20 74 68 65 72 65 20  happen if there 
5650: 77 61 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  was no previous 
5660: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
5670: 6f 6b 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  oken..      */. 
5680: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
5690: 66 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61  fts3HashFind(pHa
56a0: 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  sh, zToken, nTok
56b0: 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  en) );.      sql
56c0: 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
56d0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
56e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
56f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
5700: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5710: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
5720: 2b 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61  += (pList->nData
5730: 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65   + nToken + size
5740: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29  of(Fts3HashElem)
5750: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5760: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b  rc;.}../*.** Tok
5770: 65 6e 69 7a 65 20 74 68 65 20 6e 75 6c 2d 74 65  enize the nul-te
5780: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
5790: 7a 54 65 78 74 20 61 6e 64 20 61 64 64 20 61 6c  zText and add al
57a0: 6c 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68 65 0a  l tokens to the.
57b0: 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  ** pending-terms
57c0: 20 68 61 73 68 2d 74 61 62 6c 65 2e 20 54 68 65   hash-table. The
57d0: 20 64 6f 63 69 64 20 75 73 65 64 20 69 73 20 74   docid used is t
57e0: 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  hat currently st
57f0: 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e 69 50  ored in.** p->iP
5800: 72 65 76 44 6f 63 69 64 2c 20 61 6e 64 20 74 68  revDocid, and th
5810: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70 65 63  e column is spec
5820: 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e  ified by argumen
5830: 74 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  t iCol..**.** If
5840: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
5850: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5860: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
5870: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
5880: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
5890: 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  nt fts3PendingTe
58a0: 72 6d 73 41 64 64 28 0a 20 20 46 74 73 33 54 61  rmsAdd(.  Fts3Ta
58b0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
58c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
58d0: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65  le into which te
58e0: 78 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  xt will be inser
58f0: 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ted */.  const c
5900: 68 61 72 20 2a 7a 54 65 78 74 2c 20 20 20 20 20  har *zText,     
5910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
5920: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20 74 6f 20   of document to 
5930: 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  be inserted */. 
5940: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 74 6f 20   /* Column into 
5970: 77 68 69 63 68 20 74 65 78 74 20 69 73 20 62 65  which text is be
5980: 69 6e 67 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ing inserted */.
5990: 20 20 75 33 32 20 2a 70 6e 57 6f 72 64 20 20 20    u32 *pnWord   
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
59c0: 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 73 65 72   of tokens inser
59d0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ted */.){.  int 
59e0: 72 63 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74  rc;.  int iStart
59f0: 3b 0a 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20  ;.  int iEnd;.  
5a00: 69 6e 74 20 69 50 6f 73 3b 0a 20 20 69 6e 74 20  int iPos;.  int 
5a10: 6e 57 6f 72 64 20 3d 20 30 3b 0a 0a 20 20 63 68  nWord = 0;..  ch
5a20: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e  ar const *zToken
5a30: 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a  ;.  int nToken;.
5a40: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
5a50: 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72  izer *pTokenizer
5a60: 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72   = p->pTokenizer
5a70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  ;.  sqlite3_toke
5a80: 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e  nizer_module con
5a90: 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54  st *pModule = pT
5aa0: 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c  okenizer->pModul
5ab0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  e;.  sqlite3_tok
5ac0: 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70  enizer_cursor *p
5ad0: 43 73 72 3b 0a 20 20 69 6e 74 20 28 2a 78 4e 65  Csr;.  int (*xNe
5ae0: 78 74 29 28 73 71 6c 69 74 65 33 5f 74 6f 6b 65  xt)(sqlite3_toke
5af0: 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43  nizer_cursor *pC
5b00: 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 63 6f 6e  ursor,.      con
5b10: 73 74 20 63 68 61 72 2a 2a 2c 69 6e 74 2a 2c 69  st char**,int*,i
5b20: 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 29 3b 0a  nt*,int*,int*);.
5b30: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
5b40: 6e 69 7a 65 72 20 26 26 20 70 4d 6f 64 75 6c 65  nizer && pModule
5b50: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
5b60: 20 75 73 65 72 20 68 61 73 20 69 6e 73 65 72 74   user has insert
5b70: 65 64 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2c  ed a NULL value,
5b80: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
5b90: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ay be called wit
5ba0: 68 0a 20 20 2a 2a 20 7a 54 65 78 74 3d 3d 30 2e  h.  ** zText==0.
5bb0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
5bc0: 64 64 20 7a 65 72 6f 20 74 6f 6b 65 6e 20 65 6e  dd zero token en
5bd0: 74 72 69 65 73 20 74 6f 20 74 68 65 20 68 61 73  tries to the has
5be0: 68 20 74 61 62 6c 65 20 61 6e 64 20 0a 20 20 2a  h table and .  *
5bf0: 2a 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  * return early. 
5c00: 2a 2f 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d  */.  if( zText==
5c10: 30 20 29 7b 0a 20 20 20 20 2a 70 6e 57 6f 72 64  0 ){.    *pnWord
5c20: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
5c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
5c40: 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d  .  rc = pModule-
5c50: 3e 78 4f 70 65 6e 28 70 54 6f 6b 65 6e 69 7a 65  >xOpen(pTokenize
5c60: 72 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70  r, zText, -1, &p
5c70: 43 73 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Csr);.  if( rc!=
5c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5ca0: 20 20 70 43 73 72 2d 3e 70 54 6f 6b 65 6e 69 7a    pCsr->pTokeniz
5cb0: 65 72 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 3b  er = pTokenizer;
5cc0: 0a 0a 20 20 78 4e 65 78 74 20 3d 20 70 4d 6f 64  ..  xNext = pMod
5cd0: 75 6c 65 2d 3e 78 4e 65 78 74 3b 0a 20 20 77 68  ule->xNext;.  wh
5ce0: 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ile( SQLITE_OK==
5cf0: 72 63 0a 20 20 20 20 20 20 26 26 20 53 51 4c 49  rc.      && SQLI
5d00: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 78 4e 65  TE_OK==(rc = xNe
5d10: 78 74 28 70 43 73 72 2c 20 26 7a 54 6f 6b 65 6e  xt(pCsr, &zToken
5d20: 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 53 74 61  , &nToken, &iSta
5d30: 72 74 2c 20 26 69 45 6e 64 2c 20 26 69 50 6f 73  rt, &iEnd, &iPos
5d40: 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
5d50: 69 3b 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3e  i;.    if( iPos>
5d60: 3d 6e 57 6f 72 64 20 29 20 6e 57 6f 72 64 20 3d  =nWord ) nWord =
5d70: 20 69 50 6f 73 2b 31 3b 0a 0a 20 20 20 20 2f 2a   iPos+1;..    /*
5d80: 20 50 6f 73 69 74 69 6f 6e 73 20 63 61 6e 6e 6f   Positions canno
5d90: 74 20 62 65 20 6e 65 67 61 74 69 76 65 3b 20 77  t be negative; w
5da0: 65 20 75 73 65 20 2d 31 20 61 73 20 61 20 74 65  e use -1 as a te
5db0: 72 6d 69 6e 61 74 6f 72 20 69 6e 74 65 72 6e 61  rminator interna
5dc0: 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 54 6f 6b 65  lly..    ** Toke
5dd0: 6e 73 20 6d 75 73 74 20 68 61 76 65 20 61 20 6e  ns must have a n
5de0: 6f 6e 2d 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a  on-zero length..
5df0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
5e00: 50 6f 73 3c 30 20 7c 7c 20 21 7a 54 6f 6b 65 6e  Pos<0 || !zToken
5e10: 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 3d 30 20 29 7b   || nToken<=0 ){
5e20: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
5e30: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
5e40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5e50: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65 72    /* Add the ter
5e60: 6d 20 74 6f 20 74 68 65 20 74 65 72 6d 73 20 69  m to the terms i
5e70: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ndex */.    rc =
5e80: 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
5e90: 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20 20  sAddOne(.       
5ea0: 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20   p, iCol, iPos, 
5eb0: 26 70 2d 3e 61 49 6e 64 65 78 5b 30 5d 2e 68 50  &p->aIndex[0].hP
5ec0: 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20  ending, zToken, 
5ed0: 6e 54 6f 6b 65 6e 0a 20 20 20 20 29 3b 0a 20 20  nToken.    );.  
5ee0: 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68    .    /* Add th
5ef0: 65 20 74 65 72 6d 20 74 6f 20 65 61 63 68 20 6f  e term to each o
5f00: 66 20 74 68 65 20 70 72 65 66 69 78 20 69 6e 64  f the prefix ind
5f10: 65 78 65 73 20 74 68 61 74 20 69 74 20 69 73 20  exes that it is 
5f20: 6e 6f 74 20 74 6f 6f 20 0a 20 20 20 20 2a 2a 20  not too .    ** 
5f30: 73 68 6f 72 74 20 66 6f 72 2e 20 2a 2f 0a 20 20  short for. */.  
5f40: 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
5f50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
5f60: 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20  >nIndex; i++){. 
5f70: 20 20 20 20 20 73 74 72 75 63 74 20 46 74 73 33       struct Fts3
5f80: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
5f90: 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 3b 0a 20  &p->aIndex[i];. 
5fa0: 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3c       if( nToken<
5fb0: 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 20  pIndex->nPrefix 
5fc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5fd0: 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
5fe0: 6e 67 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20  ngTermsAddOne(. 
5ff0: 20 20 20 20 20 20 20 20 20 70 2c 20 69 43 6f 6c           p, iCol
6000: 2c 20 69 50 6f 73 2c 20 26 70 49 6e 64 65 78 2d  , iPos, &pIndex-
6010: 3e 68 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65  >hPending, zToke
6020: 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66  n, pIndex->nPref
6030: 69 78 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ix.      );.    
6040: 7d 0a 20 20 7d 0a 0a 20 20 70 4d 6f 64 75 6c 65  }.  }..  pModule
6050: 2d 3e 78 43 6c 6f 73 65 28 70 43 73 72 29 3b 0a  ->xClose(pCsr);.
6060: 20 20 2a 70 6e 57 6f 72 64 20 3d 20 6e 57 6f 72    *pnWord = nWor
6070: 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  d;.  return (rc=
6080: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
6090: 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
60a0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e  }../* .** Callin
60b0: 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
60c0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 73  indicates that s
60d0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
60e0: 74 6f 20 0a 2a 2a 20 66 74 73 33 50 65 6e 64 69  to .** fts3Pendi
60f0: 6e 67 54 65 72 6d 73 41 64 64 28 29 20 61 72 65  ngTermsAdd() are
6100: 20 74 6f 20 61 64 64 20 74 65 72 6d 2f 70 6f 73   to add term/pos
6110: 69 74 69 6f 6e 2d 6c 69 73 74 20 70 61 69 72 73  ition-list pairs
6120: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e 74   for the.** cont
6130: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 6f 63 75  ents of the docu
6140: 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69 64 20  ment with docid 
6150: 69 44 6f 63 69 64 2e 0a 2a 2f 0a 73 74 61 74 69  iDocid..*/.stati
6160: 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e  c int fts3Pendin
6170: 67 54 65 72 6d 73 44 6f 63 69 64 28 46 74 73 33  gTermsDocid(Fts3
6180: 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
6190: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 29 7b 0a  _int64 iDocid){.
61a0: 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73 29    /* TODO(shess)
61b0: 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65 72   Explore whether
61c0: 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73 68   partially flush
61d0: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f  ing the buffer o
61e0: 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66 6c  n.  ** forced-fl
61f0: 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69 64  ush would provid
6200: 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d  e better perform
6210: 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63 74  ance.  I suspect
6220: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77 65   that if.  ** we
6230: 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f 63   ordered the doc
6240: 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61 6e  lists by size an
6250: 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c 61  d flushed the la
6260: 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65 0a  rgest until the.
6270: 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73 20    ** buffer was 
6280: 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61 74  half empty, that
6290: 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20 6c   would let the l
62a0: 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65 72  ess frequent ter
62b0: 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  ms.  ** generate
62c0: 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74 73   longer doclists
62d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 6f  ..  */.  if( iDo
62e0: 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76 44 6f 63  cid<=p->iPrevDoc
62f0: 69 64 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e  id || p->nPendin
6300: 67 44 61 74 61 3e 70 2d 3e 6e 4d 61 78 50 65 6e  gData>p->nMaxPen
6310: 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20 20  dingData ){.    
6320: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
6330: 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
6340: 46 6c 75 73 68 28 70 29 3b 0a 20 20 20 20 69 66  Flush(p);.    if
6350: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6360: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
6370: 0a 20 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64  .  p->iPrevDocid
6380: 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 72 65 74   = iDocid;.  ret
6390: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
63a0: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
63b0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
63c0: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
63d0: 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 0a  s hash tables. .
63e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
63f0: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43  ts3PendingTermsC
6400: 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65 20 2a  lear(Fts3Table *
6410: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  p){.  int i;.  f
6420: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 6e  or(i=0; i<p->nIn
6430: 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  dex; i++){.    F
6440: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  ts3HashElem *pEl
6450: 65 6d 3b 0a 20 20 20 20 46 74 73 33 48 61 73 68  em;.    Fts3Hash
6460: 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 49   *pHash = &p->aI
6470: 6e 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69 6e 67  ndex[i].hPending
6480: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d  ;.    for(pElem=
6490: 66 74 73 33 48 61 73 68 46 69 72 73 74 28 70 48  fts3HashFirst(pH
64a0: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
64b0: 65 6d 3d 66 74 73 33 48 61 73 68 4e 65 78 74 28  em=fts3HashNext(
64c0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 50  pElem)){.      P
64d0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73  endingList *pLis
64e0: 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74  t = (PendingList
64f0: 20 2a 29 66 74 73 33 48 61 73 68 44 61 74 61 28   *)fts3HashData(
6500: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 66 74  pElem);.      ft
6510: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c  s3PendingListDel
6520: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
6530: 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68 43 6c  }.    fts3HashCl
6540: 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 7d 0a  ear(pHash);.  }.
6550: 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
6560: 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  a = 0;.}../*.** 
6570: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6580: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78   called by the x
6590: 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 20  Update() method 
65a0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49 4e  as part of an IN
65b0: 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  SERT.** operatio
65c0: 6e 2e 20 49 74 20 61 64 64 73 20 65 6e 74 72 69  n. It adds entri
65d0: 65 73 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  es for each term
65e0: 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f   in the new reco
65f0: 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65 6e  rd to the.** pen
6600: 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74  dingTerms hash t
6610: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  able..**.** Argu
6620: 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20 74 68  ment apVal is th
6630: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 69  e same as the si
6640: 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61 72  milarly named ar
6650: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
6660: 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72 74 44 61  .** fts3InsertDa
6670: 74 61 28 29 2e 20 50 61 72 61 6d 65 74 65 72 20  ta(). Parameter 
6680: 69 44 6f 63 69 64 20 69 73 20 74 68 65 20 64 6f  iDocid is the do
6690: 63 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72  cid of the new r
66a0: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
66b0: 74 20 66 74 73 33 49 6e 73 65 72 74 54 65 72 6d  t fts3InsertTerm
66c0: 73 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  s(Fts3Table *p, 
66d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
66e0: 61 70 56 61 6c 2c 20 75 33 32 20 2a 61 53 7a 29  apVal, u32 *aSz)
66f0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
6720: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  variable */.  fo
6730: 72 28 69 3d 32 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=2; i<p->nCol
6740: 75 6d 6e 2b 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  umn+2; i++){.   
6750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
6760: 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  xt = (const char
6770: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
6780: 5f 74 65 78 74 28 61 70 56 61 6c 5b 69 5d 29 3b  _text(apVal[i]);
6790: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74  .    int rc = ft
67a0: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
67b0: 64 28 70 2c 20 7a 54 65 78 74 2c 20 69 2d 32 2c  d(p, zText, i-2,
67c0: 20 26 61 53 7a 5b 69 2d 32 5d 29 3b 0a 20 20 20   &aSz[i-2]);.   
67d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
67e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
67f0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
6800: 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d   aSz[p->nColumn]
6810: 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   += sqlite3_valu
6820: 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 69 5d  e_bytes(apVal[i]
6830: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6840: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6850: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6860: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
6870: 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65 74  he xUpdate() met
6880: 68 6f 64 20 66 6f 72 20 61 6e 20 49 4e 53 45 52  hod for an INSER
6890: 54 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  T operation..** 
68a0: 54 68 65 20 61 70 56 61 6c 20 70 61 72 61 6d 65  The apVal parame
68b0: 74 65 72 20 69 73 20 70 61 73 73 65 64 20 61 20  ter is passed a 
68c0: 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70 56 61  copy of the apVa
68d0: 6c 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  l argument passe
68e0: 64 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65 20 74  d by.** SQLite t
68f0: 6f 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20  o the xUpdate() 
6900: 6d 65 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a 2a 0a  method. i.e:.**.
6910: 2a 2a 20 20 20 61 70 56 61 6c 5b 30 5d 20 20 20  **   apVal[0]   
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74               Not
6930: 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45 52 54   used for INSERT
6940: 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 31 5d 20  ..**   apVal[1] 
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
6960: 6f 77 69 64 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  owid.**   apVal[
6970: 32 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2]              
6980: 20 20 4c 65 66 74 2d 6d 6f 73 74 20 75 73 65 72    Left-most user
6990: 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a  -defined column.
69a0: 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 61 70  **   ....**   ap
69b0: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  Val[p->nColumn+1
69c0: 5d 20 20 20 20 20 52 69 67 68 74 2d 6d 6f 73 74  ]     Right-most
69d0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
69e0: 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  lumn.**   apVal[
69f0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20 20 20  p->nColumn+2]   
6a00: 20 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20    Hidden column 
6a10: 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
6a20: 73 20 74 61 62 6c 65 0a 2a 2a 20 20 20 61 70 56  s table.**   apV
6a30: 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d  al[p->nColumn+3]
6a40: 20 20 20 20 20 48 69 64 64 65 6e 20 22 64 6f 63       Hidden "doc
6a50: 69 64 22 20 63 6f 6c 75 6d 6e 20 28 61 6c 69 61  id" column (alia
6a60: 73 20 66 6f 72 20 72 6f 77 69 64 29 0a 2a 2f 0a  s for rowid).*/.
6a70: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
6a80: 6e 73 65 72 74 44 61 74 61 28 0a 20 20 46 74 73  nsertData(.  Fts
6a90: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6ab0: 46 75 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20  Full-text table 
6ac0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
6ad0: 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20  ue **apVal,     
6ae0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
6af0: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73 65 72   values to inser
6b00: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  t */.  sqlite3_i
6b10: 6e 74 36 34 20 2a 70 69 44 6f 63 69 64 20 20 20  nt64 *piDocid   
6b20: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
6b30: 6f 63 69 64 20 66 6f 72 20 72 6f 77 20 6a 75 73  ocid for row jus
6b40: 74 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b  t inserted */.){
6b50: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
6b80: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
6b90: 74 6d 74 20 2a 70 43 6f 6e 74 65 6e 74 49 6e 73  tmt *pContentIns
6ba0: 65 72 74 3b 20 20 20 2f 2a 20 49 4e 53 45 52 54  ert;   /* INSERT
6bb0: 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20   INTO %_content 
6bc0: 56 41 4c 55 45 53 28 2e 2e 2e 29 20 2a 2f 0a 0a  VALUES(...) */..
6bd0: 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e    if( p->zConten
6be0: 74 54 62 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  tTbl ){.    sqli
6bf0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69  te3_value *pRowi
6c00: 64 20 3d 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f  d = apVal[p->nCo
6c10: 6c 75 6d 6e 2b 33 5d 3b 0a 20 20 20 20 69 66 28  lumn+3];.    if(
6c20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6c30: 79 70 65 28 70 52 6f 77 69 64 29 3d 3d 53 51 4c  ype(pRowid)==SQL
6c40: 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
6c50: 20 20 70 52 6f 77 69 64 20 3d 20 61 70 56 61 6c    pRowid = apVal
6c60: 5b 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [1];.    }.    i
6c70: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
6c80: 5f 74 79 70 65 28 70 52 6f 77 69 64 29 21 3d 53  _type(pRowid)!=S
6c90: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b  QLITE_INTEGER ){
6ca0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6cb0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
6cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 69 44 6f  .    }.    *piDo
6cd0: 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  cid = sqlite3_va
6ce0: 6c 75 65 5f 69 6e 74 36 34 28 70 52 6f 77 69 64  lue_int64(pRowid
6cf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
6d00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
6d10: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 73 74  /* Locate the st
6d20: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 75  atement handle u
6d30: 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 64 61  sed to insert da
6d40: 74 61 20 69 6e 74 6f 20 74 68 65 20 25 5f 63 6f  ta into the %_co
6d50: 6e 74 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65  ntent.  ** table
6d60: 2e 20 54 68 65 20 53 51 4c 20 66 6f 72 20 74 68  . The SQL for th
6d70: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 3a  is statement is:
6d80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53  .  **.  **   INS
6d90: 45 52 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65  ERT INTO %_conte
6da0: 6e 74 20 56 41 4c 55 45 53 28 3f 2c 20 3f 2c 20  nt VALUES(?, ?, 
6db0: 3f 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 0a 20 20 2a  ?, ...).  **.  *
6dc0: 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * The statement 
6dd0: 66 65 61 74 75 72 65 73 20 4e 20 27 3f 27 20 76  features N '?' v
6de0: 61 72 69 61 62 6c 65 73 2c 20 77 68 65 72 65 20  ariables, where 
6df0: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
6e00: 6f 66 20 75 73 65 72 0a 20 20 2a 2a 20 64 65 66  of user.  ** def
6e10: 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ined columns in 
6e20: 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2c 20  the FTS3 table, 
6e30: 70 6c 75 73 20 6f 6e 65 20 66 6f 72 20 74 68 65  plus one for the
6e40: 20 64 6f 63 69 64 20 66 69 65 6c 64 2e 0a 20 20   docid field..  
6e50: 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  */.  rc = fts3Sq
6e60: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 43 4f 4e  lStmt(p, SQL_CON
6e70: 54 45 4e 54 5f 49 4e 53 45 52 54 2c 20 26 70 43  TENT_INSERT, &pC
6e80: 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20 26 61  ontentInsert, &a
6e90: 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 69 66 28 20  pVal[1]);.  if( 
6ea0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
6ec0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20    }..  /* There 
6ed0: 69 73 20 61 20 71 75 69 72 6b 20 68 65 72 65 2e  is a quirk here.
6ee0: 20 54 68 65 20 75 73 65 72 73 20 49 4e 53 45 52   The users INSER
6ef0: 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  T statement may 
6f00: 68 61 76 65 20 73 70 65 63 69 66 69 65 64 0a 20  have specified. 
6f10: 20 2a 2a 20 61 20 76 61 6c 75 65 20 66 6f 72 20   ** a value for 
6f20: 74 68 65 20 22 72 6f 77 69 64 22 20 66 69 65 6c  the "rowid" fiel
6f30: 64 2c 20 66 6f 72 20 74 68 65 20 22 64 6f 63 69  d, for the "doci
6f40: 64 22 20 66 69 65 6c 64 2c 20 6f 72 20 66 6f 72  d" field, or for
6f50: 20 62 6f 74 68 2e 0a 20 20 2a 2a 20 57 68 69 63   both..  ** Whic
6f60: 68 20 69 73 20 61 20 70 72 6f 62 6c 65 6d 2c 20  h is a problem, 
6f70: 73 69 6e 63 65 20 22 72 6f 77 69 64 22 20 61 6e  since "rowid" an
6f80: 64 20 22 64 6f 63 69 64 22 20 61 72 65 20 61 6c  d "docid" are al
6f90: 69 61 73 65 73 20 66 6f 72 20 74 68 65 0a 20 20  iases for the.  
6fa0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 46  ** same value. F
6fb0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
6fc0: 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  .  **   INSERT I
6fd0: 4e 54 4f 20 66 74 73 33 74 62 6c 28 72 6f 77 69  NTO fts3tbl(rowi
6fe0: 64 2c 20 64 6f 63 69 64 29 20 56 41 4c 55 45 53  d, docid) VALUES
6ff0: 28 31 2c 20 32 29 3b 0a 20 20 2a 2a 0a 20 20 2a  (1, 2);.  **.  *
7000: 2a 20 49 6e 20 46 54 53 33 2c 20 74 68 69 73 20  * In FTS3, this 
7010: 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 74 20  is an error. It 
7020: 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 73  is an error to s
7030: 70 65 63 69 66 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  pecify non-NULL 
7040: 76 61 6c 75 65 73 0a 20 20 2a 2a 20 66 6f 72 20  values.  ** for 
7050: 62 6f 74 68 20 64 6f 63 69 64 20 61 6e 64 20 73  both docid and s
7060: 6f 6d 65 20 6f 74 68 65 72 20 72 6f 77 69 64 20  ome other rowid 
7070: 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  alias..  */.  if
7080: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  ( SQLITE_NULL!=s
7090: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
70a0: 65 28 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f  e(apVal[3+p->nCo
70b0: 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20 20 20 69 66  lumn]) ){.    if
70c0: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  ( SQLITE_NULL==s
70d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
70e0: 65 28 61 70 56 61 6c 5b 30 5d 29 0a 20 20 20 20  e(apVal[0]).    
70f0: 20 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   && SQLITE_NULL!
7100: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
7110: 79 70 65 28 61 70 56 61 6c 5b 31 5d 29 0a 20 20  ype(apVal[1]).  
7120: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20    ){.      /* A 
7130: 72 6f 77 69 64 2f 64 6f 63 69 64 20 63 6f 6e 66  rowid/docid conf
7140: 6c 69 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lict. */.      r
7150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
7160: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
7170: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
7180: 76 61 6c 75 65 28 70 43 6f 6e 74 65 6e 74 49 6e  value(pContentIn
7190: 73 65 72 74 2c 20 31 2c 20 61 70 56 61 6c 5b 33  sert, 1, apVal[3
71a0: 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  +p->nColumn]);. 
71b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
71c0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
71d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 65 63  ;.  }..  /* Exec
71e0: 75 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ute the statemen
71f0: 74 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  t to insert the 
7200: 72 65 63 6f 72 64 2e 20 53 65 74 20 2a 70 69 44  record. Set *piD
7210: 6f 63 69 64 20 74 6f 20 74 68 65 20 0a 20 20 2a  ocid to the .  *
7220: 2a 20 6e 65 77 20 64 6f 63 69 64 20 76 61 6c 75  * new docid valu
7230: 65 2e 20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  e. .  */.  sqlit
7240: 65 33 5f 73 74 65 70 28 70 43 6f 6e 74 65 6e 74  e3_step(pContent
7250: 49 6e 73 65 72 74 29 3b 0a 20 20 72 63 20 3d 20  Insert);.  rc = 
7260: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
7270: 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a 0a  ontentInsert);..
7280: 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 73 71 6c    *piDocid = sql
7290: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
72a0: 5f 72 6f 77 69 64 28 70 2d 3e 64 62 29 3b 0a 20  _rowid(p->db);. 
72b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
72c0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ./*.** Remove al
72d0: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
72e0: 46 54 53 33 20 74 61 62 6c 65 2e 20 43 6c 65 61  FTS3 table. Clea
72f0: 72 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  r the hash table
7300: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 70   containing.** p
7310: 65 6e 64 69 6e 67 20 74 65 72 6d 73 2e 0a 2a 2f  ending terms..*/
7320: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
7330: 44 65 6c 65 74 65 41 6c 6c 28 46 74 73 33 54 61  DeleteAll(Fts3Ta
7340: 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6e  ble *p, int bCon
7350: 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  tent){.  int rc 
7360: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
7370: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7380: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
7390: 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
73a0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e  tents of the pen
73b0: 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
73c0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
73d0: 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
73e0: 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20  rmsClear(p);..  
73f0: 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 74  /* Delete everyt
7400: 68 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 73 68  hing from the sh
7410: 61 64 6f 77 20 74 61 62 6c 65 73 2e 20 45 78 63  adow tables. Exc
7420: 65 70 74 2c 20 6c 65 61 76 65 20 25 5f 63 6f 6e  ept, leave %_con
7430: 74 65 6e 74 20 61 73 0a 20 20 2a 2a 20 69 73 20  tent as.  ** is 
7440: 69 66 20 62 43 6f 6e 74 65 6e 74 20 69 73 20 66  if bContent is f
7450: 61 6c 73 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alse.  */.  asse
7460: 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  rt( p->zContentT
7470: 62 6c 3d 3d 30 20 7c 7c 20 62 43 6f 6e 74 65 6e  bl==0 || bConten
7480: 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  t==0 );.  if( bC
7490: 6f 6e 74 65 6e 74 20 29 20 66 74 73 33 53 71 6c  ontent ) fts3Sql
74a0: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
74b0: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54  _DELETE_ALL_CONT
74c0: 45 4e 54 2c 20 30 29 3b 0a 20 20 66 74 73 33 53  ENT, 0);.  fts3S
74d0: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
74e0: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45  QL_DELETE_ALL_SE
74f0: 47 4d 45 4e 54 53 2c 20 30 29 3b 0a 20 20 66 74  GMENTS, 0);.  ft
7500: 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70  s3SqlExec(&rc, p
7510: 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  , SQL_DELETE_ALL
7520: 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20 69  _SEGDIR, 0);.  i
7530: 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  f( p->bHasDocsiz
7540: 65 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c  e ){.    fts3Sql
7550: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
7560: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f 43 53  _DELETE_ALL_DOCS
7570: 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  IZE, 0);.  }.  i
7580: 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29  f( p->bHasStat )
7590: 7b 0a 20 20 20 20 66 74 73 33 53 71 6c 45 78 65  {.    fts3SqlExe
75a0: 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
75b0: 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 2c 20 30  LETE_ALL_STAT, 0
75c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
75d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
75e0: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69   first element i
75f0: 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 72  n the apVal[] ar
7600: 72 61 79 20 69 73 20 61 73 73 75 6d 65 64 20 74  ray is assumed t
7610: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 64 6f  o contain the do
7620: 63 69 64 0a 2a 2a 20 28 61 6e 20 69 6e 74 65 67  cid.** (an integ
7630: 65 72 29 20 6f 66 20 61 20 72 6f 77 20 61 62 6f  er) of a row abo
7640: 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ut to be deleted
7650: 2e 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72  . Remove all ter
7660: 6d 73 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ms from the.** f
7670: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a  ull-text index..
7680: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7690: 74 73 33 44 65 6c 65 74 65 54 65 72 6d 73 28 20  ts3DeleteTerms( 
76a0: 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20  .  int *pRC,    
76b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
76c0: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46  sult code */.  F
76d0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
76e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 54         /* The FT
76f0: 53 20 74 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  S table to delet
7700: 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69  e from */.  sqli
7710: 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69  te3_value *pRowi
7720: 64 2c 20 20 2f 2a 20 54 68 65 20 64 6f 63 69 64  d,  /* The docid
7730: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a   to be deleted *
7740: 2f 0a 20 20 75 33 32 20 2a 61 53 7a 20 20 20 20  /.  u32 *aSz    
7750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7760: 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64 20  izes of deleted 
7770: 64 6f 63 75 6d 65 6e 74 20 77 72 69 74 74 65 6e  document written
7780: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
7790: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
77a0: 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 0a  stmt *pSelect;..
77b0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
77c0: 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  urn;.  rc = fts3
77d0: 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
77e0: 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59  ELECT_CONTENT_BY
77f0: 5f 52 4f 57 49 44 2c 20 26 70 53 65 6c 65 63 74  _ROWID, &pSelect
7800: 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 69 66  , &pRowid);.  if
7810: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7820: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
7830: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
7840: 74 65 70 28 70 53 65 6c 65 63 74 29 20 29 7b 0a  tep(pSelect) ){.
7850: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
7860: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
7870: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
7880: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
7890: 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f  har *zText = (co
78a0: 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
78b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
78c0: 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20  Select, i);.    
78d0: 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e      rc = fts3Pen
78e0: 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20  dingTermsAdd(p, 
78f0: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 61 53 7a 5b  zText, -1, &aSz[
7900: 69 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  i-1]);.        i
7910: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7920: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7930: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c  lite3_reset(pSel
7940: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ect);.          
7950: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
7960: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
7980: 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b  Sz[p->nColumn] +
7990: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
79a0: 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20  _bytes(pSelect, 
79b0: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
79c0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
79d0: 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74  e3_reset(pSelect
79e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
79f0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
7a00: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 2a 70  elect);.  }.  *p
7a10: 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  RC = rc;.}../*.*
7a20: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
7a30: 61 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74  ation to account
7a40: 20 66 6f 72 20 74 68 65 20 63 69 72 63 75 6c 61   for the circula
7a50: 72 20 64 65 70 65 6e 64 65 6e 63 79 20 62 65 74  r dependency bet
7a60: 77 65 65 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ween.** function
7a70: 73 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72  s fts3SegmentMer
7a80: 67 65 28 29 20 61 6e 64 20 66 74 73 33 41 6c 6c  ge() and fts3All
7a90: 6f 63 61 74 65 53 65 67 64 69 72 49 64 78 28 29  ocateSegdirIdx()
7aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7ab0: 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65  fts3SegmentMerge
7ac0: 28 46 74 73 33 54 61 62 6c 65 20 2a 2c 20 69 6e  (Fts3Table *, in
7ad0: 74 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a  t, int);../* .**
7ae0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
7af0: 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 6c  llocates a new l
7b00: 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65  evel iLevel inde
7b10: 78 20 69 6e 20 74 68 65 20 73 65 67 64 69 72 20  x in the segdir 
7b20: 74 61 62 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c  table..** Usuall
7b30: 79 2c 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  y, indexes are a
7b40: 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20  llocated within 
7b50: 61 20 6c 65 76 65 6c 20 73 65 71 75 65 6e 74 69  a level sequenti
7b60: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ally starting.**
7b70: 20 77 69 74 68 20 30 2c 20 73 6f 20 74 68 65 20   with 0, so the 
7b80: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  allocated index 
7b90: 69 73 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74  is one greater t
7ba0: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
7bb0: 74 75 72 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a  turned.** by:.**
7bc0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78  .**   SELECT max
7bd0: 28 69 64 78 29 20 46 52 4f 4d 20 25 5f 73 65 67  (idx) FROM %_seg
7be0: 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20  dir WHERE level 
7bf0: 3d 20 3a 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20  = :iLevel.**.** 
7c00: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 72  However, if ther
7c10: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 46 54  e are already FT
7c20: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69  S3_MERGE_COUNT i
7c30: 6e 64 65 78 65 73 20 61 74 20 74 68 65 20 72 65  ndexes at the re
7c40: 71 75 65 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c  quested.** level
7c50: 2c 20 74 68 65 79 20 61 72 65 20 6d 65 72 67 65  , they are merge
7c60: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  d into a single 
7c70: 6c 65 76 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29  level (iLevel+1)
7c80: 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 74 68 65   segment and the
7c90: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69   .** allocated i
7ca0: 6e 64 65 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a  ndex is 0..**.**
7cb0: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
7cc0: 2a 70 69 49 64 78 20 69 73 20 73 65 74 20 74 6f  *piIdx is set to
7cd0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69   the allocated i
7ce0: 6e 64 65 78 20 73 6c 6f 74 20 61 6e 64 20 53 51  ndex slot and SQ
7cf0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72  LITE_OK.** retur
7d00: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
7d10: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7d20: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
7d30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7d40: 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64  fts3AllocateSegd
7d50: 69 72 49 64 78 28 0a 20 20 46 74 73 33 54 61 62  irIdx(.  Fts3Tab
7d60: 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49  le *p, .  int iI
7d70: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
7d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
7d90: 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78  ex for p->aIndex
7da0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
7db0: 2c 20 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 0a  , .  int *piIdx.
7dc0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
7df0: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
7e00: 5f 73 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b  _stmt *pNextIdx;
7e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
7e20: 79 20 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61  y for next idx a
7e30: 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a  t level iLevel *
7e40: 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 20 3d 20  /.  int iNext = 
7e50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
7e60: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
7e70: 20 71 75 65 72 79 20 70 4e 65 78 74 49 64 78 20   query pNextIdx 
7e80: 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 76 61 72  */..  /* Set var
7e90: 69 61 62 6c 65 20 69 4e 65 78 74 20 74 6f 20 74  iable iNext to t
7ea0: 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c  he next availabl
7eb0: 65 20 73 65 67 64 69 72 20 69 6e 64 65 78 20 61  e segdir index a
7ec0: 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20  t level iLevel. 
7ed0: 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  */.  rc = fts3Sq
7ee0: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58  lStmt(p, SQL_NEX
7ef0: 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c  T_SEGMENT_INDEX,
7f00: 20 26 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a   &pNextIdx, 0);.
7f10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7f20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
7f30: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 4e 65 78  e3_bind_int(pNex
7f40: 74 49 64 78 2c 20 31 2c 20 69 49 6e 64 65 78 2a  tIdx, 1, iIndex*
7f50: 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
7f60: 45 56 45 4c 20 2b 20 69 4c 65 76 65 6c 29 3b 0a  EVEL + iLevel);.
7f70: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
7f80: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
7f90: 28 70 4e 65 78 74 49 64 78 29 20 29 7b 0a 20 20  (pNextIdx) ){.  
7fa0: 20 20 20 20 69 4e 65 78 74 20 3d 20 73 71 6c 69      iNext = sqli
7fb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
7fc0: 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20 20  NextIdx, 0);.   
7fd0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
7fe0: 74 65 33 5f 72 65 73 65 74 28 70 4e 65 78 74 49  te3_reset(pNextI
7ff0: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  dx);.  }..  if( 
8000: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8010: 0a 20 20 20 20 2f 2a 20 49 66 20 69 4e 65 78 74  .    /* If iNext
8020: 20 69 73 20 46 54 53 33 5f 4d 45 52 47 45 5f 43   is FTS3_MERGE_C
8030: 4f 55 4e 54 2c 20 69 6e 64 69 63 61 74 69 6e 67  OUNT, indicating
8040: 20 74 68 61 74 20 6c 65 76 65 6c 20 69 4c 65 76   that level iLev
8050: 65 6c 20 69 73 20 61 6c 72 65 61 64 79 0a 20 20  el is already.  
8060: 20 20 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72 67 65    ** full, merge
8070: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
8080: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e   level iLevel in
8090: 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76  to a single iLev
80a0: 65 6c 2b 31 0a 20 20 20 20 2a 2a 20 73 65 67 6d  el+1.    ** segm
80b0: 65 6e 74 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ent and allocate
80c0: 20 28 6e 65 77 6c 79 20 66 72 65 65 64 29 20 69   (newly freed) i
80d0: 6e 64 65 78 20 30 20 61 74 20 6c 65 76 65 6c 20  ndex 0 at level 
80e0: 69 4c 65 76 65 6c 2e 20 4f 74 68 65 72 77 69 73  iLevel. Otherwis
80f0: 65 2c 0a 20 20 20 20 2a 2a 20 69 66 20 69 4e 65  e,.    ** if iNe
8100: 78 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  xt is less than 
8110: 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  FTS3_MERGE_COUNT
8120: 2c 20 61 6c 6c 6f 63 61 74 65 20 69 6e 64 65 78  , allocate index
8130: 20 69 4e 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20   iNext..    */. 
8140: 20 20 20 69 66 28 20 69 4e 65 78 74 3e 3d 46 54     if( iNext>=FT
8150: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29  S3_MERGE_COUNT )
8160: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
8170: 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c  3SegmentMerge(p,
8180: 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29   iIndex, iLevel)
8190: 3b 0a 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d  ;.      *piIdx =
81a0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
81b0: 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 69 4e       *piIdx = iN
81c0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
81d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
81e0: 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 73 65 67 6d  /*.** The %_segm
81f0: 65 6e 74 73 20 74 61 62 6c 65 20 69 73 20 64 65  ents table is de
8200: 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77  clared as follow
8210: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
8220: 45 20 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e  E TABLE %_segmen
8230: 74 73 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47  ts(blockid INTEG
8240: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
8250: 62 6c 6f 63 6b 20 42 4c 4f 42 29 0a 2a 2a 0a 2a  block BLOB).**.*
8260: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8270: 72 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20  reads data from 
8280: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
8290: 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
82a0: 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 73 70 65  able. The.** spe
82b0: 63 69 66 69 63 20 72 6f 77 20 69 73 20 69 64 65  cific row is ide
82c0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 69  ntified by the i
82d0: 42 6c 6f 63 6b 69 64 20 70 61 72 61 6d 65 74 65  Blockid paramete
82e0: 72 2e 20 49 66 20 70 61 42 6c 6f 62 20 69 73 20  r. If paBlob is 
82f0: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  not.** NULL, the
8300: 6e 20 61 20 62 75 66 66 65 72 20 69 73 20 61 6c  n a buffer is al
8310: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
8320: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
8330: 6e 64 20 70 6f 70 75 6c 61 74 65 64 0a 2a 2a 20  nd populated.** 
8340: 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
8350: 73 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 73 74  s of the blob st
8360: 6f 72 65 64 20 69 6e 20 74 68 65 20 22 62 6c 6f  ored in the "blo
8370: 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ck" column of th
8380: 65 20 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  e .** identified
8390: 20 74 61 62 6c 65 20 72 6f 77 20 69 73 2e 20 57   table row is. W
83a0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61  hether or not pa
83b0: 42 6c 6f 62 20 69 73 20 4e 55 4c 4c 2c 20 2a 70  Blob is NULL, *p
83c0: 6e 42 6c 6f 62 20 69 73 20 73 65 74 0a 2a 2a 20  nBlob is set.** 
83d0: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
83e0: 68 65 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73  he blob in bytes
83f0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
8400: 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
8410: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20  rror occurs, or 
8420: 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  the table does n
8430: 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  ot contain the s
8440: 70 65 63 69 66 69 65 64 20 72 6f 77 2c 0a 2a 2a  pecified row,.**
8450: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
8460: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
8470: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
8480: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
8490: 6e 65 64 2e 20 49 66 0a 2a 2a 20 70 61 42 6c 6f  ned. If.** paBlo
84a0: 62 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  b is non-NULL, t
84b0: 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65  hen it is the re
84c0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
84d0: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 0a 2a 2a  the caller to.**
84e0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
84f0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 62 75   the returned bu
8500: 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ffer..**.** This
8510: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6c 65   function may le
8520: 61 76 65 20 61 6e 20 6f 70 65 6e 20 73 71 6c 69  ave an open sqli
8530: 74 65 33 5f 62 6c 6f 62 2a 20 68 61 6e 64 6c 65  te3_blob* handle
8540: 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 33 54   in the.** Fts3T
8550: 61 62 6c 65 2e 70 53 65 67 6d 65 6e 74 73 20 76  able.pSegments v
8560: 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 68 61  ariable. This ha
8570: 6e 64 6c 65 20 69 73 20 72 65 75 73 65 64 20 62  ndle is reused b
8580: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
8590: 6c 73 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  ls.** to this fu
85a0: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 68 61 6e 64  nction. The hand
85b0: 6c 65 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64  le may be closed
85c0: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
85d0: 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  ** sqlite3Fts3Se
85e0: 67 6d 65 6e 74 73 43 6c 6f 73 65 28 29 20 66 75  gmentsClose() fu
85f0: 6e 63 74 69 6f 6e 2e 20 52 65 75 73 69 6e 67 20  nction. Reusing 
8600: 61 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  a blob handle is
8610: 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66   a handy.** perf
8620: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
8630: 65 6e 74 2c 20 62 75 74 20 74 68 65 20 62 6c 6f  ent, but the blo
8640: 62 20 68 61 6e 64 6c 65 20 73 68 6f 75 6c 64 20  b handle should 
8650: 61 6c 77 61 79 73 20 62 65 20 63 6c 6f 73 65 64  always be closed
8660: 0a 2a 2a 20 62 65 66 6f 72 65 20 63 6f 6e 74 72  .** before contr
8670: 6f 6c 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  ol is returned t
8680: 6f 20 74 68 65 20 75 73 65 72 20 28 74 6f 20 70  o the user (to p
8690: 72 65 76 65 6e 74 20 61 20 6c 6f 63 6b 20 62 65  revent a lock be
86a0: 69 6e 67 20 68 65 6c 64 0a 2a 2a 20 6f 6e 20 74  ing held.** on t
86b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
86c0: 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e   for longer than
86d0: 20 6e 65 63 65 73 73 61 72 79 29 2e 20 54 68 75   necessary). Thu
86e0: 73 2c 20 61 6e 79 20 76 69 72 74 75 61 6c 20 74  s, any virtual t
86f0: 61 62 6c 65 0a 2a 2a 20 6d 65 74 68 6f 64 20 28  able.** method (
8700: 78 46 69 6c 74 65 72 20 65 74 63 2e 29 20 74 68  xFilter etc.) th
8710: 61 74 20 6d 61 79 20 64 69 72 65 63 74 6c 79 20  at may directly 
8720: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 20 63 61  or indirectly ca
8730: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
8740: 0a 2a 2a 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  .** must call sq
8750: 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74  lite3Fts3Segment
8760: 73 43 6c 6f 73 65 28 29 20 62 65 66 6f 72 65 20  sClose() before 
8770: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
8780: 74 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  t sqlite3Fts3Rea
8790: 64 42 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54 61  dBlock(.  Fts3Ta
87a0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
87b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
87c0: 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
87d0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
87e0: 34 20 69 42 6c 6f 63 6b 69 64 2c 20 20 20 20 20  4 iBlockid,     
87f0: 20 20 20 20 2f 2a 20 41 63 63 65 73 73 20 74 68      /* Access th
8800: 65 20 72 6f 77 20 77 69 74 68 20 62 6c 6f 63 6b  e row with block
8810: 69 64 3d 24 69 42 6c 6f 63 6b 69 64 20 2a 2f 0a  id=$iBlockid */.
8820: 20 20 63 68 61 72 20 2a 2a 70 61 42 6c 6f 62 2c    char **paBlob,
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 62 20 64    /* OUT: Blob d
8850: 61 74 61 20 69 6e 20 6d 61 6c 6c 6f 63 27 64 20  ata in malloc'd 
8860: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
8870: 2a 70 6e 42 6c 6f 62 2c 20 20 20 20 20 20 20 20  *pnBlob,        
8880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8890: 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 6c 6f 62  UT: Size of blob
88a0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a   data */.  int *
88b0: 70 6e 4c 6f 61 64 20 20 20 20 20 20 20 20 20 20  pnLoad          
88c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
88d0: 54 3a 20 42 79 74 65 73 20 61 63 74 75 61 6c 6c  T: Bytes actuall
88e0: 79 20 6c 6f 61 64 65 64 20 2a 2f 0a 29 7b 0a 20  y loaded */.){. 
88f0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8920: 2a 2f 0a 0a 20 20 2f 2a 20 70 6e 42 6c 6f 62 20  */..  /* pnBlob 
8930: 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  must be non-NULL
8940: 2e 20 70 61 42 6c 6f 62 20 6d 61 79 20 62 65 20  . paBlob may be 
8950: 4e 55 4c 4c 20 6f 72 20 6e 6f 6e 2d 4e 55 4c 4c  NULL or non-NULL
8960: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
8970: 6e 42 6c 6f 62 29 3b 0a 0a 20 20 69 66 28 20 70  nBlob);..  if( p
8980: 2d 3e 70 53 65 67 6d 65 6e 74 73 20 29 7b 0a 20  ->pSegments ){. 
8990: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
89a0: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 2d 3e 70  blob_reopen(p->p
89b0: 53 65 67 6d 65 6e 74 73 2c 20 69 42 6c 6f 63 6b  Segments, iBlock
89c0: 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  id);.  }else{.  
89d0: 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67    if( 0==p->zSeg
89e0: 6d 65 6e 74 73 54 62 6c 20 29 7b 0a 20 20 20 20  mentsTbl ){.    
89f0: 20 20 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62    p->zSegmentsTb
8a00: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
8a10: 6e 74 66 28 22 25 73 5f 73 65 67 6d 65 6e 74 73  ntf("%s_segments
8a20: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
8a30: 20 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53      if( 0==p->zS
8a40: 65 67 6d 65 6e 74 73 54 62 6c 20 29 20 72 65 74  egmentsTbl ) ret
8a50: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8a60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
8a70: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
8a80: 65 6e 28 0a 20 20 20 20 20 20 20 70 2d 3e 64 62  en(.       p->db
8a90: 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 53 65  , p->zDb, p->zSe
8aa0: 67 6d 65 6e 74 73 54 62 6c 2c 20 22 62 6c 6f 63  gmentsTbl, "bloc
8ab0: 6b 22 2c 20 69 42 6c 6f 63 6b 69 64 2c 20 30 2c  k", iBlockid, 0,
8ac0: 20 26 70 2d 3e 70 53 65 67 6d 65 6e 74 73 0a 20   &p->pSegments. 
8ad0: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28     );.  }..  if(
8ae0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8af0: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
8b00: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62  = sqlite3_blob_b
8b10: 79 74 65 73 28 70 2d 3e 70 53 65 67 6d 65 6e 74  ytes(p->pSegment
8b20: 73 29 3b 0a 20 20 20 20 2a 70 6e 42 6c 6f 62 20  s);.    *pnBlob 
8b30: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28  = nByte;.    if(
8b40: 20 70 61 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20   paBlob ){.     
8b50: 20 63 68 61 72 20 2a 61 42 79 74 65 20 3d 20 73   char *aByte = s
8b60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
8b70: 79 74 65 20 2b 20 46 54 53 33 5f 4e 4f 44 45 5f  yte + FTS3_NODE_
8b80: 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 20 20  PADDING);.      
8b90: 69 66 28 20 21 61 42 79 74 65 20 29 7b 0a 20 20  if( !aByte ){.  
8ba0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8bb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
8bc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
8bd0: 28 20 70 6e 4c 6f 61 64 20 26 26 20 6e 42 79 74  ( pnLoad && nByt
8be0: 65 3e 28 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55  e>(FTS3_NODE_CHU
8bf0: 4e 4b 5f 54 48 52 45 53 48 4f 4c 44 29 20 29 7b  NK_THRESHOLD) ){
8c00: 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65  .          nByte
8c10: 20 3d 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55   = FTS3_NODE_CHU
8c20: 4e 4b 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  NKSIZE;.        
8c30: 20 20 2a 70 6e 4c 6f 61 64 20 3d 20 6e 42 79 74    *pnLoad = nByt
8c40: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
8c50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8c60: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70  3_blob_read(p->p
8c70: 53 65 67 6d 65 6e 74 73 2c 20 61 42 79 74 65 2c  Segments, aByte,
8c80: 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20   nByte, 0);.    
8c90: 20 20 20 20 6d 65 6d 73 65 74 28 26 61 42 79 74      memset(&aByt
8ca0: 65 5b 6e 42 79 74 65 5d 2c 20 30 2c 20 46 54 53  e[nByte], 0, FTS
8cb0: 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b  3_NODE_PADDING);
8cc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
8cd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8ce0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8cf0: 66 72 65 65 28 61 42 79 74 65 29 3b 0a 20 20 20  free(aByte);.   
8d00: 20 20 20 20 20 20 20 61 42 79 74 65 20 3d 20 30         aByte = 0
8d10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8d20: 20 20 7d 0a 20 20 20 20 20 20 2a 70 61 42 6c 6f    }.      *paBlo
8d30: 62 20 3d 20 61 42 79 74 65 3b 0a 20 20 20 20 7d  b = aByte;.    }
8d40: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
8d50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
8d60: 65 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c  e the blob handl
8d70: 65 20 61 74 20 70 2d 3e 70 53 65 67 6d 65 6e 74  e at p->pSegment
8d80: 73 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  s, if it is open
8d90: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
8da0: 62 6f 76 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69  bove.** the sqli
8db0: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
8dc0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
8dd0: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64  details..*/.void
8de0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d   sqlite3Fts3Segm
8df0: 65 6e 74 73 43 6c 6f 73 65 28 46 74 73 33 54 61  entsClose(Fts3Ta
8e00: 62 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  ble *p){.  sqlit
8e10: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d  e3_blob_close(p-
8e20: 3e 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20 20 70  >pSegments);.  p
8e30: 2d 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b  ->pSegments = 0;
8e40: 0a 7d 0a 20 20 20 20 0a 73 74 61 74 69 63 20 69  .}.    .static i
8e50: 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
8e60: 49 6e 63 72 52 65 61 64 28 46 74 73 33 53 65 67  IncrRead(Fts3Seg
8e70: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29  Reader *pReader)
8e80: 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  {.  int nRead;  
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8eb0: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
8ec0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
8ef0: 64 65 20 2a 2f 0a 0a 20 20 6e 52 65 61 64 20 3d  de */..  nRead =
8f00: 20 4d 49 4e 28 70 52 65 61 64 65 72 2d 3e 6e 4e   MIN(pReader->nN
8f10: 6f 64 65 20 2d 20 70 52 65 61 64 65 72 2d 3e 6e  ode - pReader->n
8f20: 50 6f 70 75 6c 61 74 65 2c 20 46 54 53 33 5f 4e  Populate, FTS3_N
8f30: 4f 44 45 5f 43 48 55 4e 4b 53 49 5a 45 29 3b 0a  ODE_CHUNKSIZE);.
8f40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
8f50: 6c 6f 62 5f 72 65 61 64 28 0a 20 20 20 20 20 20  lob_read(.      
8f60: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 2c 20  pReader->pBlob, 
8f70: 0a 20 20 20 20 20 20 26 70 52 65 61 64 65 72 2d  .      &pReader-
8f80: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
8f90: 6e 50 6f 70 75 6c 61 74 65 5d 2c 0a 20 20 20 20  nPopulate],.    
8fa0: 20 20 6e 52 65 61 64 2c 0a 20 20 20 20 20 20 70    nRead,.      p
8fb0: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
8fc0: 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  e.  );..  if( rc
8fd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8fe0: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70     pReader->nPop
8ff0: 75 6c 61 74 65 20 2b 3d 20 6e 52 65 61 64 3b 0a  ulate += nRead;.
9000: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61      memset(&pRea
9010: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
9020: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c 20  er->nPopulate], 
9030: 30 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44  0, FTS3_NODE_PAD
9040: 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70  DING);.    if( p
9050: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
9060: 65 3d 3d 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  e==pReader->nNod
9070: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
9080: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52  e3_blob_close(pR
9090: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20  eader->pBlob);. 
90a0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42       pReader->pB
90b0: 6c 6f 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  lob = 0;.      p
90c0: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
90d0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
90e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
90f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
9100: 53 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65  SegReaderRequire
9110: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
9120: 70 52 65 61 64 65 72 2c 20 63 68 61 72 20 2a 70  pReader, char *p
9130: 46 72 6f 6d 2c 20 69 6e 74 20 6e 42 79 74 65 29  From, int nByte)
9140: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
9150: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
9160: 28 20 21 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f  ( !pReader->pBlo
9170: 62 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 46  b .       || (pF
9180: 72 6f 6d 3e 3d 70 52 65 61 64 65 72 2d 3e 61 4e  rom>=pReader->aN
9190: 6f 64 65 20 26 26 20 70 46 72 6f 6d 3c 26 70 52  ode && pFrom<&pR
91a0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
91b0: 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 29 0a 20 20  ader->nNode]).  
91c0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 65 61  );.  while( pRea
91d0: 64 65 72 2d 3e 70 42 6c 6f 62 20 26 26 20 72 63  der->pBlob && rc
91e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
91f0: 20 20 26 26 20 20 28 70 46 72 6f 6d 20 2d 20 70    &&  (pFrom - p
9200: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 2b 20  Reader->aNode + 
9210: 6e 42 79 74 65 29 3e 70 52 65 61 64 65 72 2d 3e  nByte)>pReader->
9220: 6e 50 6f 70 75 6c 61 74 65 0a 20 20 29 7b 0a 20  nPopulate.  ){. 
9230: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
9240: 65 61 64 65 72 49 6e 63 72 52 65 61 64 28 70 52  eaderIncrRead(pR
9250: 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  eader);.  }.  re
9260: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9270: 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
9280: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
9290: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
92a0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72   to the next ter
92b0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 73 65 67 6d  m in the.** segm
92c0: 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73 73 66  ent. If successf
92d0: 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
92e0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
92f0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 74  ere is no next t
9300: 65 72 6d 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  erm,.** SQLITE_D
9310: 4f 4e 45 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ONE. Otherwise, 
9320: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
9330: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
9340: 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65  int fts3SegReade
9350: 72 4e 65 78 74 28 0a 20 20 46 74 73 33 54 61 62  rNext(.  Fts3Tab
9360: 6c 65 20 2a 70 2c 20 0a 20 20 46 74 73 33 53 65  le *p, .  Fts3Se
9370: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
9380: 2c 0a 20 20 69 6e 74 20 62 49 6e 63 72 0a 29 7b  ,.  int bIncr.){
9390: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
93c0: 65 20 6f 66 20 76 61 72 69 6f 75 73 20 73 75 62  e of various sub
93d0: 2d 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 63  -routines */.  c
93e0: 68 61 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  har *pNext;     
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9400: 2a 20 43 75 72 73 6f 72 20 76 61 72 69 61 62 6c  * Cursor variabl
9410: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  e */.  int nPref
9420: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
9430: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9440: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 65 72   of bytes in ter
9450: 6d 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  m prefix */.  in
9460: 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20  t nSuffix;      
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9480: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
9490: 20 69 6e 20 74 65 72 6d 20 73 75 66 66 69 78 20   in term suffix 
94a0: 2a 2f 0a 0a 20 20 69 66 28 20 21 70 52 65 61 64  */..  if( !pRead
94b0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29 7b 0a  er->aDoclist ){.
94c0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61      pNext = pRea
94d0: 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 65  der->aNode;.  }e
94e0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  lse{.    pNext =
94f0: 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c   &pReader->aDocl
9500: 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f  ist[pReader->nDo
9510: 63 6c 69 73 74 5d 3b 0a 20 20 7d 0a 0a 20 20 69  clist];.  }..  i
9520: 66 28 20 21 70 4e 65 78 74 20 7c 7c 20 70 4e 65  f( !pNext || pNe
9530: 78 74 3e 3d 26 70 52 65 61 64 65 72 2d 3e 61 4e  xt>=&pReader->aN
9540: 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f  ode[pReader->nNo
9550: 64 65 5d 20 29 7b 0a 0a 20 20 20 20 69 66 28 20  de] ){..    if( 
9560: 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
9570: 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29 20  ending(pReader) 
9580: 29 7b 0a 20 20 20 20 20 20 46 74 73 33 48 61 73  ){.      Fts3Has
9590: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d 20 2a  hElem *pElem = *
95a0: 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74  (pReader->ppNext
95b0: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Elem);.      if(
95c0: 20 70 45 6c 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pElem==0 ){.   
95d0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e       pReader->aN
95e0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ode = 0;.      }
95f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 65  else{.        Pe
9600: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
9610: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
9620: 2a 29 66 74 73 33 48 61 73 68 44 61 74 61 28 70  *)fts3HashData(p
9630: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70  Elem);.        p
9640: 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20  Reader->zTerm = 
9650: 28 63 68 61 72 20 2a 29 66 74 73 33 48 61 73 68  (char *)fts3Hash
9660: 4b 65 79 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  Key(pElem);.    
9670: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65      pReader->nTe
9680: 72 6d 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79  rm = fts3HashKey
9690: 73 69 7a 65 28 70 45 6c 65 6d 29 3b 0a 20 20 20  size(pElem);.   
96a0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e       pReader->nN
96b0: 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e 6e  ode = pReader->n
96c0: 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73 74 2d  Doclist = pList-
96d0: 3e 6e 44 61 74 61 20 2b 20 31 3b 0a 20 20 20 20  >nData + 1;.    
96e0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f      pReader->aNo
96f0: 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 44  de = pReader->aD
9700: 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e  oclist = pList->
9710: 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70  aData;.        p
9720: 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c  Reader->ppNextEl
9730: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  em++;.        as
9740: 73 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61  sert( pReader->a
9750: 4e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 7d 0a  Node );.      }.
9760: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9770: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
9780: 20 20 20 69 66 28 20 21 66 74 73 33 53 65 67 52     if( !fts3SegR
9790: 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28  eaderIsRootOnly(
97a0: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
97b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
97c0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a  Reader->aNode);.
97d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
97e0: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
97f0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  ->pBlob);.      
9800: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d  pReader->pBlob =
9810: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52   0;.    }.    pR
9820: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30  eader->aNode = 0
9830: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 43 75  ;..    /* If iCu
9840: 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 69 4c 65 61  rrentBlock>=iLea
9850: 66 45 6e 64 42 6c 6f 63 6b 2c 20 74 68 69 73 20  fEndBlock, this 
9860: 69 73 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74  is an EOF condit
9870: 69 6f 6e 2e 20 41 6c 6c 20 6c 65 61 66 20 0a 20  ion. All leaf . 
9880: 20 20 20 2a 2a 20 62 6c 6f 63 6b 73 20 68 61 76     ** blocks hav
9890: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  e already been t
98a0: 72 61 76 65 72 73 65 64 2e 20 20 2a 2f 0a 20 20  raversed.  */.  
98b0: 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65    assert( pReade
98c0: 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b  r->iCurrentBlock
98d0: 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66  <=pReader->iLeaf
98e0: 45 6e 64 42 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  EndBlock );.    
98f0: 69 66 28 20 70 52 65 61 64 65 72 2d 3e 69 43 75  if( pReader->iCu
9900: 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 70 52 65 61  rrentBlock>=pRea
9910: 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f  der->iLeafEndBlo
9920: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
9930: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9940: 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71    }..    rc = sq
9950: 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f  lite3Fts3ReadBlo
9960: 63 6b 28 0a 20 20 20 20 20 20 20 20 70 2c 20 2b  ck(.        p, +
9970: 2b 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65  +pReader->iCurre
9980: 6e 74 42 6c 6f 63 6b 2c 20 26 70 52 65 61 64 65  ntBlock, &pReade
9990: 72 2d 3e 61 4e 6f 64 65 2c 20 26 70 52 65 61 64  r->aNode, &pRead
99a0: 65 72 2d 3e 6e 4e 6f 64 65 2c 20 0a 20 20 20 20  er->nNode, .    
99b0: 20 20 20 20 28 62 49 6e 63 72 20 3f 20 26 70 52      (bIncr ? &pR
99c0: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
99d0: 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20 20   : 0).    );.   
99e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
99f0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9a00: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61      assert( pRea
9a10: 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 29 3b  der->pBlob==0 );
9a20: 0a 20 20 20 20 69 66 28 20 62 49 6e 63 72 20 26  .    if( bIncr &
9a30: 26 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  & pReader->nPopu
9a40: 6c 61 74 65 3c 70 52 65 61 64 65 72 2d 3e 6e 4e  late<pReader->nN
9a50: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70 52 65  ode ){.      pRe
9a60: 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d 20 70 2d  ader->pBlob = p-
9a70: 3e 70 53 65 67 6d 65 6e 74 73 3b 0a 20 20 20 20  >pSegments;.    
9a80: 20 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20 3d    p->pSegments =
9a90: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e   0;.    }.    pN
9aa0: 65 78 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 61  ext = pReader->a
9ab0: 4e 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Node;.  }..  ass
9ac0: 65 72 74 28 20 21 66 74 73 33 53 65 67 52 65 61  ert( !fts3SegRea
9ad0: 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65  derIsPending(pRe
9ae0: 61 64 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ader) );..  rc =
9af0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65   fts3SegReaderRe
9b00: 71 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70  quire(pReader, p
9b10: 4e 65 78 74 2c 20 46 54 53 33 5f 56 41 52 49 4e  Next, FTS3_VARIN
9b20: 54 5f 4d 41 58 2a 32 29 3b 0a 20 20 69 66 28 20  T_MAX*2);.  if( 
9b30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9b40: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20  return rc;.  .  
9b50: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  /* Because of th
9b60: 65 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  e FTS3_NODE_PADD
9b70: 49 4e 47 20 62 79 74 65 73 20 6f 66 20 70 61 64  ING bytes of pad
9b80: 64 69 6e 67 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ding, the follow
9b90: 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 73 61 66  ing is .  ** saf
9ba0: 65 20 28 6e 6f 20 72 69 73 6b 20 6f 66 20 6f 76  e (no risk of ov
9bb0: 65 72 72 65 61 64 29 20 65 76 65 6e 20 69 66 20  erread) even if 
9bc0: 74 68 65 20 6e 6f 64 65 20 64 61 74 61 20 69 73  the node data is
9bd0: 20 63 6f 72 72 75 70 74 65 64 2e 20 2a 2f 0a 20   corrupted. */. 
9be0: 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65   pNext += sqlite
9bf0: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32  3Fts3GetVarint32
9c00: 28 70 4e 65 78 74 2c 20 26 6e 50 72 65 66 69 78  (pNext, &nPrefix
9c10: 29 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73 71  );.  pNext += sq
9c20: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
9c30: 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 53 75  nt32(pNext, &nSu
9c40: 66 66 69 78 29 3b 0a 20 20 69 66 28 20 6e 50 72  ffix);.  if( nPr
9c50: 65 66 69 78 3c 30 20 7c 7c 20 6e 53 75 66 66 69  efix<0 || nSuffi
9c60: 78 3c 3d 30 20 0a 20 20 20 7c 7c 20 26 70 4e 65  x<=0 .   || &pNe
9c70: 78 74 5b 6e 53 75 66 66 69 78 5d 3e 26 70 52 65  xt[nSuffix]>&pRe
9c80: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
9c90: 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 29  der->nNode] .  )
9ca0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54 53  {.    return FTS
9cb0: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20  _CORRUPT_VTAB;. 
9cc0: 20 7d 0a 0a 20 20 69 66 28 20 6e 50 72 65 66 69   }..  if( nPrefi
9cd0: 78 2b 6e 53 75 66 66 69 78 3e 70 52 65 61 64 65  x+nSuffix>pReade
9ce0: 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 29 7b  r->nTermAlloc ){
9cf0: 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
9d00: 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78  (nPrefix+nSuffix
9d10: 29 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  )*2;.    char *z
9d20: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
9d30: 61 6c 6c 6f 63 28 70 52 65 61 64 65 72 2d 3e 7a  alloc(pReader->z
9d40: 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  Term, nNew);.   
9d50: 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20   if( !zNew ){.  
9d60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9d70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
9d80: 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65 72     pReader->zTer
9d90: 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 70 52  m = zNew;.    pR
9da0: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f  eader->nTermAllo
9db0: 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a 20  c = nNew;.  }.. 
9dc0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
9dd0: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
9de0: 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66 66  er, pNext, nSuff
9df0: 69 78 2b 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  ix+FTS3_VARINT_M
9e00: 41 58 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  AX);.  if( rc!=S
9e10: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
9e20: 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  n rc;..  memcpy(
9e30: 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 5b  &pReader->zTerm[
9e40: 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78 74 2c  nPrefix], pNext,
9e50: 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 52 65   nSuffix);.  pRe
9e60: 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 50  ader->nTerm = nP
9e70: 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a 20  refix+nSuffix;. 
9e80: 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66 69   pNext += nSuffi
9e90: 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73 71  x;.  pNext += sq
9ea0: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
9eb0: 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 70 52 65  nt32(pNext, &pRe
9ec0: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b  ader->nDoclist);
9ed0: 0a 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  .  pReader->aDoc
9ee0: 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  list = pNext;.  
9ef0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
9f00: 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  List = 0;..  /* 
9f10: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 64  Check that the d
9f20: 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20  oclist does not 
9f30: 61 70 70 65 61 72 20 74 6f 20 65 78 74 65 6e 64  appear to extend
9f40: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
9f50: 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65   the.  ** b-tree
9f60: 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68 61 74 20   node. And that 
9f70: 74 68 65 20 66 69 6e 61 6c 20 62 79 74 65 20 6f  the final byte o
9f80: 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73  f the doclist is
9f90: 20 30 78 30 30 2e 20 49 66 20 65 69 74 68 65 72   0x00. If either
9fa0: 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20   .  ** of these 
9fb0: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 75 6e  statements is un
9fc0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
9fd0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
9fe0: 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a 20   corrupt..  */. 
9ff0: 20 69 66 28 20 26 70 52 65 61 64 65 72 2d 3e 61   if( &pReader->a
a000: 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d  Doclist[pReader-
a010: 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70 52 65 61  >nDoclist]>&pRea
a020: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
a030: 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 20 7c  er->nNode] .   |
a040: 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  | (pReader->nPop
a050: 75 6c 61 74 65 3d 3d 30 20 26 26 20 70 52 65 61  ulate==0 && pRea
a060: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52  der->aDoclist[pR
a070: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2d  eader->nDoclist-
a080: 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  1]).  ){.    ret
a090: 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f  urn FTS_CORRUPT_
a0a0: 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  VTAB;.  }.  retu
a0b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a0c0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 53  ./*.** Set the S
a0d0: 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e  egReader to poin
a0e0: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 64  t to the first d
a0f0: 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  ocid in the docl
a100: 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ist associated.*
a110: 2a 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  * with the curre
a120: 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  nt term..*/.stat
a130: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
a140: 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 46  aderFirstDocid(F
a150: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
a160: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
a170: 52 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 72  Reader){.  int r
a180: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a190: 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72   assert( pReader
a1a0: 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20  ->aDoclist );.  
a1b0: 61 73 73 65 72 74 28 20 21 70 52 65 61 64 65 72  assert( !pReader
a1c0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29 3b  ->pOffsetList );
a1d0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65  .  if( pTab->bDe
a1e0: 73 63 49 64 78 20 26 26 20 66 74 73 33 53 65 67  scIdx && fts3Seg
a1f0: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
a200: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
a210: 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20  u8 bEof = 0;.   
a220: 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64   pReader->iDocid
a230: 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64 65   = 0;.    pReade
a240: 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->nOffsetList =
a250: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   0;.    sqlite3F
a260: 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 30  ts3DoclistPrev(0
a270: 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ,.        pReade
a280: 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52 65  r->aDoclist, pRe
a290: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20  ader->nDoclist, 
a2a0: 26 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65  &pReader->pOffse
a2b0: 74 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20  tList, .        
a2c0: 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64  &pReader->iDocid
a2d0: 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66  , &pReader->nOff
a2e0: 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a 20  setList, &bEof. 
a2f0: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
a300: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
a310: 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65  eaderRequire(pRe
a320: 61 64 65 72 2c 20 70 52 65 61 64 65 72 2d 3e 61  ader, pReader->a
a330: 44 6f 63 6c 69 73 74 2c 20 46 54 53 33 5f 56 41  Doclist, FTS3_VA
a340: 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 69  RINT_MAX);.    i
a350: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a360: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
a370: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
a380: 56 61 72 69 6e 74 28 70 52 65 61 64 65 72 2d 3e  Varint(pReader->
a390: 61 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61 64  aDoclist, &pRead
a3a0: 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20 20  er->iDocid);.   
a3b0: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66     pReader->pOff
a3c0: 73 65 74 4c 69 73 74 20 3d 20 26 70 52 65 61 64  setList = &pRead
a3d0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e 5d 3b  er->aDoclist[n];
a3e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a3f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a400: 20 41 64 76 61 6e 63 65 20 74 68 65 20 53 65 67   Advance the Seg
a410: 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20  Reader to point 
a420: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69  to the next doci
a430: 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
a440: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
a450: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
a460: 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  term..** .** If 
a470: 61 72 67 75 6d 65 6e 74 73 20 70 70 4f 66 66 73  arguments ppOffs
a480: 65 74 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66 66  etList and pnOff
a490: 73 65 74 4c 69 73 74 20 61 72 65 20 6e 6f 74 20  setList are not 
a4a0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20 2a  NULL, then .** *
a4b0: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20  ppOffsetList is 
a4c0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
a4d0: 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
a4e0: 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a 20  -offset list.** 
a4f0: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 65  in the doclist e
a500: 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65 64  ntry (i.e. immed
a510: 69 61 74 65 6c 79 20 70 61 73 74 20 74 68 65 20  iately past the 
a520: 64 6f 63 69 64 20 76 61 72 69 6e 74 29 2e 0a 2a  docid varint)..*
a530: 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20  * *pnOffsetList 
a540: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 65  is set to the le
a550: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 74 20  ngth of the set 
a560: 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74  of column-offset
a570: 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20 69  .** lists, not i
a580: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 75 6c  ncluding the nul
a590: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
a5a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  . For example:.*
a5b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
a5c0: 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f  3SegReaderNextDo
a5d0: 63 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65  cid(.  Fts3Table
a5e0: 20 2a 70 54 61 62 2c 0a 20 20 46 74 73 33 53 65   *pTab,.  Fts3Se
a5f0: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
a600: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61  ,         /* Rea
a610: 64 65 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74  der to advance t
a620: 6f 20 6e 65 78 74 20 64 6f 63 69 64 20 2a 2f 0a  o next docid */.
a630: 20 20 63 68 61 72 20 2a 2a 70 70 4f 66 66 73 65    char **ppOffse
a640: 74 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  tList,          
a650: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
a660: 72 20 74 6f 20 63 75 72 72 65 6e 74 20 70 6f 73  r to current pos
a670: 69 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 20 20  ition-list */.  
a680: 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73  int *pnOffsetLis
a690: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
a6a0: 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74 68 20 6f  /* OUT: Length o
a6b0: 66 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20  f *ppOffsetList 
a6c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
a6d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a6e0: 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d  _OK;.  char *p =
a6f0: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
a700: 74 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 63 20  tList;.  char c 
a710: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
a720: 70 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  p );..  if( pTab
a730: 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 66 74  ->bDescIdx && ft
a740: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
a750: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b  ding(pReader) ){
a760: 0a 20 20 20 20 2f 2a 20 41 20 70 65 6e 64 69 6e  .    /* A pendin
a770: 67 2d 74 65 72 6d 73 20 73 65 67 2d 72 65 61 64  g-terms seg-read
a780: 65 72 20 66 6f 72 20 61 6e 20 46 54 53 34 20 74  er for an FTS4 t
a790: 61 62 6c 65 20 74 68 61 74 20 75 73 65 73 20 6f  able that uses o
a7a0: 72 64 65 72 3d 64 65 73 63 2e 0a 20 20 20 20 2a  rder=desc..    *
a7b0: 2a 20 50 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  * Pending-terms 
a7c0: 64 6f 63 6c 69 73 74 73 20 61 72 65 20 61 6c 77  doclists are alw
a7d0: 61 79 73 20 62 75 69 6c 74 20 75 70 20 69 6e 20  ays built up in 
a7e0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c  ascending order,
a7f0: 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 68 61   so.    ** we ha
a800: 76 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ve to iterate th
a810: 72 6f 75 67 68 20 74 68 65 6d 20 62 61 63 6b 77  rough them backw
a820: 61 72 64 73 20 68 65 72 65 2e 20 2a 2f 0a 20 20  ards here. */.  
a830: 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20    u8 bEof = 0;. 
a840: 20 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c     if( ppOffsetL
a850: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ist ){.      *pp
a860: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65  OffsetList = pRe
a870: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
a880: 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73  t;.      *pnOffs
a890: 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72  etList = pReader
a8a0: 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 2d 20  ->nOffsetList - 
a8b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
a8c0: 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50  ite3Fts3DoclistP
a8d0: 72 65 76 28 30 2c 0a 20 20 20 20 20 20 20 20 70  rev(0,.        p
a8e0: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
a8f0: 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c  , pReader->nDocl
a900: 69 73 74 2c 20 26 70 2c 20 26 70 52 65 61 64 65  ist, &p, &pReade
a910: 72 2d 3e 69 44 6f 63 69 64 2c 0a 20 20 20 20 20  r->iDocid,.     
a920: 20 20 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66     &pReader->nOf
a930: 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a  fsetList, &bEof.
a940: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 62      );.    if( b
a950: 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Eof ){.      pRe
a960: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
a970: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
a980: 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d  {.      pReader-
a990: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70  >pOffsetList = p
a9a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
a9b0: 0a 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20  .    char *pEnd 
a9c0: 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  = &pReader->aDoc
a9d0: 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44  list[pReader->nD
a9e0: 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 2f 2a  oclist];..    /*
a9f0: 20 50 6f 69 6e 74 65 72 20 70 20 63 75 72 72 65   Pointer p curre
aa00: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20 74  ntly points at t
aa10: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
aa20: 20 61 6e 20 6f 66 66 73 65 74 20 6c 69 73 74 2e   an offset list.
aa30: 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
aa40: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 61 64 76 61  owing block adva
aa50: 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69 6e 74  nces it to point
aa60: 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20 74   one byte past t
aa70: 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
aa80: 20 74 68 65 20 73 61 6d 65 20 6f 66 66 73 65 74   the same offset
aa90: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 77 68   list. */.    wh
aaa0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 0a 20 20 20  ile( 1 ){.  .   
aab0: 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
aac0: 69 6e 67 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65  ing line of code
aad0: 20 28 61 6e 64 20 74 68 65 20 22 70 2b 2b 22 20   (and the "p++" 
aae0: 62 65 6c 6f 77 20 74 68 65 20 77 68 69 6c 65 28  below the while(
aaf0: 29 20 6c 6f 6f 70 29 20 69 73 0a 20 20 20 20 20  ) loop) is.     
ab00: 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 6c 6c   ** normally all
ab10: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
ab20: 64 20 74 6f 20 6d 6f 76 65 20 70 6f 69 6e 74 65  d to move pointe
ab30: 72 20 70 20 74 6f 20 74 68 65 20 64 65 73 69 72  r p to the desir
ab40: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  ed .      ** pos
ab50: 69 74 69 6f 6e 2e 20 54 68 65 20 65 78 63 65 70  ition. The excep
ab60: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 69 73 20  tion is if this 
ab70: 6e 6f 64 65 20 69 73 20 62 65 69 6e 67 20 6c 6f  node is being lo
ab80: 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 0a 20  aded from disk. 
ab90: 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
aba0: 74 61 6c 6c 79 20 61 6e 64 20 70 6f 69 6e 74 65  tally and pointe
abb0: 72 20 22 70 22 20 6e 6f 77 20 70 6f 69 6e 74 73  r "p" now points
abc0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
abd0: 74 65 20 70 61 73 73 65 64 0a 20 20 20 20 20 20  te passed.      
abe0: 2a 2a 20 74 68 65 20 70 6f 70 75 6c 61 74 65 64  ** the populated
abf0: 20 70 61 72 74 20 6f 66 20 70 52 65 61 64 65 72   part of pReader
ac00: 2d 3e 61 4e 6f 64 65 5b 5d 2e 0a 20 20 20 20 20  ->aNode[]..     
ac10: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
ac20: 20 2a 70 20 7c 20 63 20 29 20 63 20 3d 20 2a 70   *p | c ) c = *p
ac30: 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 20  ++ & 0x80;.     
ac40: 20 61 73 73 65 72 74 28 20 2a 70 3d 3d 30 20 29   assert( *p==0 )
ac50: 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 70  ;.  .      if( p
ac60: 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30  Reader->pBlob==0
ac70: 20 7c 7c 20 70 3c 26 70 52 65 61 64 65 72 2d 3e   || p<&pReader->
ac80: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
ac90: 50 6f 70 75 6c 61 74 65 5d 20 29 20 62 72 65 61  Populate] ) brea
aca0: 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  k;.      rc = ft
acb0: 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72 52  s3SegReaderIncrR
acc0: 65 61 64 28 70 52 65 61 64 65 72 29 3b 0a 20 20  ead(pReader);.  
acd0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ace0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
acf0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2b 2b  c;.    }.    p++
ad00: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 72  ;.  .    /* If r
ad10: 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
ad20: 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  e the output var
ad30: 69 61 62 6c 65 73 20 77 69 74 68 20 61 20 70 6f  iables with a po
ad40: 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65  inter to and the
ad50: 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
ad60: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 66 66  the previous off
ad70: 73 65 74 2d 6c 69 73 74 2e 0a 20 20 20 20 2a 2f  set-list..    */
ad80: 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66 73 65  .    if( ppOffse
ad90: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a  tList ){.      *
ada0: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70  ppOffsetList = p
adb0: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
adc0: 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66  ist;.      *pnOf
add0: 66 73 65 74 4c 69 73 74 20 3d 20 28 69 6e 74 29  fsetList = (int)
ade0: 28 70 20 2d 20 70 52 65 61 64 65 72 2d 3e 70 4f  (p - pReader->pO
adf0: 66 66 73 65 74 4c 69 73 74 20 2d 20 31 29 3b 0a  ffsetList - 1);.
ae00: 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65      }..    while
ae10: 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 3d 3d  ( p<pEnd && *p==
ae20: 30 20 29 20 70 2b 2b 3b 0a 20 20 0a 20 20 20 20  0 ) p++;.  .    
ae30: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
ae40: 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 20  no more entries 
ae50: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20  in the doclist, 
ae60: 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73 74 20  set pOffsetList 
ae70: 74 6f 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 20  to.    ** NULL. 
ae80: 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 46  Otherwise, set F
ae90: 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 44 6f  ts3SegReader.iDo
aea0: 63 69 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  cid to the next 
aeb0: 64 6f 63 69 64 20 61 6e 64 0a 20 20 20 20 2a 2a  docid and.    **
aec0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 70   Fts3SegReader.p
aed0: 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 20 70 6f  OffsetList to po
aee0: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
aef0: 6f 66 66 73 65 74 20 6c 69 73 74 20 62 65 66 6f  offset list befo
af00: 72 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  re.    ** return
af10: 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
af20: 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 7b 0a 20  if( p>=pEnd ){. 
af30: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f       pReader->pO
af40: 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20  ffsetList = 0;. 
af50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
af60: 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
af70: 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64 65  erRequire(pReade
af80: 72 2c 20 70 2c 20 46 54 53 33 5f 56 41 52 49 4e  r, p, FTS3_VARIN
af90: 54 5f 4d 41 58 29 3b 0a 20 20 20 20 20 20 69 66  T_MAX);.      if
afa0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
afb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
afc0: 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b  e3_int64 iDelta;
afd0: 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72  .        pReader
afe0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
aff0: 70 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 47  p + sqlite3Fts3G
b000: 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69 44 65  etVarint(p, &iDe
b010: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lta);.        if
b020: 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78  ( pTab->bDescIdx
b030: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
b040: 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2d 3d  eader->iDocid -=
b050: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20   iDelta;.       
b060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b070: 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69    pReader->iDoci
b080: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
b090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b0a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
b0b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b0c0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
b0d0: 33 4d 73 72 4f 76 66 6c 28 0a 20 20 46 74 73 33  3MsrOvfl(.  Fts3
b0e0: 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20  Cursor *pCsr, . 
b0f0: 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
b100: 64 65 72 20 2a 70 4d 73 72 2c 0a 20 20 69 6e 74  der *pMsr,.  int
b110: 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a 20 20 46 74   *pnOvfl.){.  Ft
b120: 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
b130: 73 33 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62  s3Table*)pCsr->b
b140: 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e 74  ase.pVtab;.  int
b150: 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e   nOvfl = 0;.  in
b160: 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ii;.  int rc =
b170: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
b180: 74 20 70 67 73 7a 20 3d 20 70 2d 3e 6e 50 67 73  t pgsz = p->nPgs
b190: 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  z;..  assert( p-
b1a0: 3e 62 48 61 73 53 74 61 74 20 29 3b 0a 20 20 61  >bHasStat );.  a
b1b0: 73 73 65 72 74 28 20 70 67 73 7a 3e 30 20 29 3b  ssert( pgsz>0 );
b1c0: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63  ..  for(ii=0; rc
b1d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
b1e0: 69 3c 70 4d 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  i<pMsr->nSegment
b1f0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  ; ii++){.    Fts
b200: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
b210: 64 65 72 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65  der = pMsr->apSe
b220: 67 6d 65 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  gment[ii];.    i
b230: 66 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65  f( !fts3SegReade
b240: 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64  rIsPending(pRead
b250: 65 72 29 20 0a 20 20 20 20 20 26 26 20 21 66 74  er) .     && !ft
b260: 73 33 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f  s3SegReaderIsRoo
b270: 74 4f 6e 6c 79 28 70 52 65 61 64 65 72 29 20 0a  tOnly(pReader) .
b280: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
b290: 69 74 65 33 5f 69 6e 74 36 34 20 6a 6a 3b 0a 20  ite3_int64 jj;. 
b2a0: 20 20 20 20 20 66 6f 72 28 6a 6a 3d 70 52 65 61       for(jj=pRea
b2b0: 64 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b  der->iStartBlock
b2c0: 3b 20 6a 6a 3c 3d 70 52 65 61 64 65 72 2d 3e 69  ; jj<=pReader->i
b2d0: 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 3b 20 6a 6a  LeafEndBlock; jj
b2e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
b2f0: 20 6e 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20   nBlob;.        
b300: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
b310: 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 6a 6a 2c  ReadBlock(p, jj,
b320: 20 30 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a   0, &nBlob, 0);.
b330: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
b340: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
b350: 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  k;.        if( (
b360: 6e 42 6c 6f 62 2b 33 35 29 3e 70 67 73 7a 20 29  nBlob+35)>pgsz )
b370: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 66  {.          nOvf
b380: 6c 20 2b 3d 20 28 6e 42 6c 6f 62 20 2b 20 33 34  l += (nBlob + 34
b390: 29 2f 70 67 73 7a 3b 0a 20 20 20 20 20 20 20 20  )/pgsz;.        
b3a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b3b0: 20 20 7d 0a 20 20 2a 70 6e 4f 76 66 6c 20 3d 20    }.  *pnOvfl = 
b3c0: 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20  nOvfl;.  return 
b3d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
b3e0: 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e  e all allocation
b3f0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
b400: 68 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  h the iterator p
b410: 61 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a  assed as the .**
b420: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b430: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b440: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72  3Fts3SegReaderFr
b450: 65 65 28 46 74 73 33 53 65 67 52 65 61 64 65 72  ee(Fts3SegReader
b460: 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69 66   *pReader){.  if
b470: 28 20 70 52 65 61 64 65 72 20 26 26 20 21 66 74  ( pReader && !ft
b480: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
b490: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b  ding(pReader) ){
b4a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b4b0: 65 28 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d  e(pReader->zTerm
b4c0: 29 3b 0a 20 20 20 20 69 66 28 20 21 66 74 73 33  );.    if( !fts3
b4d0: 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f  SegReaderIsRootO
b4e0: 6e 6c 79 28 70 52 65 61 64 65 72 29 20 29 7b 0a  nly(pReader) ){.
b4f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
b500: 65 65 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  ee(pReader->aNod
b510: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
b520: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65  3_blob_close(pRe
b530: 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  ader->pBlob);.  
b540: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
b550: 33 5f 66 72 65 65 28 70 52 65 61 64 65 72 29 3b  3_free(pReader);
b560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
b570: 74 65 20 61 20 6e 65 77 20 53 65 67 52 65 61 64  te a new SegRead
b580: 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e  er object..*/.in
b590: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
b5a0: 52 65 61 64 65 72 4e 65 77 28 0a 20 20 69 6e 74  ReaderNew(.  int
b5b0: 20 69 41 67 65 2c 20 20 20 20 20 20 20 20 20 20   iAge,          
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b5d0: 53 65 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a  Segment "age". *
b5e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
b5f0: 34 20 69 53 74 61 72 74 4c 65 61 66 2c 20 20 20  4 iStartLeaf,   
b600: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61      /* First lea
b610: 66 20 74 6f 20 74 72 61 76 65 72 73 65 20 2a 2f  f to traverse */
b620: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
b630: 20 69 45 6e 64 4c 65 61 66 2c 20 20 20 20 20 20   iEndLeaf,      
b640: 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6c 65 61 66     /* Final leaf
b650: 20 74 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a   to traverse */.
b660: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
b670: 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20  iEndBlock,      
b680: 20 20 2f 2a 20 46 69 6e 61 6c 20 62 6c 6f 63 6b    /* Final block
b690: 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   of segment */. 
b6a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f   const char *zRo
b6b0: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
b6c0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
b6d0: 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20  ining root node 
b6e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20  */.  int nRoot, 
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b710: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
b720: 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20  g root node */. 
b730: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
b740: 2a 70 70 52 65 61 64 65 72 20 20 20 20 20 20 20  *ppReader       
b750: 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74   /* OUT: Allocat
b760: 65 64 20 46 74 73 33 53 65 67 52 65 61 64 65 72  ed Fts3SegReader
b770: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
b780: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
b790: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
b7a0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
b7b0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
b7c0: 64 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  der;         /* 
b7d0: 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
b7e0: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
b7f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
b800: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b810: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
b820: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65 67 6d 65  o allocate segme
b830: 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  nt root node */.
b840: 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
b850: 74 4c 65 61 66 3c 3d 69 45 6e 64 4c 65 61 66 20  tLeaf<=iEndLeaf 
b860: 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 4c  );.  if( iStartL
b870: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 45  eaf==0 ){.    nE
b880: 78 74 72 61 20 3d 20 6e 52 6f 6f 74 20 2b 20 46  xtra = nRoot + F
b890: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
b8a0: 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 61 64 65 72  ;.  }..  pReader
b8b0: 20 3d 20 28 46 74 73 33 53 65 67 52 65 61 64 65   = (Fts3SegReade
b8c0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
b8d0: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 53 65  oc(sizeof(Fts3Se
b8e0: 67 52 65 61 64 65 72 29 20 2b 20 6e 45 78 74 72  gReader) + nExtr
b8f0: 61 29 3b 0a 20 20 69 66 28 20 21 70 52 65 61 64  a);.  if( !pRead
b900: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
b910: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
b920: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 52 65 61   }.  memset(pRea
b930: 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  der, 0, sizeof(F
b940: 74 73 33 53 65 67 52 65 61 64 65 72 29 29 3b 0a  ts3SegReader));.
b950: 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78 20    pReader->iIdx 
b960: 3d 20 69 41 67 65 3b 0a 20 20 70 52 65 61 64 65  = iAge;.  pReade
b970: 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d  r->iStartBlock =
b980: 20 69 53 74 61 72 74 4c 65 61 66 3b 0a 20 20 70   iStartLeaf;.  p
b990: 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64  Reader->iLeafEnd
b9a0: 42 6c 6f 63 6b 20 3d 20 69 45 6e 64 4c 65 61 66  Block = iEndLeaf
b9b0: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 45 6e  ;.  pReader->iEn
b9c0: 64 42 6c 6f 63 6b 20 3d 20 69 45 6e 64 42 6c 6f  dBlock = iEndBlo
b9d0: 63 6b 3b 0a 0a 20 20 69 66 28 20 6e 45 78 74 72  ck;..  if( nExtr
b9e0: 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  a ){.    /* The 
b9f0: 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 20 69  entire segment i
ba00: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
ba10: 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20  root node. */.  
ba20: 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65    pReader->aNode
ba30: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52 65 61   = (char *)&pRea
ba40: 64 65 72 5b 31 5d 3b 0a 20 20 20 20 70 52 65 61  der[1];.    pRea
ba50: 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 52 6f  der->nNode = nRo
ba60: 6f 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ot;.    memcpy(p
ba70: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 7a  Reader->aNode, z
ba80: 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20  Root, nRoot);.  
ba90: 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64 65    memset(&pReade
baa0: 72 2d 3e 61 4e 6f 64 65 5b 6e 52 6f 6f 74 5d 2c  r->aNode[nRoot],
bab0: 20 30 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41   0, FTS3_NODE_PA
bac0: 44 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 7b  DDING);.  }else{
bad0: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 43  .    pReader->iC
bae0: 75 72 72 65 6e 74 42 6c 6f 63 6b 20 3d 20 69 53  urrentBlock = iS
baf0: 74 61 72 74 4c 65 61 66 2d 31 3b 0a 20 20 7d 0a  tartLeaf-1;.  }.
bb00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
bb10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 52  E_OK ){.    *ppR
bb20: 65 61 64 65 72 20 3d 20 70 52 65 61 64 65 72 3b  eader = pReader;
bb30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
bb40: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
bb50: 65 72 46 72 65 65 28 70 52 65 61 64 65 72 29 3b  erFree(pReader);
bb60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bb70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
bb80: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
bb90: 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 61 73  function used as
bba0: 20 61 20 71 73 6f 72 74 28 29 20 63 61 6c 6c 62   a qsort() callb
bbb0: 61 63 6b 20 77 68 65 6e 20 73 6f 72 74 69 6e 67  ack when sorting
bbc0: 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
bbd0: 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 62 79  pending terms by
bbe0: 20 74 65 72 6d 2e 20 54 68 69 73 20 6f 63 63 75   term. This occu
bbf0: 72 73 20 61 73 20 70 61 72 74 20 6f 66 20 66 6c  rs as part of fl
bc00: 75 73 68 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ushing.** the co
bc10: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65  ntents of the pe
bc20: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
bc30: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61   table to the da
bc40: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
bc50: 63 20 69 6e 74 20 66 74 73 33 43 6f 6d 70 61 72  c int fts3Compar
bc60: 65 45 6c 65 6d 42 79 54 65 72 6d 28 63 6f 6e 73  eElemByTerm(cons
bc70: 74 20 76 6f 69 64 20 2a 6c 68 73 2c 20 63 6f 6e  t void *lhs, con
bc80: 73 74 20 76 6f 69 64 20 2a 72 68 73 29 7b 0a 20  st void *rhs){. 
bc90: 20 63 68 61 72 20 2a 7a 31 20 3d 20 66 74 73 33   char *z1 = fts3
bca0: 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61  HashKey(*(Fts3Ha
bcb0: 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a  shElem **)lhs);.
bcc0: 20 20 63 68 61 72 20 2a 7a 32 20 3d 20 66 74 73    char *z2 = fts
bcd0: 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48  3HashKey(*(Fts3H
bce0: 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b  ashElem **)rhs);
bcf0: 0a 20 20 69 6e 74 20 6e 31 20 3d 20 66 74 73 33  .  int n1 = fts3
bd00: 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74  HashKeysize(*(Ft
bd10: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68  s3HashElem **)lh
bd20: 73 29 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66  s);.  int n2 = f
bd30: 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a  ts3HashKeysize(*
bd40: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
bd50: 29 72 68 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20  )rhs);..  int n 
bd60: 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20  = (n1<n2 ? n1 : 
bd70: 6e 32 29 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d  n2);.  int c = m
bd80: 65 6d 63 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29  emcmp(z1, z2, n)
bd90: 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a  ;.  if( c==0 ){.
bda0: 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b      c = n1 - n2;
bdb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b  .  }.  return c;
bdc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
bdd0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
bde0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 46  to allocate an F
bdf0: 74 73 33 53 65 67 52 65 61 64 65 72 20 74 68 61  ts3SegReader tha
be00: 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
be10: 67 68 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f  gh.** a subset o
be20: 66 20 74 68 65 20 74 65 72 6d 73 20 73 74 6f 72  f the terms stor
be30: 65 64 20 69 6e 20 74 68 65 20 46 74 73 33 54 61  ed in the Fts3Ta
be40: 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73  ble.pendingTerms
be50: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   array..**.** If
be60: 20 74 68 65 20 69 73 50 72 65 66 69 78 49 74 65   the isPrefixIte
be70: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a  r parameter is z
be80: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
be90: 74 75 72 6e 65 64 20 53 65 67 52 65 61 64 65 72  turned SegReader
bea0: 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 74 68 72   iterates.** thr
beb0: 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d 20 69  ough each term i
bec0: 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  n the pending-te
bed0: 72 6d 73 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69  rms table. Or, i
bee0: 66 20 69 73 50 72 65 66 69 78 49 74 65 72 20 69  f isPrefixIter i
bef0: 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  s.** non-zero, i
bf00: 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
bf10: 67 68 20 65 61 63 68 20 74 65 72 6d 20 61 6e 64  gh each term and
bf20: 20 69 74 73 20 70 72 65 66 69 78 65 73 2e 20 46   its prefixes. F
bf30: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
bf40: 2a 20 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65  * the pending te
bf50: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 63  rms hash table c
bf60: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
bf70: 73 20 22 73 71 6c 69 74 65 22 2c 20 22 6d 79 73  s "sqlite", "mys
bf80: 71 6c 22 20 61 6e 64 0a 2a 2a 20 22 66 69 72 65  ql" and.** "fire
bf90: 62 69 72 64 22 2c 20 74 68 65 6e 20 74 68 65 20  bird", then the 
bfa0: 69 74 65 72 61 74 6f 72 20 76 69 73 69 74 73 20  iterator visits 
bfb0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 27 74  the following 't
bfc0: 65 72 6d 73 27 20 28 69 6e 20 74 68 65 20 6f 72  erms' (in the or
bfd0: 64 65 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a 2a  der.** shown):.*
bfe0: 2a 0a 2a 2a 20 20 20 66 20 66 69 20 66 69 72 20  *.**   f fi fir 
bff0: 66 69 72 65 20 66 69 72 65 62 20 66 69 72 65 62  fire fireb fireb
c000: 69 20 66 69 72 65 62 69 72 20 66 69 72 65 62 69  i firebir firebi
c010: 72 64 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d 79 73  rd.**   m my mys
c020: 20 6d 79 73 71 20 6d 79 73 71 6c 0a 2a 2a 20 20   mysq mysql.**  
c030: 20 73 20 73 71 20 73 71 6c 20 73 71 6c 69 20 73   s sq sql sqli s
c040: 71 6c 69 74 20 73 71 6c 69 74 65 0a 2a 2a 0a 2a  qlit sqlite.**.*
c050: 2a 20 57 68 65 72 65 61 73 20 69 66 20 69 73 50  * Whereas if isP
c060: 72 65 66 69 78 49 74 65 72 20 69 73 20 7a 65 72  refixIter is zer
c070: 6f 2c 20 74 68 65 20 74 65 72 6d 73 20 76 69 73  o, the terms vis
c080: 69 74 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ited are:.**.** 
c090: 20 20 66 69 72 65 62 69 72 64 20 6d 79 73 71 6c    firebird mysql
c0a0: 20 73 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20 73   sqlite.*/.int s
c0b0: 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
c0c0: 64 65 72 50 65 6e 64 69 6e 67 28 0a 20 20 46 74  derPending(.  Ft
c0d0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c0f0: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
c100: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
c110: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
c120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c130: 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65  dex for p->aInde
c140: 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
c150: 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
c160: 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74         /* Term t
c170: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
c180: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
c1b0: 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69  fer zTerm */.  i
c1c0: 6e 74 20 62 50 72 65 66 69 78 2c 20 20 20 20 20  nt bPrefix,     
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c1e0: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65  * True for a pre
c1f0: 66 69 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  fix iterator */.
c200: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
c210: 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20 20 20  **ppReader      
c220: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65 61    /* OUT: SegRea
c230: 64 65 72 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d  der for pending-
c240: 74 65 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74  terms */.){.  Ft
c250: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
c260: 61 64 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ader = 0;     /*
c270: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
c280: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
c290: 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65  */.  Fts3HashEle
c2a0: 6d 20 2a 2a 61 45 6c 65 6d 20 3d 20 30 3b 20 20  m **aElem = 0;  
c2b0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
c2c0: 20 74 65 72 6d 20 68 61 73 68 20 65 6e 74 72 69   term hash entri
c2d0: 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20  es to scan */.  
c2e0: 69 6e 74 20 6e 45 6c 65 6d 20 3d 20 30 3b 20 20  int nElem = 0;  
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
c310: 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 20 20 69   at aElem */.  i
c320: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c330: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
c340: 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
c350: 0a 20 20 46 74 73 33 48 61 73 68 20 2a 70 48 61  .  Fts3Hash *pHa
c360: 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26  sh;..  pHash = &
c370: 70 2d 3e 61 49 6e 64 65 78 5b 69 49 6e 64 65 78  p->aIndex[iIndex
c380: 5d 2e 68 50 65 6e 64 69 6e 67 3b 0a 20 20 69 66  ].hPending;.  if
c390: 28 20 62 50 72 65 66 69 78 20 29 7b 0a 20 20 20  ( bPrefix ){.   
c3a0: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3c0: 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61  * Size of alloca
c3d0: 74 65 64 20 61 72 72 61 79 20 61 74 20 61 45 6c  ted array at aEl
c3e0: 65 6d 20 2a 2f 0a 20 20 20 20 46 74 73 33 48 61  em */.    Fts3Ha
c3f0: 73 68 45 6c 65 6d 20 2a 70 45 20 3d 20 30 3b 20  shElem *pE = 0; 
c400: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
c410: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
c420: 0a 20 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33  .    for(pE=fts3
c430: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
c440: 3b 20 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73  ; pE; pE=fts3Has
c450: 68 4e 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20  hNext(pE)){.    
c460: 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 28    char *zKey = (
c470: 63 68 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b  char *)fts3HashK
c480: 65 79 28 70 45 29 3b 0a 20 20 20 20 20 20 69 6e  ey(pE);.      in
c490: 74 20 6e 4b 65 79 20 3d 20 66 74 73 33 48 61 73  t nKey = fts3Has
c4a0: 68 4b 65 79 73 69 7a 65 28 70 45 29 3b 0a 20 20  hKeysize(pE);.  
c4b0: 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 30      if( nTerm==0
c4c0: 20 7c 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65 72 6d   || (nKey>=nTerm
c4d0: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4b   && 0==memcmp(zK
c4e0: 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  ey, zTerm, nTerm
c4f0: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  )) ){.        if
c500: 28 20 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63 20  ( nElem==nAlloc 
c510: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
c520: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65  3HashElem **aEle
c530: 6d 32 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41  m2;.          nA
c540: 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20  lloc += 16;.    
c550: 20 20 20 20 20 20 61 45 6c 65 6d 32 20 3d 20 28        aElem2 = (
c560: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29  Fts3HashElem **)
c570: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
c580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
c590: 45 6c 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  Elem, nAlloc*siz
c5a0: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
c5b0: 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   *).          );
c5c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
c5d0: 61 45 6c 65 6d 32 20 29 7b 0a 20 20 20 20 20 20  aElem2 ){.      
c5e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c5f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
c600: 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 30 3b 0a       nElem = 0;.
c610: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c620: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
c630: 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 20 3d           aElem =
c640: 20 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20   aElem2;.       
c650: 20 7d 0a 0a 20 20 20 20 20 20 20 20 61 45 6c 65   }..        aEle
c660: 6d 5b 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45 3b  m[nElem++] = pE;
c670: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
c680: 20 20 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20 74      /* If more t
c690: 68 61 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61 74  han one term mat
c6a0: 63 68 65 73 20 74 68 65 20 70 72 65 66 69 78 2c  ches the prefix,
c6b0: 20 73 6f 72 74 20 74 68 65 20 46 74 73 33 48 61   sort the Fts3Ha
c6c0: 73 68 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f 62  shElem.    ** ob
c6d0: 6a 65 63 74 73 20 69 6e 20 74 65 72 6d 20 6f 72  jects in term or
c6e0: 64 65 72 20 75 73 69 6e 67 20 71 73 6f 72 74 28  der using qsort(
c6f0: 29 2e 20 54 68 69 73 20 75 73 65 73 20 74 68 65  ). This uses the
c700: 20 73 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f 6e   same comparison
c710: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  .    ** callback
c720: 20 61 73 20 69 73 20 75 73 65 64 20 77 68 65 6e   as is used when
c730: 20 66 6c 75 73 68 69 6e 67 20 74 65 72 6d 73 20   flushing terms 
c740: 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  to disk..    */.
c750: 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20      if( nElem>1 
c760: 29 7b 0a 20 20 20 20 20 20 71 73 6f 72 74 28 61  ){.      qsort(a
c770: 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a  Elem, nElem, siz
c780: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
c790: 20 2a 29 2c 20 66 74 73 33 43 6f 6d 70 61 72 65   *), fts3Compare
c7a0: 45 6c 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20 20  ElemByTerm);.   
c7b0: 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
c7c0: 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 69 73   /* The query is
c7d0: 20 61 20 73 69 6d 70 6c 65 20 74 65 72 6d 20 6c   a simple term l
c7e0: 6f 6f 6b 75 70 20 74 68 61 74 20 6d 61 74 63 68  ookup that match
c7f0: 65 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74  es at most one t
c800: 65 72 6d 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  erm in.    ** th
c810: 65 20 69 6e 64 65 78 2e 20 41 6c 6c 20 74 68 61  e index. All tha
c820: 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73  t is required is
c830: 20 61 20 73 74 72 61 69 67 68 74 20 68 61 73 68   a straight hash
c840: 2d 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20  -lookup. */.    
c850: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45  Fts3HashElem *pE
c860: 20 3d 20 66 74 73 33 48 61 73 68 46 69 6e 64 45   = fts3HashFindE
c870: 6c 65 6d 28 70 48 61 73 68 2c 20 7a 54 65 72 6d  lem(pHash, zTerm
c880: 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66  , nTerm);.    if
c890: 28 20 70 45 20 29 7b 0a 20 20 20 20 20 20 61 45  ( pE ){.      aE
c8a0: 6c 65 6d 20 3d 20 26 70 45 3b 0a 20 20 20 20 20  lem = &pE;.     
c8b0: 20 6e 45 6c 65 6d 20 3d 20 31 3b 0a 20 20 20 20   nElem = 1;.    
c8c0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 45 6c  }.  }..  if( nEl
c8d0: 65 6d 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  em>0 ){.    int 
c8e0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
c8f0: 74 73 33 53 65 67 52 65 61 64 65 72 29 20 2b 20  ts3SegReader) + 
c900: 28 6e 45 6c 65 6d 2b 31 29 2a 73 69 7a 65 6f 66  (nElem+1)*sizeof
c910: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29  (Fts3HashElem *)
c920: 3b 0a 20 20 20 20 70 52 65 61 64 65 72 20 3d 20  ;.    pReader = 
c930: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
c940: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
c950: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
c960: 21 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  !pReader ){.    
c970: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
c980: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
c990: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65        memset(pRe
c9a0: 61 64 65 72 2c 20 30 2c 20 6e 42 79 74 65 29 3b  ader, 0, nByte);
c9b0: 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e  .      pReader->
c9c0: 69 49 64 78 20 3d 20 30 78 37 46 46 46 46 46 46  iIdx = 0x7FFFFFF
c9d0: 46 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  F;.      pReader
c9e0: 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 20 3d 20 28  ->ppNextElem = (
c9f0: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29  Fts3HashElem **)
ca00: 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20 20 20  &pReader[1];.   
ca10: 20 20 20 6d 65 6d 63 70 79 28 70 52 65 61 64 65     memcpy(pReade
ca20: 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 2c 20 61  r->ppNextElem, a
ca30: 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2a 73 69 7a 65  Elem, nElem*size
ca40: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20  of(Fts3HashElem 
ca50: 2a 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  *));.    }.  }..
ca60: 20 20 69 66 28 20 62 50 72 65 66 69 78 20 29 7b    if( bPrefix ){
ca70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ca80: 65 28 61 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20  e(aElem);.  }.  
ca90: 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52 65 61  *ppReader = pRea
caa0: 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  der;.  return rc
cab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
cac0: 72 65 20 74 68 65 20 65 6e 74 72 69 65 73 20 70  re the entries p
cad0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 77 6f  ointed to by two
cae0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 73   Fts3SegReader s
caf0: 74 72 75 63 74 75 72 65 73 2e 20 0a 2a 2a 20 43  tructures. .** C
cb00: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73 20  omparison is as 
cb10: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
cb20: 20 31 29 20 45 4f 46 20 69 73 20 67 72 65 61 74   1) EOF is great
cb30: 65 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e  er than not EOF.
cb40: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 54 68 65 20  .**.**   2) The 
cb50: 63 75 72 72 65 6e 74 20 74 65 72 6d 73 20 28 69  current terms (i
cb60: 66 20 61 6e 79 29 20 61 72 65 20 63 6f 6d 70 61  f any) are compa
cb70: 72 65 64 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  red using memcmp
cb80: 28 29 2e 20 49 66 20 6f 6e 65 0a 2a 2a 20 20 20  (). If one.**   
cb90: 20 20 20 74 65 72 6d 20 69 73 20 61 20 70 72 65     term is a pre
cba0: 66 69 78 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20  fix of another, 
cbb0: 74 68 65 20 6c 6f 6e 67 65 72 20 74 65 72 6d 20  the longer term 
cbc0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68  is considered th
cbd0: 65 0a 2a 2a 20 20 20 20 20 20 6c 61 72 67 65 72  e.**      larger
cbe0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79 20  ..**.**   3) By 
cbf0: 73 65 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e 20  segment age. An 
cc00: 6f 6c 64 65 72 20 73 65 67 6d 65 6e 74 20 69 73  older segment is
cc10: 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 61 72 67   considered larg
cc20: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
cc30: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  t fts3SegReaderC
cc40: 6d 70 28 46 74 73 33 53 65 67 52 65 61 64 65 72  mp(Fts3SegReader
cc50: 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52   *pLhs, Fts3SegR
cc60: 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20  eader *pRhs){.  
cc70: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 4c  int rc;.  if( pL
cc80: 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52 68  hs->aNode && pRh
cc90: 73 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20  s->aNode ){.    
cca0: 69 6e 74 20 72 63 32 20 3d 20 70 4c 68 73 2d 3e  int rc2 = pLhs->
ccb0: 6e 54 65 72 6d 20 2d 20 70 52 68 73 2d 3e 6e 54  nTerm - pRhs->nT
ccc0: 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 72 63 32  erm;.    if( rc2
ccd0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
cce0: 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54   memcmp(pLhs->zT
ccf0: 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d  erm, pRhs->zTerm
cd00: 2c 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a  , pLhs->nTerm);.
cd10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cd20: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 68   rc = memcmp(pLh
cd30: 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e  s->zTerm, pRhs->
cd40: 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 6e 54 65  zTerm, pRhs->nTe
cd50: 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rm);.    }.    i
cd60: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
cd70: 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
cd80: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
cd90: 63 20 3d 20 28 70 4c 68 73 2d 3e 61 4e 6f 64 65  c = (pLhs->aNode
cda0: 3d 3d 30 29 20 2d 20 28 70 52 68 73 2d 3e 61 4e  ==0) - (pRhs->aN
cdb0: 6f 64 65 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 69  ode==0);.  }.  i
cdc0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
cdd0: 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20  rc = pRhs->iIdx 
cde0: 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20  - pLhs->iIdx;.  
cdf0: 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
ce00: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
ce10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 64 69 66  ;.}../*.** A dif
ce20: 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 69 73 6f  ferent compariso
ce30: 6e 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 53  n function for S
ce40: 65 67 52 65 61 64 65 72 20 73 74 72 75 63 74 75  egReader structu
ce50: 72 65 73 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  res. In this.** 
ce60: 76 65 72 73 69 6f 6e 2c 20 69 74 20 69 73 20 61  version, it is a
ce70: 73 73 75 6d 65 64 20 74 68 61 74 20 65 61 63 68  ssumed that each
ce80: 20 53 65 67 52 65 61 64 65 72 20 70 6f 69 6e 74   SegReader point
ce90: 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 69 6e  s to an entry in
cea0: 0a 2a 2a 20 61 20 64 6f 63 6c 69 73 74 20 66 6f  .** a doclist fo
ceb0: 72 20 69 64 65 6e 74 69 63 61 6c 20 74 65 72 6d  r identical term
cec0: 73 2e 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 73  s. Comparison is
ced0: 20 6d 61 64 65 20 61 73 20 66 6f 6c 6c 6f 77 73   made as follows
cee0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46  :.**.**   1) EOF
cef0: 20 28 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73 74   (end of doclist
cf00: 20 69 6e 20 74 68 69 73 20 63 61 73 65 29 20 69   in this case) i
cf10: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
cf20: 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20  ot EOF..**.**   
cf30: 32 29 20 42 79 20 63 75 72 72 65 6e 74 20 64 6f  2) By current do
cf40: 63 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20  cid..**.**   3) 
cf50: 42 79 20 73 65 67 6d 65 6e 74 20 61 67 65 2e 20  By segment age. 
cf60: 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e 74  An older segment
cf70: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6c   is considered l
cf80: 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  arger..*/.static
cf90: 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64   int fts3SegRead
cfa0: 65 72 44 6f 63 6c 69 73 74 43 6d 70 28 46 74 73  erDoclistCmp(Fts
cfb0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73  3SegReader *pLhs
cfc0: 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  , Fts3SegReader 
cfd0: 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRhs){.  int rc
cfe0: 20 3d 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73 65   = (pLhs->pOffse
cff0: 74 4c 69 73 74 3d 3d 30 29 2d 28 70 52 68 73 2d  tList==0)-(pRhs-
d000: 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29  >pOffsetList==0)
d010: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
d020: 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 69  .    if( pLhs->i
d030: 44 6f 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44 6f  Docid==pRhs->iDo
d040: 63 69 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  cid ){.      rc 
d050: 3d 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70  = pRhs->iIdx - p
d060: 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20 7d  Lhs->iIdx;.    }
d070: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
d080: 20 28 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20 3e   (pLhs->iDocid >
d090: 20 70 52 68 73 2d 3e 69 44 6f 63 69 64 29 20 3f   pRhs->iDocid) ?
d0a0: 20 31 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   1 : -1;.    }. 
d0b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 68   }.  assert( pLh
d0c0: 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52 68 73  s->aNode && pRhs
d0d0: 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74  ->aNode );.  ret
d0e0: 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
d0f0: 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64   int fts3SegRead
d100: 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 28  erDoclistCmpRev(
d110: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
d120: 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65 61 64  Lhs, Fts3SegRead
d130: 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74  er *pRhs){.  int
d140: 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70 4f 66   rc = (pLhs->pOf
d150: 66 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28 70 52  fsetList==0)-(pR
d160: 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d  hs->pOffsetList=
d170: 3d 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  =0);.  if( rc==0
d180: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 68 73   ){.    if( pLhs
d190: 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73 2d 3e  ->iDocid==pRhs->
d1a0: 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20  iDocid ){.      
d1b0: 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20  rc = pRhs->iIdx 
d1c0: 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20  - pLhs->iIdx;.  
d1d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
d1e0: 63 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f 63 69  c = (pLhs->iDoci
d1f0: 64 20 3c 20 70 52 68 73 2d 3e 69 44 6f 63 69 64  d < pRhs->iDocid
d200: 29 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20 20 20  ) ? 1 : -1;.    
d210: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
d220: 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70  pLhs->aNode && p
d230: 52 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20  Rhs->aNode );.  
d240: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d250: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
d260: 74 65 72 6d 20 74 68 61 74 20 74 68 65 20 46 74  term that the Ft
d270: 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65  s3SegReader obje
d280: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
d290: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 0a   first argument.
d2a0: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 77 69 74  ** points to wit
d2b0: 68 20 74 68 65 20 74 65 72 6d 20 73 70 65 63 69  h the term speci
d2c0: 66 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e 74  fied by argument
d2d0: 73 20 7a 54 65 72 6d 20 61 6e 64 20 6e 54 65 72  s zTerm and nTer
d2e0: 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  m. .**.** If the
d2f0: 20 70 53 65 67 20 69 74 65 72 61 74 6f 72 20 69   pSeg iterator i
d300: 73 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46  s already at EOF
d310: 2c 20 72 65 74 75 72 6e 20 30 2e 20 4f 74 68 65  , return 0. Othe
d320: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a  rwise, return.**
d330: 20 2d 76 65 20 69 66 20 74 68 65 20 70 53 65 67   -ve if the pSeg
d340: 20 74 65 72 6d 20 69 73 20 6c 65 73 73 20 74 68   term is less th
d350: 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20  an zTerm/nTerm, 
d360: 30 20 69 66 20 74 68 65 20 74 77 6f 20 74 65 72  0 if the two ter
d370: 6d 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c  ms are.** equal,
d380: 20 6f 72 20 2b 76 65 20 69 66 20 74 68 65 20 70   or +ve if the p
d390: 53 65 67 20 74 65 72 6d 20 69 73 20 67 72 65 61  Seg term is grea
d3a0: 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e  ter than zTerm/n
d3b0: 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Term..*/.static 
d3c0: 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65  int fts3SegReade
d3d0: 72 54 65 72 6d 43 6d 70 28 0a 20 20 46 74 73 33  rTermCmp(.  Fts3
d3e0: 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 2c  SegReader *pSeg,
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d400: 65 67 6d 65 6e 74 20 72 65 61 64 65 72 20 6f 62  egment reader ob
d410: 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
d420: 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
d430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
d440: 6d 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f 20  m to compare to 
d450: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20  */.  int nTerm  
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d470: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
d480: 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20 62 79  term zTerm in by
d490: 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
d4a0: 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  res = 0;.  if( p
d4b0: 53 65 67 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20  Seg->aNode ){.  
d4c0: 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 54 65 72    if( pSeg->nTer
d4d0: 6d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  m>nTerm ){.     
d4e0: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 53   res = memcmp(pS
d4f0: 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d  eg->zTerm, zTerm
d500: 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65  , nTerm);.    }e
d510: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
d520: 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54   memcmp(pSeg->zT
d530: 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 70 53 65 67  erm, zTerm, pSeg
d540: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  ->nTerm);.    }.
d550: 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
d560: 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 53  {.      res = pS
d570: 65 67 2d 3e 6e 54 65 72 6d 2d 6e 54 65 72 6d 3b  eg->nTerm-nTerm;
d580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d590: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
d5a0: 2a 20 41 72 67 75 6d 65 6e 74 20 61 70 53 65 67  * Argument apSeg
d5b0: 6d 65 6e 74 20 69 73 20 61 6e 20 61 72 72 61 79  ment is an array
d5c0: 20 6f 66 20 6e 53 65 67 6d 65 6e 74 20 65 6c 65   of nSegment ele
d5d0: 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 6b 6e 6f  ments. It is kno
d5e0: 77 6e 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 66  wn that.** the f
d5f0: 69 6e 61 6c 20 28 6e 53 65 67 6d 65 6e 74 2d 6e  inal (nSegment-n
d600: 53 75 73 70 65 63 74 29 20 6d 65 6d 62 65 72 73  Suspect) members
d610: 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
d620: 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 2a 2a 20  sorted order.** 
d630: 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68  (according to th
d640: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
d650: 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 29 2e  ction provided).
d660: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
d670: 68 75 66 66 6c 65 73 0a 2a 2a 20 74 68 65 20 61  huffles.** the a
d680: 72 72 61 79 20 61 72 6f 75 6e 64 20 75 6e 74 69  rray around unti
d690: 6c 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 61 72  l all entries ar
d6a0: 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  e in sorted orde
d6b0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
d6c0: 64 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53  d fts3SegReaderS
d6d0: 6f 72 74 28 0a 20 20 46 74 73 33 53 65 67 52 65  ort(.  Fts3SegRe
d6e0: 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74  ader **apSegment
d6f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d700: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 74        /* Array t
d710: 6f 20 73 6f 72 74 20 65 6e 74 72 69 65 73 20 6f  o sort entries o
d720: 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  f */.  int nSegm
d730: 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d760: 20 61 70 53 65 67 6d 65 6e 74 20 61 72 72 61 79   apSegment array
d770: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 73 70 65   */.  int nSuspe
d780: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ct,             
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64       /* Unsorted
d7b0: 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f 0a   entry count */.
d7c0: 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74    int (*xCmp)(Ft
d7d0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46  s3SegReader *, F
d7e0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20  ts3SegReader *) 
d7f0: 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66   /* Comparison f
d800: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
d810: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
d840: 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  able */..  asser
d850: 74 28 20 6e 53 75 73 70 65 63 74 3c 3d 6e 53 65  t( nSuspect<=nSe
d860: 67 6d 65 6e 74 20 29 3b 0a 0a 20 20 69 66 28 20  gment );..  if( 
d870: 6e 53 75 73 70 65 63 74 3d 3d 6e 53 65 67 6d 65  nSuspect==nSegme
d880: 6e 74 20 29 20 6e 53 75 73 70 65 63 74 2d 2d 3b  nt ) nSuspect--;
d890: 0a 20 20 66 6f 72 28 69 3d 6e 53 75 73 70 65 63  .  for(i=nSuspec
d8a0: 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  t-1; i>=0; i--){
d8b0: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
d8c0: 66 6f 72 28 6a 3d 69 3b 20 6a 3c 28 6e 53 65 67  for(j=i; j<(nSeg
d8d0: 6d 65 6e 74 2d 31 29 3b 20 6a 2b 2b 29 7b 0a 20  ment-1); j++){. 
d8e0: 20 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64       Fts3SegRead
d8f0: 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20  er *pTmp;.      
d900: 69 66 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65  if( xCmp(apSegme
d910: 6e 74 5b 6a 5d 2c 20 61 70 53 65 67 6d 65 6e 74  nt[j], apSegment
d920: 5b 6a 2b 31 5d 29 3c 30 20 29 20 62 72 65 61 6b  [j+1])<0 ) break
d930: 3b 0a 20 20 20 20 20 20 70 54 6d 70 20 3d 20 61  ;.      pTmp = a
d940: 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 3b 0a 20  pSegment[j+1];. 
d950: 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a       apSegment[j
d960: 2b 31 5d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  +1] = apSegment[
d970: 6a 5d 3b 0a 20 20 20 20 20 20 61 70 53 65 67 6d  j];.      apSegm
d980: 65 6e 74 5b 6a 5d 20 3d 20 70 54 6d 70 3b 0a 20  ent[j] = pTmp;. 
d990: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
d9a0: 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 43 68  f NDEBUG.  /* Ch
d9b0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 69 73  eck that the lis
d9c0: 74 20 72 65 61 6c 6c 79 20 69 73 20 73 6f 72 74  t really is sort
d9d0: 65 64 20 6e 6f 77 2e 20 2a 2f 0a 20 20 66 6f 72  ed now. */.  for
d9e0: 28 69 3d 30 3b 20 69 3c 28 6e 53 75 73 70 65 63  (i=0; i<(nSuspec
d9f0: 74 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t-1); i++){.    
da00: 61 73 73 65 72 74 28 20 78 43 6d 70 28 61 70 53  assert( xCmp(apS
da10: 65 67 6d 65 6e 74 5b 69 5d 2c 20 61 70 53 65 67  egment[i], apSeg
da20: 6d 65 6e 74 5b 69 2b 31 5d 29 3c 30 20 29 3b 0a  ment[i+1])<0 );.
da30: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
da40: 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 72 65   .** Insert a re
da50: 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f  cord into the %_
da60: 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 0a  segments table..
da70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
da80: 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 0a  s3WriteSegment(.
da90: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
dac0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
dad0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c  qlite3_int64 iBl
dae0: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ock,           /
daf0: 2a 20 42 6c 6f 63 6b 20 69 64 20 66 6f 72 20 6e  * Block id for n
db00: 65 77 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 63 68  ew block */.  ch
db10: 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20  ar *z,          
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db30: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
db40: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 62 6c  er containing bl
db50: 6f 63 6b 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  ock data */.  in
db60: 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  t n             
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db80: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
db90: 7a 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  z in bytes */.){
dba0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
dbb0: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
dbc0: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
dbd0: 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47  , SQL_INSERT_SEG
dbe0: 4d 45 4e 54 53 2c 20 26 70 53 74 6d 74 2c 20 30  MENTS, &pStmt, 0
dbf0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
dc00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
dc10: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
dc20: 28 70 53 74 6d 74 2c 20 31 2c 20 69 42 6c 6f 63  (pStmt, 1, iBloc
dc30: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  k);.    sqlite3_
dc40: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
dc50: 20 32 2c 20 7a 2c 20 6e 2c 20 53 51 4c 49 54 45   2, z, n, SQLITE
dc60: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
dc70: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
dc80: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
dc90: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
dca0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
dcb0: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73  c;.}../* .** Ins
dcc0: 65 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ert a record int
dcd0: 6f 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  o the %_segdir t
dce0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
dcf0: 69 6e 74 20 66 74 73 33 57 72 69 74 65 53 65 67  int fts3WriteSeg
dd00: 64 69 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65  dir(.  Fts3Table
dd10: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
dd20: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
dd30: 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
dd40: 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
dd70: 20 22 6c 65 76 65 6c 22 20 66 69 65 6c 64 20 2a   "level" field *
dd80: 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
ddb0: 20 22 69 64 78 22 20 66 69 65 6c 64 20 2a 2f 0a   "idx" field */.
ddc0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
ddd0: 69 53 74 61 72 74 42 6c 6f 63 6b 2c 20 20 20 20  iStartBlock,    
dde0: 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
ddf0: 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 66 69 65  start_block" fie
de00: 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ld */.  sqlite3_
de10: 69 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 42 6c  int64 iLeafEndBl
de20: 6f 63 6b 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65  ock,    /* Value
de30: 20 66 6f 72 20 22 6c 65 61 76 65 73 5f 65 6e 64   for "leaves_end
de40: 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f  _block" field */
de50: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
de60: 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20   iEndBlock,     
de70: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
de80: 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c  "end_block" fiel
de90: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f  d */.  char *zRo
dea0: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
deb0: 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 62 20 76         /* Blob v
dec0: 61 6c 75 65 20 66 6f 72 20 22 72 6f 6f 74 22 20  alue for "root" 
ded0: 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  field */.  int n
dee0: 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
def0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
df00: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
df10: 20 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f   buffer zRoot */
df20: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
df30: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
df40: 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
df50: 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f  t(p, SQL_INSERT_
df60: 53 45 47 44 49 52 2c 20 26 70 53 74 6d 74 2c 20  SEGDIR, &pStmt, 
df70: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
df80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
df90: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
dfa0: 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76 65 6c  pStmt, 1, iLevel
dfb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
dfc0: 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32  ind_int(pStmt, 2
dfd0: 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73 71 6c  , iIdx);.    sql
dfe0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
dff0: 70 53 74 6d 74 2c 20 33 2c 20 69 53 74 61 72 74  pStmt, 3, iStart
e000: 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69  Block);.    sqli
e010: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
e020: 53 74 6d 74 2c 20 34 2c 20 69 4c 65 61 66 45 6e  Stmt, 4, iLeafEn
e030: 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c  dBlock);.    sql
e040: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
e050: 70 53 74 6d 74 2c 20 35 2c 20 69 45 6e 64 42 6c  pStmt, 5, iEndBl
e060: 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ock);.    sqlite
e070: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
e080: 74 2c 20 36 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f  t, 6, zRoot, nRo
e090: 6f 74 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  ot, SQLITE_STATI
e0a0: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  C);.    sqlite3_
e0b0: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
e0c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
e0d0: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  set(pStmt);.  }.
e0e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e0f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e100: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6d   size of the com
e110: 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66 20 61  mon prefix (if a
e120: 6e 79 29 20 73 68 61 72 65 64 20 62 79 20 7a 50  ny) shared by zP
e130: 72 65 76 20 61 6e 64 0a 2a 2a 20 7a 4e 65 78 74  rev and.** zNext
e140: 2c 20 69 6e 20 62 79 74 65 73 2e 20 46 6f 72 20  , in bytes. For 
e150: 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a 0a 2a 2a 20  example, .**.** 
e160: 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70    fts3PrefixComp
e170: 72 65 73 73 28 22 61 62 63 22 2c 20 33 2c 20 22  ress("abc", 3, "
e180: 61 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f  abcdef", 6)   //
e190: 20 72 65 74 75 72 6e 73 20 33 0a 2a 2a 20 20 20   returns 3.**   
e1a0: 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
e1b0: 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22 61 62  ss("abX", 3, "ab
e1c0: 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72  cdef", 6)   // r
e1d0: 65 74 75 72 6e 73 20 32 0a 2a 2a 20 20 20 66 74  eturns 2.**   ft
e1e0: 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s3PrefixCompress
e1f0: 28 22 61 62 58 22 2c 20 33 2c 20 22 58 62 63 64  ("abX", 3, "Xbcd
e200: 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65 74  ef", 6)   // ret
e210: 75 72 6e 73 20 30 0a 2a 2f 0a 73 74 61 74 69 63  urns 0.*/.static
e220: 20 69 6e 74 20 66 74 73 33 50 72 65 66 69 78 43   int fts3PrefixC
e230: 6f 6d 70 72 65 73 73 28 0a 20 20 63 6f 6e 73 74  ompress(.  const
e240: 20 63 68 61 72 20 2a 7a 50 72 65 76 2c 20 20 20   char *zPrev,   
e250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
e260: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
e270: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  previous term */
e280: 0a 20 20 69 6e 74 20 6e 50 72 65 76 2c 20 20 20  .  int nPrev,   
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
e2b0: 66 66 65 72 20 7a 50 72 65 76 20 69 6e 20 62 79  ffer zPrev in by
e2c0: 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tes */.  const c
e2d0: 68 61 72 20 2a 7a 4e 65 78 74 2c 20 20 20 20 20  har *zNext,     
e2e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
e2f0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 65  er containing ne
e300: 78 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  xt term */.  int
e310: 20 6e 4e 65 78 74 20 20 20 20 20 20 20 20 20 20   nNext          
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e330: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a  Size of buffer z
e340: 4e 65 78 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  Next in bytes */
e350: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 55  .){.  int n;.  U
e360: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
e370: 6e 4e 65 78 74 29 3b 0a 20 20 66 6f 72 28 6e 3d  nNext);.  for(n=
e380: 30 3b 20 6e 3c 6e 50 72 65 76 20 26 26 20 7a 50  0; n<nPrev && zP
e390: 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78 74 5b 6e 5d  rev[n]==zNext[n]
e3a0: 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e  ; n++);.  return
e3b0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   n;.}../*.** Add
e3c0: 20 74 65 72 6d 20 7a 54 65 72 6d 20 74 6f 20 74   term zTerm to t
e3d0: 68 65 20 53 65 67 6d 65 6e 74 4e 6f 64 65 2e 20  he SegmentNode. 
e3e0: 49 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  It is guaranteed
e3f0: 20 74 68 61 74 20 7a 54 65 72 6d 20 69 73 20 6c   that zTerm is l
e400: 61 72 67 65 72 0a 2a 2a 20 28 61 63 63 6f 72 64  arger.** (accord
e410: 69 6e 67 20 74 6f 20 6d 65 6d 63 6d 70 29 20 74  ing to memcmp) t
e420: 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  han the previous
e430: 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63   term..*/.static
e440: 20 69 6e 74 20 66 74 73 33 4e 6f 64 65 41 64 64   int fts3NodeAdd
e450: 54 65 72 6d 28 0a 20 20 46 74 73 33 54 61 62 6c  Term(.  Fts3Tabl
e460: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
e470: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
e480: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
e490: 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  */.  SegmentNode
e4a0: 20 2a 2a 70 70 54 72 65 65 2c 20 20 20 20 20 20   **ppTree,      
e4b0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
e4c0: 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64  SegmentNode hand
e4d0: 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43  le */ .  int isC
e4e0: 6f 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20 20  opyTerm,        
e4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
e500: 20 69 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20   if zTerm/nTerm 
e510: 69 73 20 74 72 61 6e 73 69 65 6e 74 20 2a 2f 0a  is transient */.
e520: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
e530: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
e540: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
e550: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
e560: 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  g term */.  int 
e570: 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  nTerm           
e580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e590: 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62  ize of term in b
e5a0: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 67  ytes */.){.  Seg
e5b0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 20  mentNode *pTree 
e5c0: 3d 20 2a 70 70 54 72 65 65 3b 0a 20 20 69 6e 74  = *ppTree;.  int
e5d0: 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f   rc;.  SegmentNo
e5e0: 64 65 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  de *pNew;..  /* 
e5f0: 46 69 72 73 74 20 74 72 79 20 74 6f 20 61 70 70  First try to app
e600: 65 6e 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20  end the term to 
e610: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
e620: 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69  . Return early i
e630: 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20  f .  ** this is 
e640: 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
e650: 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20   if( pTree ){.  
e660: 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70 54    int nData = pT
e670: 72 65 65 2d 3e 6e 44 61 74 61 3b 20 20 20 20 20  ree->nData;     
e680: 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
e690: 6f 66 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73  of node in bytes
e6a0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 71   */.    int nReq
e6b0: 20 3d 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20   = nData;       
e6c0: 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
e6d0: 64 20 73 70 61 63 65 20 61 66 74 65 72 20 61 64  d space after ad
e6e0: 64 69 6e 67 20 7a 54 65 72 6d 20 2a 2f 0a 20 20  ding zTerm */.  
e6f0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20    int nPrefix;  
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
e720: 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
e730: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
e740: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e760: 20 53 75 66 66 69 78 20 6c 65 6e 67 74 68 20 2a   Suffix length *
e770: 2f 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  /..    nPrefix =
e780: 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
e790: 65 73 73 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d  ess(pTree->zTerm
e7a0: 2c 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 2c 20  , pTree->nTerm, 
e7b0: 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
e7c0: 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65     nSuffix = nTe
e7d0: 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20 20  rm-nPrefix;..   
e7e0: 20 6e 52 65 71 20 2b 3d 20 73 71 6c 69 74 65 33   nReq += sqlite3
e7f0: 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50  Fts3VarintLen(nP
e800: 72 65 66 69 78 29 2b 73 71 6c 69 74 65 33 46 74  refix)+sqlite3Ft
e810: 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66  s3VarintLen(nSuf
e820: 66 69 78 29 2b 6e 53 75 66 66 69 78 3b 0a 20 20  fix)+nSuffix;.  
e830: 20 20 69 66 28 20 6e 52 65 71 3c 3d 70 2d 3e 6e    if( nReq<=p->n
e840: 4e 6f 64 65 53 69 7a 65 20 7c 7c 20 21 70 54 72  NodeSize || !pTr
e850: 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20 20  ee->zTerm ){..  
e860: 20 20 20 20 69 66 28 20 6e 52 65 71 3e 70 2d 3e      if( nReq>p->
e870: 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20  nNodeSize ){.   
e880: 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 75       /* An unusu
e890: 61 6c 20 63 61 73 65 3a 20 74 68 69 73 20 69 73  al case: this is
e8a0: 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
e8b0: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
e8c0: 68 65 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20  he node.        
e8d0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 74 61 74 69  ** and the stati
e8e0: 63 20 6e 6f 64 65 20 62 75 66 66 65 72 20 28 70  c node buffer (p
e8f0: 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74 65  ->nNodeSize byte
e900: 73 29 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 0a  s) is not large.
e910: 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 6f 75 67          ** enoug
e920: 68 2e 20 55 73 65 20 61 20 73 65 70 61 72 61 74  h. Use a separat
e930: 65 6c 79 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  ely malloced buf
e940: 66 65 72 20 69 6e 73 74 65 61 64 20 54 68 69 73  fer instead This
e950: 20 77 61 73 74 65 73 0a 20 20 20 20 20 20 20 20   wastes.        
e960: 2a 2a 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20  ** p->nNodeSize 
e970: 62 79 74 65 73 2c 20 62 75 74 20 73 69 6e 63 65  bytes, but since
e980: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 6f   this scenario o
e990: 6e 6c 79 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  nly comes about 
e9a0: 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  when.        ** 
e9b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
e9c0: 74 61 69 6e 20 74 77 6f 20 74 65 72 6d 73 20 74  tain two terms t
e9d0: 68 61 74 20 73 68 61 72 65 20 61 20 70 72 65 66  hat share a pref
e9e0: 69 78 20 6f 66 20 61 6c 6d 6f 73 74 20 32 4b 42  ix of almost 2KB
e9f0: 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
ea00: 69 73 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74  is is not expect
ea10: 65 64 20 74 6f 20 62 65 20 61 20 73 65 72 69 6f  ed to be a serio
ea20: 75 73 20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20 20  us problem. .   
ea30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ea40: 61 73 73 65 72 74 28 20 70 54 72 65 65 2d 3e 61  assert( pTree->a
ea50: 44 61 74 61 3d 3d 28 63 68 61 72 20 2a 29 26 70  Data==(char *)&p
ea60: 54 72 65 65 5b 31 5d 20 29 3b 0a 20 20 20 20 20  Tree[1] );.     
ea70: 20 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61 20     pTree->aData 
ea80: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
ea90: 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a  3_malloc(nReq);.
eaa0: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 54 72          if( !pTr
eab0: 65 65 2d 3e 61 44 61 74 61 20 29 7b 0a 20 20 20  ee->aData ){.   
eac0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ead0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
eae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
eaf0: 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e       if( pTree->
eb00: 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  zTerm ){.       
eb10: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
eb20: 70 72 65 66 69 78 2d 6c 65 6e 67 74 68 20 66 69  prefix-length fi
eb30: 65 6c 64 20 66 6f 72 20 66 69 72 73 74 20 74 65  eld for first te
eb40: 72 6d 20 69 6e 20 61 20 6e 6f 64 65 20 2a 2f 0a  rm in a node */.
eb50: 20 20 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d          nData +=
eb60: 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
eb70: 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44  arint(&pTree->aD
eb80: 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65  ata[nData], nPre
eb90: 66 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  fix);.      }.. 
eba0: 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73 71       nData += sq
ebb0: 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
ebc0: 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61  nt(&pTree->aData
ebd0: 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69 78  [nData], nSuffix
ebe0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
ebf0: 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44  &pTree->aData[nD
ec00: 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72  ata], &zTerm[nPr
ec10: 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b  efix], nSuffix);
ec20: 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 44  .      pTree->nD
ec30: 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 53  ata = nData + nS
ec40: 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70 54 72  uffix;.      pTr
ec50: 65 65 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a 20  ee->nEntry++;.. 
ec60: 20 20 20 20 20 69 66 28 20 69 73 43 6f 70 79 54       if( isCopyT
ec70: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  erm ){.        i
ec80: 66 28 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f  f( pTree->nMallo
ec90: 63 3c 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  c<nTerm ){.     
eca0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20       char *zNew 
ecb0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
ecc0: 63 28 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63  c(pTree->zMalloc
ecd0: 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20  , nTerm*2);.    
ece0: 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20        if( !zNew 
ecf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
ed00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ed10: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
ed20: 20 20 20 20 20 20 20 20 20 20 70 54 72 65 65 2d            pTree-
ed30: 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d  >nMalloc = nTerm
ed40: 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  *2;.          pT
ed50: 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a  ree->zMalloc = z
ed60: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
ed70: 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54         pTree->zT
ed80: 65 72 6d 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61  erm = pTree->zMa
ed90: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20 6d 65  lloc;.        me
eda0: 6d 63 70 79 28 70 54 72 65 65 2d 3e 7a 54 65 72  mcpy(pTree->zTer
edb0: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
edc0: 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d  ;.        pTree-
edd0: 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a  >nTerm = nTerm;.
ede0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
edf0: 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65 72       pTree->zTer
ee00: 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65 72  m = (char *)zTer
ee10: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65  m;.        pTree
ee20: 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b  ->nTerm = nTerm;
ee30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
ee40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ee50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ee60: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
ee70: 73 20 74 6f 20 68 65 72 65 2c 20 69 74 20 77 61  s to here, it wa
ee80: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
ee90: 6f 20 61 70 70 65 6e 64 20 7a 54 65 72 6d 20 74  o append zTerm t
eea0: 6f 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  o the.  ** curre
eeb0: 6e 74 20 6e 6f 64 65 2e 20 43 72 65 61 74 65 20  nt node. Create 
eec0: 61 20 6e 65 77 20 6e 6f 64 65 20 28 61 20 72 69  a new node (a ri
eed0: 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 74  ght-sibling of t
eee0: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 29  he current node)
eef0: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  ..  ** If this i
ef00: 73 20 74 68 65 20 66 69 72 73 74 20 6e 6f 64 65  s the first node
ef10: 20 69 6e 20 74 68 65 20 74 72 65 65 2c 20 74 68   in the tree, th
ef20: 65 20 74 65 72 6d 20 69 73 20 61 64 64 65 64 20  e term is added 
ef30: 74 6f 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  to it..  **.  **
ef40: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
ef50: 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 64 64 65  term is not adde
ef60: 64 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 6f 64  d to the new nod
ef70: 65 2c 20 69 74 20 69 73 20 6c 65 66 74 20 65 6d  e, it is left em
ef80: 70 74 79 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 77  pty for.  ** now
ef90: 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 74  . Instead, the t
efa0: 65 72 6d 20 69 73 20 69 6e 73 65 72 74 65 64 20  erm is inserted 
efb0: 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
efc0: 6f 66 20 70 54 72 65 65 2e 20 49 66 20 70 54 72  of pTree. If pTr
efd0: 65 65 20 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 20  ee .  ** has no 
efe0: 70 61 72 65 6e 74 2c 20 6f 6e 65 20 69 73 20 63  parent, one is c
eff0: 72 65 61 74 65 64 20 68 65 72 65 2e 0a 20 20 2a  reated here..  *
f000: 2f 0a 20 20 70 4e 65 77 20 3d 20 28 53 65 67 6d  /.  pNew = (Segm
f010: 65 6e 74 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65  entNode *)sqlite
f020: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
f030: 53 65 67 6d 65 6e 74 4e 6f 64 65 29 20 2b 20 70  SegmentNode) + p
f040: 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20  ->nNodeSize);.  
f050: 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
f060: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f070: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
f080: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
f090: 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 29  of(SegmentNode))
f0a0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 44 61 74 61 20  ;.  pNew->nData 
f0b0: 3d 20 31 20 2b 20 46 54 53 33 5f 56 41 52 49 4e  = 1 + FTS3_VARIN
f0c0: 54 5f 4d 41 58 3b 0a 20 20 70 4e 65 77 2d 3e 61  T_MAX;.  pNew->a
f0d0: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26  Data = (char *)&
f0e0: 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20 69 66 28 20  pNew[1];..  if( 
f0f0: 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65 67  pTree ){.    Seg
f100: 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e  mentNode *pParen
f110: 74 20 3d 20 70 54 72 65 65 2d 3e 70 50 61 72 65  t = pTree->pPare
f120: 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  nt;.    rc = fts
f130: 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20  3NodeAddTerm(p, 
f140: 26 70 50 61 72 65 6e 74 2c 20 69 73 43 6f 70 79  &pParent, isCopy
f150: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
f160: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72  rm);.    if( pTr
f170: 65 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29  ee->pParent==0 )
f180: 7b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 70  {.      pTree->p
f190: 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
f1a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72 65  ;.    }.    pTre
f1b0: 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e 65 77  e->pRight = pNew
f1c0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66  ;.    pNew->pLef
f1d0: 74 6d 6f 73 74 20 3d 20 70 54 72 65 65 2d 3e 70  tmost = pTree->p
f1e0: 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 70 4e  Leftmost;.    pN
f1f0: 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ew->pParent = pP
f200: 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d  arent;.    pNew-
f210: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65  >zMalloc = pTree
f220: 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70  ->zMalloc;.    p
f230: 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 70  New->nMalloc = p
f240: 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a 20  Tree->nMalloc;. 
f250: 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f     pTree->zMallo
f260: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
f270: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d      pNew->pLeftm
f280: 6f 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ost = pNew;.    
f290: 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64  rc = fts3NodeAdd
f2a0: 54 65 72 6d 28 70 2c 20 26 70 4e 65 77 2c 20 69  Term(p, &pNew, i
f2b0: 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d  sCopyTerm, zTerm
f2c0: 2c 20 6e 54 65 72 6d 29 3b 20 0a 20 20 7d 0a 0a  , nTerm); .  }..
f2d0: 20 20 2a 70 70 54 72 65 65 20 3d 20 70 4e 65 77    *ppTree = pNew
f2e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f2f0: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
f300: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66 74 73 33  unction for fts3
f310: 4e 6f 64 65 57 72 69 74 65 28 29 2e 0a 2a 2f 0a  NodeWrite()..*/.
f320: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54  static int fts3T
f330: 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 0a 20  reeFinishNode(. 
f340: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54   SegmentNode *pT
f350: 72 65 65 2c 20 0a 20 20 69 6e 74 20 69 48 65 69  ree, .  int iHei
f360: 67 68 74 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  ght, .  sqlite3_
f370: 69 6e 74 36 34 20 69 4c 65 66 74 43 68 69 6c 64  int64 iLeftChild
f380: 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74 61 72 74  .){.  int nStart
f390: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 48 65 69  ;.  assert( iHei
f3a0: 67 68 74 3e 3d 31 20 26 26 20 69 48 65 69 67 68  ght>=1 && iHeigh
f3b0: 74 3c 31 32 38 20 29 3b 0a 20 20 6e 53 74 61 72  t<128 );.  nStar
f3c0: 74 20 3d 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  t = FTS3_VARINT_
f3d0: 4d 41 58 20 2d 20 73 71 6c 69 74 65 33 46 74 73  MAX - sqlite3Fts
f3e0: 33 56 61 72 69 6e 74 4c 65 6e 28 69 4c 65 66 74  3VarintLen(iLeft
f3f0: 43 68 69 6c 64 29 3b 0a 20 20 70 54 72 65 65 2d  Child);.  pTree-
f400: 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 20 3d  >aData[nStart] =
f410: 20 28 63 68 61 72 29 69 48 65 69 67 68 74 3b 0a   (char)iHeight;.
f420: 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74    sqlite3Fts3Put
f430: 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61  Varint(&pTree->a
f440: 44 61 74 61 5b 6e 53 74 61 72 74 2b 31 5d 2c 20  Data[nStart+1], 
f450: 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 72  iLeftChild);.  r
f460: 65 74 75 72 6e 20 6e 53 74 61 72 74 3b 0a 7d 0a  eturn nStart;.}.
f470: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
f480: 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 65 20   buffer for the 
f490: 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 70 54 72  segment node pTr
f4a0: 65 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  ee and all of it
f4b0: 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 0a 2a  s peers to the.*
f4c0: 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 6e  * database. Then
f4d0: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
f4e0: 69 6f 6e 20 72 65 63 75 72 73 69 76 65 6c 79 20  ion recursively 
f4f0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 61 72  to write the par
f500: 65 6e 74 20 6f 66 20 0a 2a 2a 20 70 54 72 65 65  ent of .** pTree
f510: 20 61 6e 64 20 69 74 73 20 70 65 65 72 73 20 74   and its peers t
f520: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
f530: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
f540: 66 20 70 54 72 65 65 20 69 73 20 61 20 72 6f 6f  f pTree is a roo
f550: 74 20 6e 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 77  t node, do not w
f560: 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 64  rite it to the d
f570: 61 74 61 62 61 73 65 2e 20 49 6e 73 74 65 61 64  atabase. Instead
f580: 2c 0a 2a 2a 20 73 65 74 20 6f 75 74 70 75 74 20  ,.** set output 
f590: 76 61 72 69 61 62 6c 65 73 20 2a 70 61 52 6f 6f  variables *paRoo
f5a0: 74 20 61 6e 64 20 2a 70 6e 52 6f 6f 74 20 74 6f  t and *pnRoot to
f5b0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 6f   contain the roo
f5c0: 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  t node..**.** If
f5d0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
f5e0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f5f0: 65 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76 61  ed and output va
f600: 72 69 61 62 6c 65 20 2a 70 69 4c 61 73 74 20 69  riable *piLast i
f610: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20  s.** set to the 
f620: 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64 20  largest blockid 
f630: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
f640: 61 74 61 62 61 73 65 20 28 6f 72 20 7a 65 72 6f  atabase (or zero
f650: 20 69 66 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b 73   if no.** blocks
f660: 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 74 6f   were written to
f670: 20 74 68 65 20 64 62 29 2e 20 4f 74 68 65 72 77   the db). Otherw
f680: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
f690: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
f6a0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f6b0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64  atic int fts3Nod
f6c0: 65 57 72 69 74 65 28 0a 20 20 46 74 73 33 54 61  eWrite(.  Fts3Ta
f6d0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
f6e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
f6f0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
f700: 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  e */.  SegmentNo
f710: 64 65 20 2a 70 54 72 65 65 2c 20 20 20 20 20 20  de *pTree,      
f720: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
f730: 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  tNode handle */.
f740: 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 20    int iHeight,  
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 74    /* Height of t
f770: 68 69 73 20 6e 6f 64 65 20 69 6e 20 74 72 65 65  his node in tree
f780: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
f790: 74 36 34 20 69 4c 65 61 66 2c 20 20 20 20 20 20  t64 iLeaf,      
f7a0: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69        /* Block i
f7b0: 64 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66 20  d of first leaf 
f7c0: 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
f7d0: 33 5f 69 6e 74 36 34 20 69 46 72 65 65 2c 20 20  3_int64 iFree,  
f7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
f7f0: 63 6b 20 69 64 20 6f 66 20 6e 65 78 74 20 66 72  ck id of next fr
f800: 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67  ee slot in %_seg
f810: 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ments */.  sqlit
f820: 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c 61 73 74  e3_int64 *piLast
f830: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  ,          /* OU
f840: 54 3a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6c  T: Block id of l
f850: 61 73 74 20 65 6e 74 72 79 20 77 72 69 74 74 65  ast entry writte
f860: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61  n */.  char **pa
f870: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
f880: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
f890: 61 74 61 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64  ata for root nod
f8a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 6f  e */.  int *pnRo
f8b0: 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
f8c0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
f8d0: 69 7a 65 20 6f 66 20 72 6f 6f 74 20 6e 6f 64 65  ize of root node
f8e0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
f8f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f900: 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 54  E_OK;..  if( !pT
f910: 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a  ree->pParent ){.
f920: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65      /* Root node
f930: 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a 2f   of the tree. */
f940: 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74 20  .    int nStart 
f950: 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68  = fts3TreeFinish
f960: 4e 6f 64 65 28 70 54 72 65 65 2c 20 69 48 65 69  Node(pTree, iHei
f970: 67 68 74 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20  ght, iLeaf);.   
f980: 20 2a 70 69 4c 61 73 74 20 3d 20 69 46 72 65 65   *piLast = iFree
f990: 2d 31 3b 0a 20 20 20 20 2a 70 6e 52 6f 6f 74 20  -1;.    *pnRoot 
f9a0: 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 2d  = pTree->nData -
f9b0: 20 6e 53 74 61 72 74 3b 0a 20 20 20 20 2a 70 61   nStart;.    *pa
f9c0: 52 6f 6f 74 20 3d 20 26 70 54 72 65 65 2d 3e 61  Root = &pTree->a
f9d0: 44 61 74 61 5b 6e 53 74 61 72 74 5d 3b 0a 20 20  Data[nStart];.  
f9e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 53 65 67 6d 65  }else{.    Segme
f9f0: 6e 74 4e 6f 64 65 20 2a 70 49 74 65 72 3b 0a 20  ntNode *pIter;. 
fa00: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
fa10: 20 69 4e 65 78 74 46 72 65 65 20 3d 20 69 46 72   iNextFree = iFr
fa20: 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ee;.    sqlite3_
fa30: 69 6e 74 36 34 20 69 4e 65 78 74 4c 65 61 66 20  int64 iNextLeaf 
fa40: 3d 20 69 4c 65 61 66 3b 0a 20 20 20 20 66 6f 72  = iLeaf;.    for
fa50: 28 70 49 74 65 72 3d 70 54 72 65 65 2d 3e 70 4c  (pIter=pTree->pL
fa60: 65 66 74 6d 6f 73 74 3b 20 70 49 74 65 72 20 26  eftmost; pIter &
fa70: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
fa80: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 52   pIter=pIter->pR
fa90: 69 67 68 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  ight){.      int
faa0: 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54 72   nStart = fts3Tr
fab0: 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 49 74  eeFinishNode(pIt
fac0: 65 72 2c 20 69 48 65 69 67 68 74 2c 20 69 4e 65  er, iHeight, iNe
fad0: 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  xtLeaf);.      i
fae0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 70 49 74 65  nt nWrite = pIte
faf0: 72 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61 72  r->nData - nStar
fb00: 74 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d  t;.  .      rc =
fb10: 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
fb20: 74 28 70 2c 20 69 4e 65 78 74 46 72 65 65 2c 20  t(p, iNextFree, 
fb30: 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 6e 53  &pIter->aData[nS
fb40: 74 61 72 74 5d 2c 20 6e 57 72 69 74 65 29 3b 0a  tart], nWrite);.
fb50: 20 20 20 20 20 20 69 4e 65 78 74 46 72 65 65 2b        iNextFree+
fb60: 2b 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 4c 65  +;.      iNextLe
fb70: 61 66 20 2b 3d 20 28 70 49 74 65 72 2d 3e 6e 45  af += (pIter->nE
fb80: 6e 74 72 79 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  ntry+1);.    }. 
fb90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
fba0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
fbb0: 73 65 72 74 28 20 69 4e 65 78 74 4c 65 61 66 3d  sert( iNextLeaf=
fbc0: 3d 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20  =iFree );.      
fbd0: 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69  rc = fts3NodeWri
fbe0: 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  te(.          p,
fbf0: 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 2c   pTree->pParent,
fc00: 20 69 48 65 69 67 68 74 2b 31 2c 20 69 46 72 65   iHeight+1, iFre
fc10: 65 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 70 69  e, iNextFree, pi
fc20: 4c 61 73 74 2c 20 70 61 52 6f 6f 74 2c 20 70 6e  Last, paRoot, pn
fc30: 52 6f 6f 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  Root.      );.  
fc40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
fc50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
fc60: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
fc70: 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63  llocations assoc
fc80: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
fc90: 72 65 65 20 70 54 72 65 65 2e 0a 2a 2f 0a 73 74  ree pTree..*/.st
fca0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4e 6f  atic void fts3No
fcb0: 64 65 46 72 65 65 28 53 65 67 6d 65 6e 74 4e 6f  deFree(SegmentNo
fcc0: 64 65 20 2a 70 54 72 65 65 29 7b 0a 20 20 69 66  de *pTree){.  if
fcd0: 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53  ( pTree ){.    S
fce0: 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 20 3d 20  egmentNode *p = 
fcf0: 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74  pTree->pLeftmost
fd00: 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64 65 46 72  ;.    fts3NodeFr
fd10: 65 65 28 70 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  ee(p->pParent);.
fd20: 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a      while( p ){.
fd30: 20 20 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64        SegmentNod
fd40: 65 20 2a 70 52 69 67 68 74 20 3d 20 70 2d 3e 70  e *pRight = p->p
fd50: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
fd60: 20 70 2d 3e 61 44 61 74 61 21 3d 28 63 68 61 72   p->aData!=(char
fd70: 20 2a 29 26 70 5b 31 5d 20 29 7b 0a 20 20 20 20   *)&p[1] ){.    
fd80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fd90: 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  (p->aData);.    
fda0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
fdb0: 28 20 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ( pRight==0 || p
fdc0: 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  ->zMalloc==0 );.
fdd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
fde0: 65 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  ee(p->zMalloc);.
fdf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
fe00: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 70 20 3d  ee(p);.      p =
fe10: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20   pRight;.    }. 
fe20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
fe30: 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 73 65  a term to the se
fe40: 67 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 6e 73  gment being cons
fe50: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 53  tructed by the S
fe60: 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a  egmentWriter obj
fe70: 65 63 74 0a 2a 2a 20 2a 70 70 57 72 69 74 65 72  ect.** *ppWriter
fe80: 2e 20 57 68 65 6e 20 61 64 64 69 6e 67 20 74 68  . When adding th
fe90: 65 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f 20  e first term to 
fea0: 61 20 73 65 67 6d 65 6e 74 2c 20 2a 70 70 57 72  a segment, *ppWr
feb0: 69 74 65 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  iter should.** b
fec0: 65 20 70 61 73 73 65 64 20 4e 55 4c 4c 2e 20 54  e passed NULL. T
fed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
fee0: 6c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  l allocate a new
fef0: 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f   SegmentWriter o
ff00: 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 72 65 74  bject.** and ret
ff10: 75 72 6e 20 69 74 20 76 69 61 20 74 68 65 20 69  urn it via the i
ff20: 6e 70 75 74 2f 6f 75 74 70 75 74 20 76 61 72 69  nput/output vari
ff30: 61 62 6c 65 20 2a 70 70 57 72 69 74 65 72 20 69  able *ppWriter i
ff40: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
ff50: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
ff60: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
ff70: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
ff80: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
ff90: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
ffa0: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 57  tic int fts3SegW
ffb0: 72 69 74 65 72 41 64 64 28 0a 20 20 46 74 73 33  riterAdd(.  Fts3
ffc0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
ffe0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
fff0: 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  dle */.  Segment
10000 57 72 69 74 65 72 20 2a 2a 70 70 57 72 69 74 65  Writer **ppWrite
10010 72 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  r,       /* IN/O
10020 55 54 3a 20 53 65 67 6d 65 6e 74 57 72 69 74 65  UT: SegmentWrite
10030 72 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69  r handle */ .  i
10040 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 20  nt isCopyTerm,  
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10060 2a 20 54 72 75 65 20 69 66 20 62 75 66 66 65 72  * True if buffer
10070 20 7a 54 65 72 6d 20 6d 75 73 74 20 62 65 20 63   zTerm must be c
10080 6f 70 69 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  opied */.  const
10090 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
100a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
100b0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
100c0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
100d0 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10100 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  term in bytes */
10110 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
10120 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20  Doclist,        
10130 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
10140 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
10150 6e 67 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  ng doclist */.  
10160 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20 20  int nDoclist    
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
10190 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  st in bytes */.)
101a0 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  {.  int nPrefix;
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
101d0 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62 79  erm prefix in by
101e0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  tes */.  int nSu
101f0 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
10200 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10210 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20   of term suffix 
10220 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
10230 74 20 6e 52 65 71 3b 20 20 20 20 20 20 20 20 20  t nReq;         
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10250 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10260 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65 61   required on lea
10270 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  f page */.  int 
10280 6e 44 61 74 61 3b 0a 20 20 53 65 67 6d 65 6e 74  nData;.  Segment
10290 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
102a0 3d 20 2a 70 70 57 72 69 74 65 72 3b 0a 0a 20 20  = *ppWriter;..  
102b0 69 66 28 20 21 70 57 72 69 74 65 72 20 29 7b 0a  if( !pWriter ){.
102c0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
102d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
102e0 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  tmt;..    /* All
102f0 6f 63 61 74 65 20 74 68 65 20 53 65 67 6d 65 6e  ocate the Segmen
10300 74 57 72 69 74 65 72 20 73 74 72 75 63 74 75 72  tWriter structur
10310 65 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72  e */.    pWriter
10320 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74 65   = (SegmentWrite
10330 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
10340 6f 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e  oc(sizeof(Segmen
10350 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 69  tWriter));.    i
10360 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72 65  f( !pWriter ) re
10370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10380 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57  M;.    memset(pW
10390 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
103a0 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29  (SegmentWriter))
103b0 3b 0a 20 20 20 20 2a 70 70 57 72 69 74 65 72 20  ;.    *ppWriter 
103c0 3d 20 70 57 72 69 74 65 72 3b 0a 0a 20 20 20 20  = pWriter;..    
103d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* Allocate a bu
103e0 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
103f0 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61 74 61   accumulate data
10400 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72 2d   */.    pWriter-
10410 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a  >aData = (char *
10420 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
10430 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20  p->nNodeSize);. 
10440 20 20 20 69 66 28 20 21 70 57 72 69 74 65 72 2d     if( !pWriter-
10450 3e 61 44 61 74 61 20 29 20 72 65 74 75 72 6e 20  >aData ) return 
10460 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10470 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65    pWriter->nSize
10480 20 3d 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 3b   = p->nNodeSize;
10490 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
104a0 65 20 6e 65 78 74 20 66 72 65 65 20 62 6c 6f 63  e next free bloc
104b0 6b 69 64 20 69 6e 20 74 68 65 20 25 5f 73 65 67  kid in the %_seg
104c0 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a 20  ments table */. 
104d0 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
104e0 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f  tmt(p, SQL_NEXT_
104f0 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70 53  SEGMENTS_ID, &pS
10500 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
10510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10520 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10530 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
10540 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
10550 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 70 57 72  mt) ){.      pWr
10560 69 74 65 72 2d 3e 69 46 72 65 65 20 3d 20 73 71  iter->iFree = sq
10570 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
10580 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  64(pStmt, 0);.  
10590 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69      pWriter->iFi
105a0 72 73 74 20 3d 20 70 57 72 69 74 65 72 2d 3e 69  rst = pWriter->i
105b0 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
105c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
105d0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  et(pStmt);.    i
105e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
105f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
10600 7d 0a 20 20 6e 44 61 74 61 20 3d 20 70 57 72 69  }.  nData = pWri
10610 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 0a 20 20 6e  ter->nData;..  n
10620 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72 65  Prefix = fts3Pre
10630 66 69 78 43 6f 6d 70 72 65 73 73 28 70 57 72 69  fixCompress(pWri
10640 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 57 72 69  ter->zTerm, pWri
10650 74 65 72 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72  ter->nTerm, zTer
10660 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e 53 75  m, nTerm);.  nSu
10670 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72  ffix = nTerm-nPr
10680 65 66 69 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  efix;..  /* Figu
10690 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
106a0 62 79 74 65 73 20 61 72 65 20 72 65 71 75 69 72  bytes are requir
106b0 65 64 20 62 79 20 74 68 69 73 20 6e 65 77 20 65  ed by this new e
106c0 6e 74 72 79 20 2a 2f 0a 20 20 6e 52 65 71 20 3d  ntry */.  nReq =
106d0 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
106e0 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 20 2b  ntLen(nPrefix) +
106f0 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f      /* varint co
10700 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
10710 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
10720 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
10730 28 6e 53 75 66 66 69 78 29 20 2b 20 20 20 20 20  (nSuffix) +     
10740 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f      /* varint co
10750 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69 78 20  ntaining suffix 
10760 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6e 53 75 66  size */.    nSuf
10770 66 69 78 20 2b 20 20 20 20 20 20 20 20 20 20 20  fix +           
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10790 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75 66 66      /* Term suff
107a0 69 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ix */.    sqlite
107b0 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
107c0 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20 20  Doclist) +      
107d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
107e0 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6e 44 6f 63  list */.    nDoc
107f0 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64      /* Doclist d
10820 61 74 61 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 44  ata */..  if( nD
10830 61 74 61 3e 30 20 26 26 20 6e 44 61 74 61 2b 6e  ata>0 && nData+n
10840 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  Req>p->nNodeSize
10850 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
10860 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72  .    /* The curr
10870 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65 20 69 73  ent leaf node is
10880 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20   full. Write it 
10890 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
108a0 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ase. */.    rc =
108b0 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
108c0 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 46  t(p, pWriter->iF
108d0 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e  ree++, pWriter->
108e0 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  aData, nData);. 
108f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10900 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10910 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
10920 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 74  e current term t
10930 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  o the interior n
10940 6f 64 65 20 74 72 65 65 2e 20 54 68 65 20 74 65  ode tree. The te
10950 72 6d 20 61 64 64 65 64 20 74 6f 0a 20 20 20 20  rm added to.    
10960 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  ** the interior 
10970 74 72 65 65 20 6d 75 73 74 3a 0a 20 20 20 20 2a  tree must:.    *
10980 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65  *.    **   a) be
10990 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
109a0 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f  e largest term o
109b0 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  n the leaf node 
109c0 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20  just written.   
109d0 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20   **      to the 
109e0 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20  database (still 
109f0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 57 72  available in pWr
10a00 69 74 65 72 2d 3e 7a 54 65 72 6d 29 2c 20 61 6e  iter->zTerm), an
10a10 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  d.    **.    ** 
10a20 20 20 62 29 20 62 65 20 6c 65 73 73 20 74 68 61    b) be less tha
10a30 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
10a40 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74 6f 20  e term about to 
10a50 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
10a60 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  new.    **      
10a70 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d  leaf node (zTerm
10a80 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a  /nTerm)..    **.
10a90 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20      ** In other 
10aa0 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74 20 62  words, it must b
10ab0 65 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20  e the prefix of 
10ac0 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e  zTerm 1 byte lon
10ad0 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ger than.    ** 
10ae0 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
10af0 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20 7a 54  x (if any) of zT
10b00 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65 72 2d  erm and pWriter-
10b10 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20  >zTerm..    */. 
10b20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66     assert( nPref
10b30 69 78 3c 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20  ix<nTerm );.    
10b40 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64  rc = fts3NodeAdd
10b50 54 65 72 6d 28 70 2c 20 26 70 57 72 69 74 65 72  Term(p, &pWriter
10b60 2d 3e 70 54 72 65 65 2c 20 69 73 43 6f 70 79 54  ->pTree, isCopyT
10b70 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 50 72 65  erm, zTerm, nPre
10b80 66 69 78 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  fix+1);.    if( 
10b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
10ba0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
10bb0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  nData = 0;.    p
10bc0 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20  Writer->nTerm = 
10bd0 30 3b 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20  0;..    nPrefix 
10be0 3d 20 30 3b 0a 20 20 20 20 6e 53 75 66 66 69 78  = 0;.    nSuffix
10bf0 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e 52   = nTerm;.    nR
10c00 65 71 20 3d 20 31 20 2b 20 20 20 20 20 20 20 20  eq = 1 +        
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20        /* varint 
10c30 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
10c40 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  x size */.      
10c50 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
10c60 74 4c 65 6e 28 6e 54 65 72 6d 29 20 2b 20 20 20  tLen(nTerm) +   
10c70 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20        /* varint 
10c80 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69  containing suffi
10c90 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  x size */.      
10ca0 6e 54 65 72 6d 20 2b 20 20 20 20 20 20 20 20 20  nTerm +         
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75        /* Term su
10cd0 66 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 73 71  ffix */.      sq
10ce0 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
10cf0 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20  en(nDoclist) +  
10d00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
10d10 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  oclist */.      
10d20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d40 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74        /* Doclist
10d50 20 64 61 74 61 20 2a 2f 0a 20 20 7d 0a 0a 20 20   data */.  }..  
10d60 2f 2a 20 49 66 20 74 68 65 20 62 75 66 66 65 72  /* If the buffer
10d70 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63   currently alloc
10d80 61 74 65 64 20 69 73 20 74 6f 6f 20 73 6d 61 6c  ated is too smal
10d90 6c 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79  l for this entry
10da0 2c 20 72 65 61 6c 6c 6f 63 0a 20 20 2a 2a 20 74  , realloc.  ** t
10db0 68 65 20 62 75 66 66 65 72 20 74 6f 20 6d 61 6b  he buffer to mak
10dc0 65 20 69 74 20 6c 61 72 67 65 20 65 6e 6f 75 67  e it large enoug
10dd0 68 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 52  h..  */.  if( nR
10de0 65 71 3e 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a  eq>pWriter->nSiz
10df0 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61  e ){.    char *a
10e00 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
10e10 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 61  alloc(pWriter->a
10e20 44 61 74 61 2c 20 6e 52 65 71 29 3b 0a 20 20 20  Data, nReq);.   
10e30 20 69 66 28 20 21 61 4e 65 77 20 29 20 72 65 74   if( !aNew ) ret
10e40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10e50 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61  ;.    pWriter->a
10e60 44 61 74 61 20 3d 20 61 4e 65 77 3b 0a 20 20 20  Data = aNew;.   
10e70 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20   pWriter->nSize 
10e80 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a 20 20 61 73  = nReq;.  }.  as
10e90 73 65 72 74 28 20 6e 44 61 74 61 2b 6e 52 65 71  sert( nData+nReq
10ea0 3c 3d 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65  <=pWriter->nSize
10eb0 20 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64   );..  /* Append
10ec0 20 74 68 65 20 70 72 65 66 69 78 2d 63 6f 6d 70   the prefix-comp
10ed0 72 65 73 73 65 64 20 74 65 72 6d 20 61 6e 64 20  ressed term and 
10ee0 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 62  doclist to the b
10ef0 75 66 66 65 72 2e 20 2a 2f 0a 20 20 6e 44 61 74  uffer. */.  nDat
10f00 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
10f10 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74  PutVarint(&pWrit
10f20 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
10f30 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e 44  , nPrefix);.  nD
10f40 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
10f50 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 57 72  s3PutVarint(&pWr
10f60 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74  iter->aData[nDat
10f70 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  a], nSuffix);.  
10f80 6d 65 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d  memcpy(&pWriter-
10f90 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26  >aData[nData], &
10fa0 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20  zTerm[nPrefix], 
10fb0 6e 53 75 66 66 69 78 29 3b 0a 20 20 6e 44 61 74  nSuffix);.  nDat
10fc0 61 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20  a += nSuffix;.  
10fd0 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
10fe0 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
10ff0 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
11000 61 74 61 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  ata], nDoclist);
11010 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69 74  .  memcpy(&pWrit
11020 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
11030 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63  , aDoclist, nDoc
11040 6c 69 73 74 29 3b 0a 20 20 70 57 72 69 74 65 72  list);.  pWriter
11050 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61 20  ->nData = nData 
11060 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f  + nDoclist;..  /
11070 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
11080 6e 74 20 74 65 72 6d 20 73 6f 20 74 68 61 74 20  nt term so that 
11090 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  it can be used t
110a0 6f 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73  o prefix-compres
110b0 73 20 74 68 65 20 6e 65 78 74 2e 0a 20 20 2a 2a  s the next..  **
110c0 20 49 66 20 74 68 65 20 69 73 43 6f 70 79 54 65   If the isCopyTe
110d0 72 6d 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  rm parameter is 
110e0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 62  true, then the b
110f0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
11100 20 62 79 0a 20 20 2a 2a 20 7a 54 65 72 6d 20 69   by.  ** zTerm i
11110 73 20 74 72 61 6e 73 69 65 6e 74 2c 20 73 6f 20  s transient, so 
11120 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  take a copy of t
11130 68 65 20 74 65 72 6d 20 64 61 74 61 2e 20 4f 74  he term data. Ot
11140 68 65 72 77 69 73 65 2c 20 6a 75 73 74 0a 20 20  herwise, just.  
11150 2a 2a 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20  ** store a copy 
11160 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  of the pointer..
11170 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 70    */.  if( isCop
11180 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  yTerm ){.    if(
11190 20 6e 54 65 72 6d 3e 70 57 72 69 74 65 72 2d 3e   nTerm>pWriter->
111a0 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  nMalloc ){.     
111b0 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71   char *zNew = sq
111c0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57  lite3_realloc(pW
111d0 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20  riter->zMalloc, 
111e0 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20  nTerm*2);.      
111f0 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20  if( !zNew ){.   
11200 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11210 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11220 7d 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  }.      pWriter-
11230 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d  >nMalloc = nTerm
11240 2a 32 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  *2;.      pWrite
11250 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65  r->zMalloc = zNe
11260 77 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  w;.      pWriter
11270 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a  ->zTerm = zNew;.
11280 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
11290 28 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d  ( pWriter->zTerm
112a0 3d 3d 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c  ==pWriter->zMall
112b0 6f 63 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  oc );.    memcpy
112c0 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2c  (pWriter->zTerm,
112d0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
112e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 72    }else{.    pWr
112f0 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63  iter->zTerm = (c
11300 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 7d  har *)zTerm;.  }
11310 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72  .  pWriter->nTer
11320 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 72 65  m = nTerm;..  re
11330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11340 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
11350 6c 6c 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ll data associat
11360 65 64 20 77 69 74 68 20 74 68 65 20 53 65 67 6d  ed with the Segm
11370 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74  entWriter object
11380 20 70 57 72 69 74 65 72 20 74 6f 20 74 68 65 0a   pWriter to the.
11390 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
113a0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
113b0 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
113c0 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20 62  all terms have b
113d0 65 65 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  een added.** to 
113e0 74 68 65 20 73 65 67 6d 65 6e 74 20 75 73 69 6e  the segment usin
113f0 67 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41  g fts3SegWriterA
11400 64 64 28 29 2e 20 49 66 20 73 75 63 63 65 73 73  dd(). If success
11410 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
11420 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
11430 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
11440 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
11450 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
11460 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68  s3SegWriterFlush
11470 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
11480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11490 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
114a0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
114b0 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a   SegmentWriter *
114c0 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
114d0 20 2f 2a 20 53 65 67 6d 65 6e 74 57 72 69 74 65   /* SegmentWrite
114e0 72 20 74 6f 20 66 6c 75 73 68 20 74 6f 20 74 68  r to flush to th
114f0 65 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  e db */.  int iL
11500 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
11510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
11520 75 65 20 66 6f 72 20 27 6c 65 76 65 6c 27 20 63  ue for 'level' c
11530 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69  olumn of %_segdi
11540 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  r */.  int iIdx 
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11560 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
11570 66 6f 72 20 27 69 64 78 27 20 63 6f 6c 75 6d 6e  for 'idx' column
11580 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a   of %_segdir */.
11590 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
115c0 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 57 72  ode */.  if( pWr
115d0 69 74 65 72 2d 3e 70 54 72 65 65 20 29 7b 0a 20  iter->pTree ){. 
115e0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
115f0 20 69 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20   iLast = 0;     
11600 20 2f 2a 20 4c 61 72 67 65 73 74 20 62 6c 6f 63   /* Largest bloc
11610 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  k id written to 
11620 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
11630 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
11640 61 73 74 4c 65 61 66 3b 20 20 20 20 20 20 2f 2a  astLeaf;      /*
11650 20 4c 61 72 67 65 73 74 20 6c 65 61 66 20 62 6c   Largest leaf bl
11660 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74  ock id written t
11670 6f 20 64 62 20 2a 2f 0a 20 20 20 20 63 68 61 72  o db */.    char
11680 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55 4c 4c 3b 20   *zRoot = NULL; 
11690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
116a0 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
116b0 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e  ontaining root n
116c0 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ode */.    int n
116d0 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Root = 0;       
116e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
116f0 20 6f 66 20 62 75 66 66 65 72 20 7a 52 6f 6f 74   of buffer zRoot
11700 20 2a 2f 0a 0a 20 20 20 20 69 4c 61 73 74 4c 65   */..    iLastLe
11710 61 66 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 46  af = pWriter->iF
11720 72 65 65 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  ree;.    rc = ft
11730 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
11740 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65  , pWriter->iFree
11750 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61  ++, pWriter->aDa
11760 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  ta, pWriter->nDa
11770 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ta);.    if( rc=
11780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11790 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64      rc = fts3Nod
117a0 65 57 72 69 74 65 28 70 2c 20 70 57 72 69 74 65  eWrite(p, pWrite
117b0 72 2d 3e 70 54 72 65 65 2c 20 31 2c 0a 20 20 20  r->pTree, 1,.   
117c0 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
117d0 69 46 69 72 73 74 2c 20 70 57 72 69 74 65 72 2d  iFirst, pWriter-
117e0 3e 69 46 72 65 65 2c 20 26 69 4c 61 73 74 2c 20  >iFree, &iLast, 
117f0 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f 6f 74 29 3b  &zRoot, &nRoot);
11800 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
11810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11820 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57        rc = fts3W
11830 72 69 74 65 53 65 67 64 69 72 28 0a 20 20 20 20  riteSegdir(.    
11840 20 20 20 20 20 20 70 2c 20 69 4c 65 76 65 6c 2c        p, iLevel,
11850 20 69 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e   iIdx, pWriter->
11860 69 46 69 72 73 74 2c 20 69 4c 61 73 74 4c 65 61  iFirst, iLastLea
11870 66 2c 20 69 4c 61 73 74 2c 20 7a 52 6f 6f 74 2c  f, iLast, zRoot,
11880 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20   nRoot);.    }. 
11890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
118a0 68 65 20 65 6e 74 69 72 65 20 74 72 65 65 20 66  he entire tree f
118b0 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  its on the root 
118c0 6e 6f 64 65 2e 20 57 72 69 74 65 20 69 74 20 74  node. Write it t
118d0 6f 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62  o the segdir tab
118e0 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  le. */.    rc = 
118f0 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28  fts3WriteSegdir(
11900 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c 65 76  .        p, iLev
11910 65 6c 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c 20  el, iIdx, 0, 0, 
11920 30 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74  0, pWriter->aDat
11930 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74  a, pWriter->nDat
11940 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  a);.  }.  return
11950 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
11960 6c 65 61 73 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  lease all memory
11970 20 68 65 6c 64 20 62 79 20 74 68 65 20 53 65 67   held by the Seg
11980 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63  mentWriter objec
11990 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
119a0 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
119b0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
119c0 69 64 20 66 74 73 33 53 65 67 57 72 69 74 65 72  id fts3SegWriter
119d0 46 72 65 65 28 53 65 67 6d 65 6e 74 57 72 69 74  Free(SegmentWrit
119e0 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
119f0 69 66 28 20 70 57 72 69 74 65 72 20 29 7b 0a 20  if( pWriter ){. 
11a00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11a10 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 29 3b  pWriter->aData);
11a20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
11a30 65 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c  e(pWriter->zMall
11a40 6f 63 29 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64  oc);.    fts3Nod
11a50 65 46 72 65 65 28 70 57 72 69 74 65 72 2d 3e 70  eFree(pWriter->p
11a60 54 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Tree);.    sqlit
11a70 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 29  e3_free(pWriter)
11a80 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
11a90 68 65 20 66 69 72 73 74 20 76 61 6c 75 65 20 69  he first value i
11aa0 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 72  n the apVal[] ar
11ab0 72 61 79 20 69 73 20 61 73 73 75 6d 65 64 20 74  ray is assumed t
11ac0 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  o contain an int
11ad0 65 67 65 72 2e 0a 2a 2a 20 54 68 69 73 20 66 75  eger..** This fu
11ae0 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
11af0 74 68 65 72 65 20 65 78 69 73 74 20 61 6e 79 20  there exist any 
11b00 64 6f 63 75 6d 65 6e 74 73 20 77 69 74 68 20 64  documents with d
11b10 6f 63 69 64 20 76 61 6c 75 65 73 20 74 68 61 74  ocid values that
11b20 0a 2a 2a 20 61 72 65 20 64 69 66 66 65 72 65 6e  .** are differen
11b30 74 20 66 72 6f 6d 20 74 68 61 74 20 69 6e 74 65  t from that inte
11b40 67 65 72 2e 20 69 2e 65 2e 20 69 66 20 64 65 6c  ger. i.e. if del
11b50 65 74 69 6e 67 20 74 68 65 20 64 6f 63 75 6d 65  eting the docume
11b60 6e 74 20 77 69 74 68 20 64 6f 63 69 64 0a 2a 2a  nt with docid.**
11b70 20 70 52 6f 77 69 64 20 77 6f 75 6c 64 20 6d 65   pRowid would me
11b80 61 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  an the FTS3 tabl
11b90 65 20 77 65 72 65 20 65 6d 70 74 79 2e 0a 2a 2a  e were empty..**
11ba0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
11bb0 6c 2c 20 2a 70 69 73 45 6d 70 74 79 20 69 73 20  l, *pisEmpty is 
11bc0 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74  set to true if t
11bd0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
11be0 79 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20  y except for.** 
11bf0 64 6f 63 75 6d 65 6e 74 20 70 52 6f 77 69 64 2c  document pRowid,
11c00 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
11c10 69 73 65 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f  ise, and SQLITE_
11c20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
11c30 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  If an.** error o
11c40 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
11c50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
11c60 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
11c70 69 63 20 69 6e 74 20 66 74 73 33 49 73 45 6d 70  ic int fts3IsEmp
11c80 74 79 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ty(Fts3Table *p,
11c90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
11ca0 70 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69 73  pRowid, int *pis
11cb0 45 6d 70 74 79 29 7b 0a 20 20 73 71 6c 69 74 65  Empty){.  sqlite
11cc0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
11cd0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
11ce0 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 29 7b  ->zContentTbl ){
11cf0 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69 6e 67  .    /* If using
11d00 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78 78   the content=xxx
11d10 20 6f 70 74 69 6f 6e 2c 20 61 73 73 75 6d 65 20   option, assume 
11d20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 65 76  the table is nev
11d30 65 72 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20  er empty */.    
11d40 2a 70 69 73 45 6d 70 74 79 20 3d 20 30 3b 0a 20  *pisEmpty = 0;. 
11d50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
11d60 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
11d70 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
11d80 28 70 2c 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59  (p, SQL_IS_EMPTY
11d90 2c 20 26 70 53 74 6d 74 2c 20 26 70 52 6f 77 69  , &pStmt, &pRowi
11da0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
11db0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11dc0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
11dd0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
11de0 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
11df0 20 20 2a 70 69 73 45 6d 70 74 79 20 3d 20 73 71    *pisEmpty = sq
11e00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
11e10 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
11e20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
11e30 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
11e40 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  mt);.    }.  }. 
11e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11e60 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e 4d 61 78 20  *.** Set *pnMax 
11e70 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 73  to the largest s
11e80 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20 69 6e 20  egment level in 
11e90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
11ea0 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69 49   the index.** iI
11eb0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65 67 6d  ndex..**.** Segm
11ec0 65 6e 74 20 6c 65 76 65 6c 73 20 61 72 65 20 73  ent levels are s
11ed0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 27 6c 65  tored in the 'le
11ee0 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  vel' column of t
11ef0 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
11f00 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
11f10 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
11f20 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
11f30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
11f40 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
11f50 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65  ic int fts3Segme
11f60 6e 74 4d 61 78 4c 65 76 65 6c 28 46 74 73 33 54  ntMaxLevel(Fts3T
11f70 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 49 6e  able *p, int iIn
11f80 64 65 78 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 29  dex, int *pnMax)
11f90 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
11fa0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
11fb0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e  c;.  assert( iIn
11fc0 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78  dex>=0 && iIndex
11fd0 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20  <p->nIndex );.. 
11fe0 20 2f 2a 20 53 65 74 20 70 53 74 6d 74 20 74 6f   /* Set pStmt to
11ff0 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 76 65   the compiled ve
12000 72 73 69 6f 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20  rsion of:.  **. 
12010 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
12020 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e  (level) FROM %Q.
12030 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
12040 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20  E level BETWEEN 
12050 3f 20 41 4e 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a  ? AND ?.  **.  *
12060 2a 20 28 31 30 32 34 20 69 73 20 61 63 74 75 61  * (1024 is actua
12070 6c 6c 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66  lly the value of
12080 20 6d 61 63 72 6f 20 46 54 53 33 5f 53 45 47 44   macro FTS3_SEGD
12090 49 52 5f 50 52 45 46 49 58 4c 45 56 45 4c 5f 53  IR_PREFIXLEVEL_S
120a0 54 52 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  TR)..  */.  rc =
120b0 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
120c0 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49  SQL_SELECT_SEGDI
120d0 52 5f 4d 41 58 5f 4c 45 56 45 4c 2c 20 26 70 53  R_MAX_LEVEL, &pS
120e0 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
120f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
12100 65 74 75 72 6e 20 72 63 3b 0a 20 20 73 71 6c 69  eturn rc;.  sqli
12110 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
12120 6d 74 2c 20 31 2c 20 69 49 6e 64 65 78 2a 46 54  mt, 1, iIndex*FT
12130 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
12140 45 4c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  EL);.  sqlite3_b
12150 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32  ind_int(pStmt, 2
12160 2c 20 28 69 49 6e 64 65 78 2b 31 29 2a 46 54 53  , (iIndex+1)*FTS
12170 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
12180 4c 20 2d 20 31 29 3b 0a 20 20 69 66 28 20 53 51  L - 1);.  if( SQ
12190 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
121a0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
121b0 0a 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71  .    *pnMax = sq
121c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
121d0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
121e0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
121f0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d  _reset(pStmt);.}
12200 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12210 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 66  ction is used af
12220 74 65 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74  ter merging mult
12230 69 70 6c 65 20 73 65 67 6d 65 6e 74 73 20 69 6e  iple segments in
12240 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67  to a single larg
12250 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20  e.** segment to 
12260 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c 20  delete the old, 
12270 6e 6f 77 20 72 65 64 75 6e 64 61 6e 74 2c 20 73  now redundant, s
12280 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20  egment b-trees. 
12290 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a  Specifically,.**
122a0 20 69 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29   it:.** .**   1)
122b0 20 44 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73   Deletes all %_s
122c0 65 67 6d 65 6e 74 73 20 65 6e 74 72 69 65 73 20  egments entries 
122d0 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74 73  for the segments
122e0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
122f0 20 0a 2a 2a 20 20 20 20 20 20 65 61 63 68 20 6f   .**      each o
12300 66 20 74 68 65 20 53 65 67 52 65 61 64 65 72 20  f the SegReader 
12310 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 61  objects in the a
12320 72 72 61 79 20 70 61 73 73 65 64 20 61 73 20 74  rray passed as t
12330 68 65 20 74 68 69 72 64 20 0a 2a 2a 20 20 20 20  he third .**    
12340 20 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a    argument, and.
12350 2a 2a 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65 74  **.**   2) delet
12360 65 73 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 20  es all %_segdir 
12370 65 6e 74 72 69 65 73 20 77 69 74 68 20 6c 65 76  entries with lev
12380 65 6c 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c  el iLevel, or al
12390 6c 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20  l %_segdir.**   
123a0 20 20 20 65 6e 74 72 69 65 73 20 72 65 67 61 72     entries regar
123b0 64 6c 65 73 73 20 6f 66 20 6c 65 76 65 6c 20 69  dless of level i
123c0 66 20 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a  f (iLevel<0)..**
123d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
123e0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
123f0 63 65 73 73 66 75 6c 2c 20 6f 74 68 65 72 77 69  cessful, otherwi
12400 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
12410 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
12420 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74  ic int fts3Delet
12430 65 53 65 67 64 69 72 28 0a 20 20 46 74 73 33 54  eSegdir(.  Fts3T
12440 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
12450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
12460 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
12470 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  le */.  int iInd
12480 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
12490 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
124a0 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a   for p->aIndex *
124b0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20      /* Level of 
124e0 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69 65 73  %_segdir entries
124f0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
12500 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
12510 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20  apSegment,      
12520 2f 2a 20 41 72 72 61 79 20 6f 66 20 53 65 67 52  /* Array of SegR
12530 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f  eader objects */
12540 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 20 20  .  int nReader  
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
12570 72 61 79 20 61 70 53 65 67 6d 65 6e 74 20 2a 2f  ray apSegment */
12580 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
125b0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  Code */.  int i;
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
125e0 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
125f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
12600 20 2a 70 44 65 6c 65 74 65 3b 20 20 20 20 20 20   *pDelete;      
12610 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
12620 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 72  ment to delete r
12630 6f 77 73 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  ows */..  rc = f
12640 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
12650 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54  L_DELETE_SEGMENT
12660 53 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 74  S_RANGE, &pDelet
12670 65 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30  e, 0);.  for(i=0
12680 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
12690 26 26 20 69 3c 6e 52 65 61 64 65 72 3b 20 69 2b  && i<nReader; i+
126a0 2b 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52  +){.    Fts3SegR
126b0 65 61 64 65 72 20 2a 70 53 65 67 6d 65 6e 74 20  eader *pSegment 
126c0 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a  = apSegment[i];.
126d0 20 20 20 20 69 66 28 20 70 53 65 67 6d 65 6e 74      if( pSegment
126e0 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 29 7b  ->iStartBlock ){
126f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
12700 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74  ind_int64(pDelet
12710 65 2c 20 31 2c 20 70 53 65 67 6d 65 6e 74 2d 3e  e, 1, pSegment->
12720 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20  iStartBlock);.  
12730 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
12740 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20  _int64(pDelete, 
12750 32 2c 20 70 53 65 67 6d 65 6e 74 2d 3e 69 45 6e  2, pSegment->iEn
12760 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 73  dBlock);.      s
12770 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c  qlite3_step(pDel
12780 65 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ete);.      rc =
12790 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
127a0 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 7d 0a 20  Delete);.    }. 
127b0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
127c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
127d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
127e0 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3e 3d  assert( iLevel>=
127f0 30 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 46 54 53  0 || iLevel==FTS
12800 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20  3_SEGCURSOR_ALL 
12810 29 3b 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3d  );.  if( iLevel=
12820 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
12830 41 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALL ){.    rc = 
12840 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
12850 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52  QL_DELETE_SEGDIR
12860 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 74 65  _RANGE, &pDelete
12870 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
12880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12890 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
128a0 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c 20 31  d_int(pDelete, 1
128b0 2c 20 69 49 6e 64 65 78 2a 46 54 53 33 5f 53 45  , iIndex*FTS3_SE
128c0 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 3b 0a  GDIR_MAXLEVEL);.
128d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
128e0 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c 20  nd_int(pDelete, 
128f0 32 2c 20 28 69 49 6e 64 65 78 2b 31 29 20 2a 20  2, (iIndex+1) * 
12900 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
12910 45 56 45 4c 20 2d 20 31 29 3b 0a 20 20 20 20 7d  EVEL - 1);.    }
12920 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
12930 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
12940 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47  , SQL_DELETE_SEG
12950 44 49 52 5f 4c 45 56 45 4c 2c 20 26 70 44 65 6c  DIR_LEVEL, &pDel
12960 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ete, 0);.    if(
12970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12980 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
12990 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65  bind_int(pDelete
129a0 2c 20 31 2c 20 69 49 6e 64 65 78 2a 46 54 53 33  , 1, iIndex*FTS3
129b0 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c  _SEGDIR_MAXLEVEL
129c0 20 2b 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20   + iLevel);.    
129d0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
129e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
129f0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
12a00 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 72 63 20  Delete);.    rc 
12a10 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
12a20 70 44 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20  pDelete);.  }.. 
12a30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12a40 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
12a50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12a60 64 2c 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73  d, buffer *ppLis
12a70 74 20 28 73 69 7a 65 20 2a 70 6e 4c 69 73 74 20  t (size *pnList 
12a80 62 79 74 65 73 29 20 63 6f 6e 74 61 69 6e 73 20  bytes) contains 
12a90 0a 2a 2a 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c  .** a position l
12aa0 69 73 74 20 74 68 61 74 20 6d 61 79 20 28 6f 72  ist that may (or
12ab0 20 6d 61 79 20 6e 6f 74 29 20 66 65 61 74 75 72   may not) featur
12ac0 65 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d  e multiple colum
12ad0 6e 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ns. This.** func
12ae0 74 69 6f 6e 20 61 64 6a 75 73 74 73 20 74 68 65  tion adjusts the
12af0 20 70 6f 69 6e 74 65 72 20 2a 70 70 4c 69 73 74   pointer *ppList
12b00 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 20   and the length 
12b10 2a 70 6e 4c 69 73 74 20 73 6f 20 74 68 61 74 20  *pnList so that 
12b20 74 68 65 79 0a 2a 2a 20 69 64 65 6e 74 69 66 79  they.** identify
12b30 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74   the subset of t
12b40 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
12b50 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
12b60 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  s to column iCol
12b70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
12b80 20 61 72 65 20 6e 6f 20 65 6e 74 72 69 65 73 20   are no entries 
12b90 69 6e 20 74 68 65 20 69 6e 70 75 74 20 70 6f 73  in the input pos
12ba0 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 63  ition list for c
12bb0 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e  olumn iCol, then
12bc0 0a 2a 2a 20 2a 70 6e 4c 69 73 74 20 69 73 20 73  .** *pnList is s
12bd0 65 74 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72  et to zero befor
12be0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
12bf0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
12c00 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20 20  ColumnFilter(.  
12c10 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c  /* Column to fil
12c40 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 68 61 72  ter on */.  char
12c50 20 2a 2a 70 70 4c 69 73 74 2c 20 20 20 20 20 20   **ppList,      
12c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12c70 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  N/OUT: Pointer t
12c80 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  o position list 
12c90 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74  */.  int *pnList
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cb0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
12cc0 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 2a  Size of buffer *
12cd0 70 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73 20  ppList in bytes 
12ce0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 4c  */.){.  char *pL
12cf0 69 73 74 20 3d 20 2a 70 70 4c 69 73 74 3b 0a 20  ist = *ppList;. 
12d00 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 2a 70 6e   int nList = *pn
12d10 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 45  List;.  char *pE
12d20 6e 64 20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69 73  nd = &pList[nLis
12d30 74 5d 3b 0a 20 20 69 6e 74 20 69 43 75 72 72 65  t];.  int iCurre
12d40 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  nt = 0;.  char *
12d50 70 20 3d 20 70 4c 69 73 74 3b 0a 0a 20 20 61 73  p = pList;..  as
12d60 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
12d70 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
12d80 20 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 20     char c = 0;. 
12d90 20 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64     while( p<pEnd
12da0 20 26 26 20 28 63 20 7c 20 2a 70 29 26 30 78 46   && (c | *p)&0xF
12db0 45 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30  E ) c = *p++ & 0
12dc0 78 38 30 3b 0a 20 20 0a 20 20 20 20 69 66 28 20  x80;.  .    if( 
12dd0 69 43 6f 6c 3d 3d 69 43 75 72 72 65 6e 74 20 29  iCol==iCurrent )
12de0 7b 0a 20 20 20 20 20 20 6e 4c 69 73 74 20 3d 20  {.      nList = 
12df0 28 69 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29  (int)(p - pList)
12e00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12e10 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 69 73 74 20     }..    nList 
12e20 2d 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69  -= (int)(p - pLi
12e30 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
12e40 20 70 3b 0a 20 20 20 20 69 66 28 20 6e 4c 69 73   p;.    if( nLis
12e50 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  t==0 ){.      br
12e60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
12e70 20 3d 20 26 70 4c 69 73 74 5b 31 5d 3b 0a 20 20   = &pList[1];.  
12e80 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    p += sqlite3Ft
12e90 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  s3GetVarint32(p,
12ea0 20 26 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d   &iCurrent);.  }
12eb0 0a 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20 70 4c  ..  *ppList = pL
12ec0 69 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74 20 3d  ist;.  *pnList =
12ed0 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nList;.}../*.**
12ee0 20 43 61 63 68 65 20 64 61 74 61 20 69 6e 20 74   Cache data in t
12ef0 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  he Fts3MultiSegR
12f00 65 61 64 65 72 2e 61 42 75 66 66 65 72 5b 5d 20  eader.aBuffer[] 
12f10 62 75 66 66 65 72 20 28 6f 76 65 72 77 72 69 74  buffer (overwrit
12f20 69 6e 67 20 61 6e 79 0a 2a 2a 20 65 78 69 73 74  ing any.** exist
12f30 69 6e 67 20 64 61 74 61 29 2e 20 47 72 6f 77 20  ing data). Grow 
12f40 74 68 65 20 62 75 66 66 65 72 20 69 66 20 72 65  the buffer if re
12f50 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
12f60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
12f70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
12f80 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
12f90 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
12fa0 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 74 72 79 69  ountered.** tryi
12fb0 6e 67 20 74 6f 20 72 65 73 69 7a 65 20 74 68 65  ng to resize the
12fc0 20 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 20   buffer, return 
12fd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
12fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
12ff0 4d 73 72 42 75 66 66 65 72 44 61 74 61 28 0a 20  MsrBufferData(. 
13000 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
13010 64 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20  der *pMsr,      
13020 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e   /* Multi-segmen
13030 74 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20  t-reader handle 
13040 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74  */.  char *pList
13050 2c 0a 20 20 69 6e 74 20 6e 4c 69 73 74 0a 29 7b  ,.  int nList.){
13060 0a 20 20 69 66 28 20 6e 4c 69 73 74 3e 70 4d 73  .  if( nList>pMs
13070 72 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20 20  r->nBuffer ){.  
13080 20 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a 20 20    char *pNew;.  
13090 20 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20    pMsr->nBuffer 
130a0 3d 20 6e 4c 69 73 74 2a 32 3b 0a 20 20 20 20 70  = nList*2;.    p
130b0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
130c0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4d  lite3_realloc(pM
130d0 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 4d 73  sr->aBuffer, pMs
130e0 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20 20 20  r->nBuffer);.   
130f0 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 65 74   if( !pNew ) ret
13100 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13110 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 61 42 75 66  ;.    pMsr->aBuf
13120 66 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  fer = pNew;.  }.
13130 0a 20 20 6d 65 6d 63 70 79 28 70 4d 73 72 2d 3e  .  memcpy(pMsr->
13140 61 42 75 66 66 65 72 2c 20 70 4c 69 73 74 2c 20  aBuffer, pList, 
13150 6e 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  nList);.  return
13160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69   SQLITE_OK;.}..i
13170 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73  nt sqlite3Fts3Ms
13180 72 49 6e 63 72 4e 65 78 74 28 0a 20 20 46 74 73  rIncrNext(.  Fts
13190 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131b0 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
131c0 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75  ndle */.  Fts3Mu
131d0 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 4d  ltiSegReader *pM
131e0 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c  sr,       /* Mul
131f0 74 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64 65  ti-segment-reade
13200 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  r handle */.  sq
13210 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44  lite3_int64 *piD
13220 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a  ocid,         /*
13230 20 4f 55 54 3a 20 44 6f 63 69 64 20 76 61 6c 75   OUT: Docid valu
13240 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61  e */.  char **pa
13250 50 6f 73 6c 69 73 74 2c 20 20 20 20 20 20 20 20  Poslist,        
13260 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
13270 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69  ointer to positi
13280 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  on list */.  int
13290 20 2a 70 6e 50 6f 73 6c 69 73 74 20 20 20 20 20   *pnPoslist     
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
132b0 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73  OUT: Size of pos
132c0 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62 79  ition list in by
132d0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
132e0 6e 4d 65 72 67 65 20 3d 20 70 4d 73 72 2d 3e 6e  nMerge = pMsr->n
132f0 41 64 76 61 6e 63 65 3b 0a 20 20 46 74 73 33 53  Advance;.  Fts3S
13300 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67  egReader **apSeg
13310 6d 65 6e 74 20 3d 20 70 4d 73 72 2d 3e 61 70 53  ment = pMsr->apS
13320 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28 2a  egment;.  int (*
13330 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61  xCmp)(Fts3SegRea
13340 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65  der *, Fts3SegRe
13350 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20  ader *) = (.    
13360 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74  p->bDescIdx ? ft
13370 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69  s3SegReaderDocli
13380 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53  stCmpRev : fts3S
13390 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43  egReaderDoclistC
133a0 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 6e  mp.  );..  if( n
133b0 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Merge==0 ){.    
133c0 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a  *paPoslist = 0;.
133d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
133e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  E_OK;.  }..  whi
133f0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 46 74 73  le( 1 ){.    Fts
13400 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
13410 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 70 4d 73  ;.    pSeg = pMs
13420 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 30 5d 3b  r->apSegment[0];
13430 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ..    if( pSeg->
13440 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 20 29  pOffsetList==0 )
13450 7b 0a 20 20 20 20 20 20 2a 70 61 50 6f 73 6c 69  {.      *paPosli
13460 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  st = 0;.      br
13470 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
13480 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
13490 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 3b      char *pList;
134a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74  .      int nList
134b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
134c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
134d0 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65  64 iDocid = apSe
134e0 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64  gment[0]->iDocid
134f0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ;..      rc = ft
13500 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
13510 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e  ocid(p, apSegmen
13520 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  t[0], &pList, &n
13530 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 6a 20 3d  List);.      j =
13540 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   1;.      while(
13550 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc==SQLITE_OK .
13560 20 20 20 20 20 20 20 20 26 26 20 6a 3c 6e 4d 65          && j<nMe
13570 72 67 65 0a 20 20 20 20 20 20 20 20 26 26 20 61  rge.        && a
13580 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66  pSegment[j]->pOf
13590 66 73 65 74 4c 69 73 74 0a 20 20 20 20 20 20 20  fsetList.       
135a0 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d   && apSegment[j]
135b0 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64  ->iDocid==iDocid
135c0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
135d0 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
135e0 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c  aderNextDocid(p,
135f0 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30   apSegment[j], 0
13600 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 2b  , 0);.        j+
13610 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
13620 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13630 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
13640 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
13650 64 65 72 53 6f 72 74 28 70 4d 73 72 2d 3e 61 70  derSort(pMsr->ap
13660 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c  Segment, nMerge,
13670 20 6a 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 20 20   j, xCmp);..    
13680 20 20 69 66 28 20 70 4d 73 72 2d 3e 69 43 6f 6c    if( pMsr->iCol
13690 46 69 6c 74 65 72 3e 3d 30 20 29 7b 0a 20 20 20  Filter>=0 ){.   
136a0 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46       fts3ColumnF
136b0 69 6c 74 65 72 28 70 4d 73 72 2d 3e 69 43 6f 6c  ilter(pMsr->iCol
136c0 46 69 6c 74 65 72 2c 20 26 70 4c 69 73 74 2c 20  Filter, &pList, 
136d0 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  &nList);.      }
136e0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73  ..      if( nLis
136f0 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  t>0 ){.        i
13700 66 28 20 66 74 73 33 53 65 67 52 65 61 64 65 72  f( fts3SegReader
13710 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d  IsPending(apSegm
13720 65 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ent[0]) ){.     
13730 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4d 73       rc = fts3Ms
13740 72 42 75 66 66 65 72 44 61 74 61 28 70 4d 73 72  rBufferData(pMsr
13750 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2b 31  , pList, nList+1
13760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13780 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13790 20 20 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74        *paPoslist
137a0 20 3d 20 70 4d 73 72 2d 3e 61 42 75 66 66 65 72   = pMsr->aBuffer
137b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
137c0 72 74 28 20 28 70 4d 73 72 2d 3e 61 42 75 66 66  rt( (pMsr->aBuff
137d0 65 72 5b 6e 4c 69 73 74 5d 20 26 20 30 78 46 45  er[nList] & 0xFE
137e0 29 3d 3d 30 78 30 30 20 29 3b 0a 20 20 20 20 20  )==0x00 );.     
137f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13800 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d      *paPoslist =
13810 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   pList;.        
13820 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 44 6f 63  }.        *piDoc
13830 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20  id = iDocid;.   
13840 20 20 20 20 20 2a 70 6e 50 6f 73 6c 69 73 74 20       *pnPoslist 
13850 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = nList;.       
13860 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
13870 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
13880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13890 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
138a0 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28  3SegReaderStart(
138b0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
138e0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
138f0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
13900 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  er *pCsr,       
13910 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  /* Cursor object
13920 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13930 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
13940 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 65        /* Term se
13950 61 72 63 68 65 64 20 66 6f 72 20 28 6f 72 20 4e  arched for (or N
13960 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ULL) */.  int nT
13970 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
13980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
13990 67 74 68 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  gth of zTerm in 
139a0 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bytes */.){.  in
139b0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20  t i;.  int nSeg 
139c0 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  = pCsr->nSegment
139d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46  ;..  /* If the F
139e0 74 73 33 53 65 67 46 69 6c 74 65 72 20 64 65 66  ts3SegFilter def
139f0 69 6e 65 73 20 61 20 73 70 65 63 69 66 69 63 20  ines a specific 
13a00 74 65 72 6d 20 28 6f 72 20 74 65 72 6d 20 70 72  term (or term pr
13a10 65 66 69 78 29 20 74 6f 20 73 65 61 72 63 68 20  efix) to search 
13a20 0a 20 20 2a 2a 20 66 6f 72 2c 20 74 68 65 6e 20  .  ** for, then 
13a30 61 64 76 61 6e 63 65 20 65 61 63 68 20 73 65 67  advance each seg
13a40 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e  ment iterator un
13a50 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
13a60 20 61 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20   a term of.  ** 
13a70 65 71 75 61 6c 20 6f 72 20 67 72 65 61 74 65 72  equal or greater
13a80 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65 20   value than the 
13a90 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20  specified term. 
13aa0 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 6d 61  This prevents ma
13ab0 6e 79 0a 20 20 2a 2a 20 75 6e 6e 65 63 65 73 73  ny.  ** unnecess
13ac0 61 72 79 20 6d 65 72 67 65 2f 73 6f 72 74 20 6f  ary merge/sort o
13ad0 70 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68  perations for th
13ae0 65 20 63 61 73 65 20 77 68 65 72 65 20 73 69 6e  e case where sin
13af0 67 6c 65 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a  gle segment.  **
13b00 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64   b-tree leaf nod
13b10 65 73 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20  es contain more 
13b20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a 20  than one term.. 
13b30 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70   */.  for(i=0; p
13b40 43 73 72 2d 3e 62 52 65 73 74 61 72 74 3d 3d 30  Csr->bRestart==0
13b50 20 26 26 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67   && i<pCsr->nSeg
13b60 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ment; i++){.    
13b70 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
13b80 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65  Seg = pCsr->apSe
13b90 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f  gment[i];.    do
13ba0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20   {.      int rc 
13bb0 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  = fts3SegReaderN
13bc0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
13bd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
13be0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
13bf0 6e 20 72 63 3b 0a 20 20 20 20 7d 77 68 69 6c 65  n rc;.    }while
13c00 28 20 7a 54 65 72 6d 20 26 26 20 66 74 73 33 53  ( zTerm && fts3S
13c10 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70 28  egReaderTermCmp(
13c20 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  pSeg, zTerm, nTe
13c30 72 6d 29 3c 30 20 29 3b 0a 20 20 7d 0a 20 20 66  rm)<0 );.  }.  f
13c40 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74  ts3SegReaderSort
13c50 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
13c60 2c 20 6e 53 65 67 2c 20 6e 53 65 67 2c 20 66 74  , nSeg, nSeg, ft
13c70 73 33 53 65 67 52 65 61 64 65 72 43 6d 70 29 3b  s3SegReaderCmp);
13c80 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
13c90 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  E_OK;.}..int sql
13ca0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
13cb0 72 53 74 61 72 74 28 0a 20 20 46 74 73 33 54 61  rStart(.  Fts3Ta
13cc0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
13cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
13ce0 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
13cf0 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  e */.  Fts3Multi
13d00 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c  SegReader *pCsr,
13d10 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
13d20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
13d30 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c  3SegFilter *pFil
13d40 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
13d50 52 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  Restrictions on 
13d60 72 61 6e 67 65 20 6f 66 20 69 74 65 72 61 74 69  range of iterati
13d70 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 70 43 73 72 2d  on */.){.  pCsr-
13d80 3e 70 46 69 6c 74 65 72 20 3d 20 70 46 69 6c 74  >pFilter = pFilt
13d90 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  er;.  return fts
13da0 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28  3SegReaderStart(
13db0 70 2c 20 70 43 73 72 2c 20 70 46 69 6c 74 65 72  p, pCsr, pFilter
13dc0 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72  ->zTerm, pFilter
13dd0 2d 3e 6e 54 65 72 6d 29 3b 0a 7d 0a 0a 69 6e 74  ->nTerm);.}..int
13de0 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
13df0 6e 63 72 53 74 61 72 74 28 0a 20 20 46 74 73 33  ncrStart(.  Fts3
13e00 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
13e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13e20 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
13e30 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
13e40 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
13e50 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r,       /* Curs
13e60 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  or object */.  i
13e70 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e90 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 6d 61 74 63  * Column to matc
13ea0 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74  h on. */.  const
13eb0 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
13ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
13ed0 72 6d 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  rm to iterate th
13ee0 72 6f 75 67 68 20 61 20 64 6f 63 6c 69 73 74 20  rough a doclist 
13ef0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  for */.  int nTe
13f00 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
13f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13f20 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
13f30 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Term */.){.  int
13f40 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   i;.  int rc;.  
13f50 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70  int nSegment = p
13f60 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  Csr->nSegment;. 
13f70 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73   int (*xCmp)(Fts
13f80 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74  3SegReader *, Ft
13f90 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d  s3SegReader *) =
13fa0 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49   (.    p->bDescI
13fb0 64 78 20 3f 20 66 74 73 33 53 65 67 52 65 61 64  dx ? fts3SegRead
13fc0 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20  erDoclistCmpRev 
13fd0 3a 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44  : fts3SegReaderD
13fe0 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a  oclistCmp.  );..
13ff0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
14000 70 46 69 6c 74 65 72 3d 3d 30 20 29 3b 0a 20 20  pFilter==0 );.  
14010 61 73 73 65 72 74 28 20 7a 54 65 72 6d 20 26 26  assert( zTerm &&
14020 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f   nTerm>0 );..  /
14030 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 73  * Advance each s
14040 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20  egment iterator 
14050 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
14060 74 6f 20 74 68 65 20 74 65 72 6d 20 7a 54 65 72  to the term zTer
14070 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 72 63  m/nTerm. */.  rc
14080 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
14090 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c 20 7a  Start(p, pCsr, z
140a0 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
140b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
140c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
140d0 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 68    /* Determine h
140e0 6f 77 20 6d 61 6e 79 20 6f 66 20 74 68 65 20 73  ow many of the s
140f0 65 67 6d 65 6e 74 73 20 61 63 74 75 61 6c 6c 79  egments actually
14100 20 70 6f 69 6e 74 20 74 6f 20 7a 54 65 72 6d 2f   point to zTerm/
14110 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28  nTerm. */.  for(
14120 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65 6e 74 3b  i=0; i<nSegment;
14130 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53   i++){.    Fts3S
14140 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
14150 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
14160 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 53  [i];.    if( !pS
14170 65 67 2d 3e 61 4e 6f 64 65 20 7c 7c 20 66 74 73  eg->aNode || fts
14180 33 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d  3SegReaderTermCm
14190 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e  p(pSeg, zTerm, n
141a0 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 62  Term) ){.      b
141b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
141c0 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65    pCsr->nAdvance
141d0 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61   = i;..  /* Adva
141e0 6e 63 65 20 65 61 63 68 20 6f 66 20 74 68 65 20  nce each of the 
141f0 73 65 67 6d 65 6e 74 73 20 74 6f 20 70 6f 69 6e  segments to poin
14200 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 64  t to the first d
14210 6f 63 69 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  ocid. */.  for(i
14220 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 41 64 76  =0; i<pCsr->nAdv
14230 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ance; i++){.    
14240 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
14250 65 72 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20  erFirstDocid(p, 
14260 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b  pCsr->apSegment[
14270 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
14280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
14290 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 74  urn rc;.  }.  ft
142a0 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28  s3SegReaderSort(
142b0 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c  pCsr->apSegment,
142c0 20 69 2c 20 69 2c 20 78 43 6d 70 29 3b 0a 0a 20   i, i, xCmp);.. 
142d0 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3c 30 20   assert( iCol<0 
142e0 7c 7c 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75  || iCol<p->nColu
142f0 6d 6e 20 29 3b 0a 20 20 70 43 73 72 2d 3e 69 43  mn );.  pCsr->iC
14300 6f 6c 46 69 6c 74 65 72 20 3d 20 69 43 6f 6c 3b  olFilter = iCol;
14310 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
14320 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
14330 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14340 63 61 6c 6c 65 64 20 6f 6e 20 61 20 4d 75 6c 74  called on a Mult
14350 69 53 65 67 52 65 61 64 65 72 20 74 68 61 74 20  iSegReader that 
14360 68 61 73 20 62 65 65 6e 20 73 74 61 72 74 65 64  has been started
14370 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
14380 33 46 74 73 33 4d 73 72 49 6e 63 72 53 74 61 72  3Fts3MsrIncrStar
14390 74 28 29 2e 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  t(). One or more
143a0 20 63 61 6c 6c 73 20 74 6f 20 4d 73 72 49 6e 63   calls to MsrInc
143b0 72 4e 65 78 74 28 29 20 6d 61 79 20 61 6c 73 6f  rNext() may also
143c0 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6d 61  .** have been ma
143d0 64 65 2e 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  de. Calling this
143e0 20 66 75 6e 63 74 69 6f 6e 20 70 75 74 73 20 74   function puts t
143f0 68 65 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65  he MultiSegReade
14400 72 20 69 6e 20 73 75 63 68 0a 2a 2a 20 61 20 73  r in such.** a s
14410 74 61 74 65 20 74 68 61 74 20 69 66 20 74 68 65  tate that if the
14420 20 6e 65 78 74 20 74 77 6f 20 63 61 6c 6c 73 20   next two calls 
14430 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c  are:.**.**   sql
14440 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
14450 72 53 74 61 72 74 28 29 0a 2a 2a 20 20 20 73 71  rStart().**   sq
14460 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
14470 65 72 53 74 65 70 28 29 0a 2a 2a 0a 2a 2a 20 74  erStep().**.** t
14480 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 64  hen the entire d
14490 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74  oclist for the t
144a0 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65  erm is available
144b0 20 69 6e 20 0a 2a 2a 20 4d 75 6c 74 69 53 65 67   in .** MultiSeg
144c0 52 65 61 64 65 72 2e 61 44 6f 63 6c 69 73 74 2f  Reader.aDoclist/
144d0 6e 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  nDoclist..*/.int
144e0 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
144f0 6e 63 72 52 65 73 74 61 72 74 28 46 74 73 33 4d  ncrRestart(Fts3M
14500 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
14510 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  Csr){.  int i;  
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
14540 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
14550 67 68 20 73 65 67 6d 65 6e 74 2d 72 65 61 64 65  gh segment-reade
14560 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
14570 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3d 3d 30 20   pCsr->zTerm==0 
14580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  );.  assert( pCs
14590 72 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 3b 0a 20  r->nTerm==0 );. 
145a0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61   assert( pCsr->a
145b0 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  Doclist==0 );.  
145c0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 44  assert( pCsr->nD
145d0 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20  oclist==0 );..  
145e0 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d  pCsr->nAdvance =
145f0 20 30 3b 0a 20 20 70 43 73 72 2d 3e 62 52 65 73   0;.  pCsr->bRes
14600 74 61 72 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28  tart = 1;.  for(
14610 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 53 65  i=0; i<pCsr->nSe
14620 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  gment; i++){.   
14630 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
14640 5b 69 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  [i]->pOffsetList
14650 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
14660 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 6e 4f  apSegment[i]->nO
14670 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20  ffsetList = 0;. 
14680 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65     pCsr->apSegme
14690 6e 74 5b 69 5d 2d 3e 69 44 6f 63 69 64 20 3d 20  nt[i]->iDocid = 
146a0 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
146b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
146c0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53  int sqlite3Fts3S
146d0 65 67 52 65 61 64 65 72 53 74 65 70 28 0a 20 20  egReaderStep(.  
146e0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
14710 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
14720 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
14730 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20  *pCsr        /* 
14740 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
14750 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
14760 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74  QLITE_OK;..  int
14770 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d   isIgnoreEmpty =
14780 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72    (pCsr->pFilter
14790 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53  ->flags & FTS3_S
147a0 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d  EGMENT_IGNORE_EM
147b0 50 54 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  PTY);.  int isRe
147c0 71 75 69 72 65 50 6f 73 20 3d 20 20 20 28 70 43  quirePos =   (pC
147d0 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61  sr->pFilter->fla
147e0 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
147f0 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 29 3b 0a  T_REQUIRE_POS);.
14800 20 20 69 6e 74 20 69 73 43 6f 6c 46 69 6c 74 65    int isColFilte
14810 72 20 3d 20 20 20 20 28 70 43 73 72 2d 3e 70 46  r =    (pCsr->pF
14820 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  ilter->flags & F
14830 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55  TS3_SEGMENT_COLU
14840 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20 20 69 6e  MN_FILTER);.  in
14850 74 20 69 73 50 72 65 66 69 78 20 3d 20 20 20 20  t isPrefix =    
14860 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65     (pCsr->pFilte
14870 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f  r->flags & FTS3_
14880 53 45 47 4d 45 4e 54 5f 50 52 45 46 49 58 29 3b  SEGMENT_PREFIX);
14890 0a 20 20 69 6e 74 20 69 73 53 63 61 6e 20 3d 20  .  int isScan = 
148a0 20 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70          (pCsr->p
148b0 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  Filter->flags & 
148c0 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41  FTS3_SEGMENT_SCA
148d0 4e 29 3b 0a 20 20 69 6e 74 20 69 73 46 69 72 73  N);.  int isFirs
148e0 74 20 3d 20 20 20 20 20 20 20 20 28 70 43 73 72  t =        (pCsr
148f0 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73  ->pFilter->flags
14900 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   & FTS3_SEGMENT_
14910 46 49 52 53 54 29 3b 0a 0a 20 20 46 74 73 33 53  FIRST);..  Fts3S
14920 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67  egReader **apSeg
14930 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 61 70 53  ment = pCsr->apS
14940 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 53  egment;.  int nS
14950 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e  egment = pCsr->n
14960 53 65 67 6d 65 6e 74 3b 0a 20 20 46 74 73 33 53  Segment;.  Fts3S
14970 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65  egFilter *pFilte
14980 72 20 3d 20 70 43 73 72 2d 3e 70 46 69 6c 74 65  r = pCsr->pFilte
14990 72 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29  r;.  int (*xCmp)
149a0 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
149b0 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  , Fts3SegReader 
149c0 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44  *) = (.    p->bD
149d0 65 73 63 49 64 78 20 3f 20 66 74 73 33 53 65 67  escIdx ? fts3Seg
149e0 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70  ReaderDoclistCmp
149f0 52 65 76 20 3a 20 66 74 73 33 53 65 67 52 65 61  Rev : fts3SegRea
14a00 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20  derDoclistCmp.  
14a10 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  );..  if( pCsr->
14a20 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20 72 65  nSegment==0 ) re
14a30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14a40 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20  .  do {.    int 
14a50 6e 4d 65 72 67 65 3b 0a 20 20 20 20 69 6e 74 20  nMerge;.    int 
14a60 69 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64 76  i;.  .    /* Adv
14a70 61 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 70  ance the first p
14a80 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 65 6e  Csr->nAdvance en
14a90 74 72 69 65 73 20 69 6e 20 74 68 65 20 61 70 53  tries in the apS
14aa0 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79 0a 20  egment[] array. 
14ab0 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 2e 20 54     ** forward. T
14ac0 68 65 6e 20 73 6f 72 74 20 74 68 65 20 6c 69 73  hen sort the lis
14ad0 74 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 63 75  t in order of cu
14ae0 72 72 65 6e 74 20 74 65 72 6d 20 61 67 61 69 6e  rrent term again
14af0 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  .  .    */.    f
14b00 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e  or(i=0; i<pCsr->
14b10 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a  nAdvance; i++){.
14b20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53        rc = fts3S
14b30 65 67 52 65 61 64 65 72 4e 65 78 74 28 70 2c 20  egReaderNext(p, 
14b40 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2c 20 30 29  apSegment[i], 0)
14b50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14b60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
14b70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14b80 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f   fts3SegReaderSo
14b90 72 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 53  rt(apSegment, nS
14ba0 65 67 6d 65 6e 74 2c 20 70 43 73 72 2d 3e 6e 41  egment, pCsr->nA
14bb0 64 76 61 6e 63 65 2c 20 66 74 73 33 53 65 67 52  dvance, fts3SegR
14bc0 65 61 64 65 72 43 6d 70 29 3b 0a 20 20 20 20 70  eaderCmp);.    p
14bd0 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20  Csr->nAdvance = 
14be0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6c  0;..    /* If al
14bf0 6c 20 74 68 65 20 73 65 67 2d 72 65 61 64 65 72  l the seg-reader
14c00 73 20 61 72 65 20 61 74 20 45 4f 46 2c 20 77 65  s are at EOF, we
14c10 27 72 65 20 66 69 6e 69 73 68 65 64 2e 20 72 65  're finished. re
14c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
14c30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
14c40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
14c50 20 20 20 20 69 66 28 20 61 70 53 65 67 6d 65 6e      if( apSegmen
14c60 74 5b 30 5d 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29  t[0]->aNode==0 )
14c70 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 73   break;..    pCs
14c80 72 2d 3e 6e 54 65 72 6d 20 3d 20 61 70 53 65 67  r->nTerm = apSeg
14c90 6d 65 6e 74 5b 30 5d 2d 3e 6e 54 65 72 6d 3b 0a  ment[0]->nTerm;.
14ca0 20 20 20 20 70 43 73 72 2d 3e 7a 54 65 72 6d 20      pCsr->zTerm 
14cb0 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  = apSegment[0]->
14cc0 7a 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 49  zTerm;..    /* I
14cd0 66 20 74 68 69 73 20 69 73 20 61 20 70 72 65 66  f this is a pref
14ce0 69 78 2d 73 65 61 72 63 68 2c 20 61 6e 64 20 69  ix-search, and i
14cf0 66 20 74 68 65 20 74 65 72 6d 20 74 68 61 74 20  f the term that 
14d00 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20 70 6f 69  apSegment[0] poi
14d10 6e 74 73 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f  nts.    ** to do
14d20 65 73 20 6e 6f 74 20 73 68 61 72 65 20 61 20 73  es not share a s
14d30 75 66 66 69 78 20 77 69 74 68 20 70 46 69 6c 74  uffix with pFilt
14d40 65 72 2d 3e 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c  er->zTerm/nTerm,
14d50 20 74 68 65 6e 20 61 6c 6c 20 0a 20 20 20 20 2a   then all .    *
14d60 2a 20 72 65 71 75 69 72 65 64 20 63 61 6c 6c 62  * required callb
14d70 61 63 6b 73 20 68 61 76 65 20 62 65 65 6e 20 6d  acks have been m
14d80 61 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ade. In this cas
14d90 65 20 65 78 69 74 20 65 61 72 6c 79 2e 0a 20 20  e exit early..  
14da0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69    **.    ** Simi
14db0 6c 61 72 6c 79 2c 20 69 66 20 74 68 69 73 20 69  larly, if this i
14dc0 73 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 61  s a search for a
14dd0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 2c 20 61  n exact match, a
14de0 6e 64 20 74 68 65 20 66 69 72 73 74 20 74 65 72  nd the first ter
14df0 6d 0a 20 20 20 20 2a 2a 20 6f 66 20 73 65 67 6d  m.    ** of segm
14e00 65 6e 74 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  ent apSegment[0]
14e10 20 69 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c   is not a match,
14e20 20 65 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20   exit early..   
14e30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
14e40 74 65 72 2d 3e 7a 54 65 72 6d 20 26 26 20 21 69  ter->zTerm && !i
14e50 73 53 63 61 6e 20 29 7b 0a 20 20 20 20 20 20 69  sScan ){.      i
14e60 66 28 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3c 70  f( pCsr->nTerm<p
14e70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 20 0a 20  Filter->nTerm . 
14e80 20 20 20 20 20 20 7c 7c 20 28 21 69 73 50 72 65        || (!isPre
14e90 66 69 78 20 26 26 20 70 43 73 72 2d 3e 6e 54 65  fix && pCsr->nTe
14ea0 72 6d 3e 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72  rm>pFilter->nTer
14eb0 6d 29 0a 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d  m).       || mem
14ec0 63 6d 70 28 70 43 73 72 2d 3e 7a 54 65 72 6d 2c  cmp(pCsr->zTerm,
14ed0 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c   pFilter->zTerm,
14ee0 20 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29   pFilter->nTerm)
14ef0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
14f00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14f10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4d 65  }.    }..    nMe
14f20 72 67 65 20 3d 20 31 3b 0a 20 20 20 20 77 68 69  rge = 1;.    whi
14f30 6c 65 28 20 6e 4d 65 72 67 65 3c 6e 53 65 67 6d  le( nMerge<nSegm
14f40 65 6e 74 20 0a 20 20 20 20 20 20 20 20 26 26 20  ent .        && 
14f50 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65  apSegment[nMerge
14f60 5d 2d 3e 61 4e 6f 64 65 0a 20 20 20 20 20 20 20  ]->aNode.       
14f70 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d   && apSegment[nM
14f80 65 72 67 65 5d 2d 3e 6e 54 65 72 6d 3d 3d 70 43  erge]->nTerm==pC
14f90 73 72 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20  sr->nTerm .     
14fa0 20 20 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28     && 0==memcmp(
14fb0 70 43 73 72 2d 3e 7a 54 65 72 6d 2c 20 61 70 53  pCsr->zTerm, apS
14fc0 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e  egment[nMerge]->
14fd0 7a 54 65 72 6d 2c 20 70 43 73 72 2d 3e 6e 54 65  zTerm, pCsr->nTe
14fe0 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  rm).    ){.     
14ff0 20 6e 4d 65 72 67 65 2b 2b 3b 0a 20 20 20 20 7d   nMerge++;.    }
15000 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
15010 49 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20 28  IgnoreEmpty || (
15020 69 73 52 65 71 75 69 72 65 50 6f 73 20 26 26 20  isRequirePos && 
15030 21 69 73 43 6f 6c 46 69 6c 74 65 72 29 20 29 3b  !isColFilter) );
15040 0a 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3d  .    if( nMerge=
15050 3d 31 20 0a 20 20 20 20 20 26 26 20 21 69 73 49  =1 .     && !isI
15060 67 6e 6f 72 65 45 6d 70 74 79 20 0a 20 20 20 20  gnoreEmpty .    
15070 20 26 26 20 21 69 73 46 69 72 73 74 20 0a 20 20   && !isFirst .  
15080 20 20 20 26 26 20 28 70 2d 3e 62 44 65 73 63 49     && (p->bDescI
15090 64 78 3d 3d 30 20 7c 7c 20 66 74 73 33 53 65 67  dx==0 || fts3Seg
150a0 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
150b0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29 3d 3d 30  apSegment[0])==0
150c0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
150d0 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20  Csr->nDoclist = 
150e0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 44  apSegment[0]->nD
150f0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 69 66  oclist;.      if
15100 28 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  ( fts3SegReaderI
15110 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65  sPending(apSegme
15120 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  nt[0]) ){.      
15130 20 20 72 63 20 3d 20 66 74 73 33 4d 73 72 42 75    rc = fts3MsrBu
15140 66 66 65 72 44 61 74 61 28 70 43 73 72 2c 20 61  fferData(pCsr, a
15150 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f  pSegment[0]->aDo
15160 63 6c 69 73 74 2c 20 70 43 73 72 2d 3e 6e 44 6f  clist, pCsr->nDo
15170 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  clist);.        
15180 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d  pCsr->aDoclist =
15190 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a   pCsr->aBuffer;.
151a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
151b0 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c       pCsr->aDocl
151c0 69 73 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  ist = apSegment[
151d0 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20  0]->aDoclist;.  
151e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
151f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
15200 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
15210 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15220 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 3d    int nDoclist =
15230 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
15240 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
15250 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
15260 33 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d 20  3_int64 iPrev = 
15270 30 3b 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  0;    /* Previou
15280 73 20 64 6f 63 69 64 20 73 74 6f 72 65 64 20 69  s docid stored i
15290 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20  n doclist */..  
152a0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
152b0 6e 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  nt term of the f
152c0 69 72 73 74 20 6e 4d 65 72 67 65 20 65 6e 74 72  irst nMerge entr
152d0 69 65 73 20 69 6e 20 74 68 65 20 61 72 72 61 79  ies in the array
152e0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 46 74 73  .      ** of Fts
152f0 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63  3SegReader objec
15300 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 2e 20  ts is the same. 
15310 54 68 65 20 64 6f 63 6c 69 73 74 73 20 6d 75 73  The doclists mus
15320 74 20 62 65 20 6d 65 72 67 65 64 0a 20 20 20 20  t be merged.    
15330 20 20 2a 2a 20 61 6e 64 20 61 20 73 69 6e 67 6c    ** and a singl
15340 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20  e term returned 
15350 77 69 74 68 20 74 68 65 20 6d 65 72 67 65 64 20  with the merged 
15360 64 6f 63 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  doclist..      *
15370 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
15380 20 69 3c 6e 4d 65 72 67 65 3b 20 69 2b 2b 29 7b   i<nMerge; i++){
15390 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67  .        fts3Seg
153a0 52 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64  ReaderFirstDocid
153b0 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d  (p, apSegment[i]
153c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
153d0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f   fts3SegReaderSo
153e0 72 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d  rt(apSegment, nM
153f0 65 72 67 65 2c 20 6e 4d 65 72 67 65 2c 20 78 43  erge, nMerge, xC
15400 6d 70 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  mp);.      while
15410 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  ( apSegment[0]->
15420 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20  pOffsetList ){. 
15430 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 20 20 20         int j;   
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
15460 67 6d 65 6e 74 73 20 74 68 61 74 20 73 68 61 72  gments that shar
15470 65 20 61 20 64 6f 63 69 64 20 2a 2f 0a 20 20 20  e a docid */.   
15480 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74       char *pList
15490 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c  ;.        int nL
154a0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ist;.        int
154b0 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
154c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
154d0 6f 63 69 64 20 3d 20 61 70 53 65 67 6d 65 6e 74  ocid = apSegment
154e0 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20  [0]->iDocid;.   
154f0 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
15500 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61  erNextDocid(p, a
15510 70 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c  pSegment[0], &pL
15520 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
15530 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20        j = 1;.   
15540 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 6e 4d       while( j<nM
15550 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 20  erge.           
15560 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d   && apSegment[j]
15570 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a 20 20  ->pOffsetList.  
15580 20 20 20 20 20 20 20 20 20 20 26 26 20 61 70 53            && apS
15590 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69  egment[j]->iDoci
155a0 64 3d 3d 69 44 6f 63 69 64 0a 20 20 20 20 20 20  d==iDocid.      
155b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66    ){.          f
155c0 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
155d0 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65  Docid(p, apSegme
155e0 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a 20 20  nt[j], 0, 0);.  
155f0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
15600 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
15610 69 66 28 20 69 73 43 6f 6c 46 69 6c 74 65 72 20  if( isColFilter 
15620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
15630 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 70 46  3ColumnFilter(pF
15640 69 6c 74 65 72 2d 3e 69 43 6f 6c 2c 20 26 70 4c  ilter->iCol, &pL
15650 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
15660 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
15670 20 69 66 28 20 21 69 73 49 67 6e 6f 72 65 45 6d   if( !isIgnoreEm
15680 70 74 79 20 7c 7c 20 6e 4c 69 73 74 3e 30 20 29  pty || nList>0 )
15690 7b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {..          /* 
156a0 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 27 64  Calculate the 'd
156b0 6f 63 69 64 27 20 64 65 6c 74 61 20 76 61 6c 75  ocid' delta valu
156c0 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
156d0 74 68 65 20 6d 65 72 67 65 64 20 0a 20 20 20 20  the merged .    
156e0 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
156f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
15700 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
15710 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69  lta;.          i
15720 66 28 20 70 2d 3e 62 44 65 73 63 49 64 78 20 26  f( p->bDescIdx &
15730 26 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b 0a  & nDoclist>0 ){.
15740 20 20 20 20 20 20 20 20 20 20 20 20 69 44 65 6c              iDel
15750 74 61 20 3d 20 69 50 72 65 76 20 2d 20 69 44 6f  ta = iPrev - iDo
15760 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  cid;.          }
15770 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15780 20 20 69 44 65 6c 74 61 20 3d 20 69 44 6f 63 69    iDelta = iDoci
15790 64 20 2d 20 69 50 72 65 76 3b 0a 20 20 20 20 20  d - iPrev;.     
157a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
157b0 20 61 73 73 65 72 74 28 20 69 44 65 6c 74 61 3e   assert( iDelta>
157c0 30 20 7c 7c 20 28 6e 44 6f 63 6c 69 73 74 3d 3d  0 || (nDoclist==
157d0 30 20 26 26 20 69 44 65 6c 74 61 3d 3d 69 44 6f  0 && iDelta==iDo
157e0 63 69 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  cid) );.        
157f0 20 20 61 73 73 65 72 74 28 20 6e 44 6f 63 6c 69    assert( nDocli
15800 73 74 3e 30 20 7c 7c 20 69 44 65 6c 74 61 3d 3d  st>0 || iDelta==
15810 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20 20 20 20  iDocid );..     
15820 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 71 6c       nByte = sql
15830 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
15840 6e 28 69 44 65 6c 74 61 29 20 2b 20 28 69 73 52  n(iDelta) + (isR
15850 65 71 75 69 72 65 50 6f 73 3f 6e 4c 69 73 74 2b  equirePos?nList+
15860 31 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1:0);.          
15870 69 66 28 20 6e 44 6f 63 6c 69 73 74 2b 6e 42 79  if( nDoclist+nBy
15880 74 65 3e 70 43 73 72 2d 3e 6e 42 75 66 66 65 72  te>pCsr->nBuffer
15890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
158a0 63 68 61 72 20 2a 61 4e 65 77 3b 0a 20 20 20 20  char *aNew;.    
158b0 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 42          pCsr->nB
158c0 75 66 66 65 72 20 3d 20 28 6e 44 6f 63 6c 69 73  uffer = (nDoclis
158d0 74 2b 6e 42 79 74 65 29 2a 32 3b 0a 20 20 20 20  t+nByte)*2;.    
158e0 20 20 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73          aNew = s
158f0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
15900 43 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 43  Csr->aBuffer, pC
15910 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20 20  sr->nBuffer);.  
15920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61            if( !a
15930 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
15940 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15950 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
15960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15970 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66 66 65      pCsr->aBuffe
15980 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  r = aNew;.      
15990 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
159a0 20 69 66 28 20 69 73 46 69 72 73 74 20 29 7b 0a   if( isFirst ){.
159b0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
159c0 20 2a 61 20 3d 20 26 70 43 73 72 2d 3e 61 42 75   *a = &pCsr->aBu
159d0 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 3b 0a  ffer[nDoclist];.
159e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
159f0 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
15a00 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
15a10 6e 57 72 69 74 65 20 3d 20 73 71 6c 69 74 65 33  nWrite = sqlite3
15a20 46 74 73 33 46 69 72 73 74 46 69 6c 74 65 72 28  Fts3FirstFilter(
15a30 69 44 65 6c 74 61 2c 20 70 4c 69 73 74 2c 20 6e  iDelta, pList, n
15a40 4c 69 73 74 2c 20 61 29 3b 0a 20 20 20 20 20 20  List, a);.      
15a50 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
15a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15a70 20 20 69 50 72 65 76 20 3d 20 69 44 6f 63 69 64    iPrev = iDocid
15a80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15a90 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 57 72 69  nDoclist += nWri
15aa0 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  te;.            
15ab0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
15ac0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  e{.            n
15ad0 44 6f 63 6c 69 73 74 20 2b 3d 20 73 71 6c 69 74  Doclist += sqlit
15ae0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
15af0 26 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e  &pCsr->aBuffer[n
15b00 44 6f 63 6c 69 73 74 5d 2c 20 69 44 65 6c 74 61  Doclist], iDelta
15b10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
15b20 50 72 65 76 20 3d 20 69 44 6f 63 69 64 3b 0a 20  Prev = iDocid;. 
15b30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
15b40 73 52 65 71 75 69 72 65 50 6f 73 20 29 7b 0a 20  sRequirePos ){. 
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
15b60 63 70 79 28 26 70 43 73 72 2d 3e 61 42 75 66 66  cpy(&pCsr->aBuff
15b70 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 70 4c  er[nDoclist], pL
15b80 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 20  ist, nList);.   
15b90 20 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c             nDocl
15ba0 69 73 74 20 2b 3d 20 6e 4c 69 73 74 3b 0a 20 20  ist += nList;.  
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
15bc0 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69  ->aBuffer[nDocli
15bd0 73 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  st++] = '\0';.  
15be0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15c00 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73 33 53  }..        fts3S
15c10 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53  egReaderSort(apS
15c20 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20  egment, nMerge, 
15c30 6a 2c 20 78 43 6d 70 29 3b 0a 20 20 20 20 20 20  j, xCmp);.      
15c40 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 6f 63  }.      if( nDoc
15c50 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  list>0 ){.      
15c60 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74    pCsr->aDoclist
15c70 20 3d 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72   = pCsr->aBuffer
15c80 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e  ;.        pCsr->
15c90 6e 44 6f 63 6c 69 73 74 20 3d 20 6e 44 6f 63 6c  nDoclist = nDocl
15ca0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ist;.        rc 
15cb0 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
15cc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15cd0 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d  pCsr->nAdvance =
15ce0 20 6e 4d 65 72 67 65 3b 0a 20 20 7d 77 68 69 6c   nMerge;.  }whil
15cf0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15d00 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63   );..  return rc
15d10 3b 0a 7d 0a 0a 0a 76 6f 69 64 20 73 71 6c 69 74  ;.}...void sqlit
15d20 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46  e3Fts3SegReaderF
15d30 69 6e 69 73 68 28 0a 20 20 46 74 73 33 4d 75 6c  inish(.  Fts3Mul
15d40 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
15d50 72 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r       /* Curso
15d60 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
15d70 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20   if( pCsr ){.   
15d80 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
15d90 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 53 65  i=0; i<pCsr->nSe
15da0 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  gment; i++){.   
15db0 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65     sqlite3Fts3Se
15dc0 67 52 65 61 64 65 72 46 72 65 65 28 70 43 73 72  gReaderFree(pCsr
15dd0 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b  ->apSegment[i]);
15de0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15df0 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 70  e3_free(pCsr->ap
15e00 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 73 71  Segment);.    sq
15e10 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d  lite3_free(pCsr-
15e20 3e 61 42 75 66 66 65 72 29 3b 0a 0a 20 20 20 20  >aBuffer);..    
15e30 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d  pCsr->nSegment =
15e40 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70   0;.    pCsr->ap
15e50 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Segment = 0;.   
15e60 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72 20 3d   pCsr->aBuffer =
15e70 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
15e80 20 4d 65 72 67 65 20 61 6c 6c 20 6c 65 76 65 6c   Merge all level
15e90 20 69 4c 65 76 65 6c 20 73 65 67 6d 65 6e 74 73   iLevel segments
15ea0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
15eb0 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 0a   into a single .
15ec0 2a 2a 20 69 4c 65 76 65 6c 2b 31 20 73 65 67 6d  ** iLevel+1 segm
15ed0 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76  ent. Or, if iLev
15ee0 65 6c 3c 30 2c 20 6d 65 72 67 65 20 61 6c 6c 20  el<0, merge all 
15ef0 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f 20 61 0a  segments into a.
15f00 2a 2a 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e  ** single segmen
15f10 74 20 77 69 74 68 20 61 20 6c 65 76 65 6c 20 65  t with a level e
15f20 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 65  qual to the nume
15f30 72 69 63 61 6c 6c 79 20 6c 61 72 67 65 73 74 20  rically largest 
15f40 6c 65 76 65 6c 20 0a 2a 2a 20 63 75 72 72 65 6e  level .** curren
15f50 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74  tly present in t
15f60 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
15f70 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
15f80 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ion is called wi
15f90 74 68 20 69 4c 65 76 65 6c 3c 30 2c 20 62 75 74  th iLevel<0, but
15fa0 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   there is only o
15fb0 6e 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e  ne.** segment in
15fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 53   the database, S
15fd0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
15fe0 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
15ff0 6c 79 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ly. .** Otherwis
16000 65 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  e, if successful
16010 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
16020 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
16030 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 0a 2a 2a  rror occurs, .**
16040 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16050 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
16060 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16070 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67   fts3SegmentMerg
16080 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  e(Fts3Table *p, 
16090 69 6e 74 20 69 49 6e 64 65 78 2c 20 69 6e 74 20  int iIndex, int 
160a0 69 4c 65 76 65 6c 29 7b 0a 20 20 69 6e 74 20 72  iLevel){.  int r
160b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
160c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
160d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
160e0 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20  nt iIdx = 0;    
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16100 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 73  * Index of new s
16110 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
16120 69 4e 65 77 4c 65 76 65 6c 20 3d 20 30 3b 20 20  iNewLevel = 0;  
16130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
16140 65 76 65 6c 2f 69 6e 64 65 78 20 74 6f 20 63 72  evel/index to cr
16150 65 61 74 65 20 6e 65 77 20 73 65 67 6d 65 6e 74  eate new segment
16160 20 61 74 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74   at */.  Segment
16170 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
16180 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73 65 64  = 0;     /* Used
16190 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
161a0 77 2c 20 6d 65 72 67 65 64 2c 20 73 65 67 6d 65  w, merged, segme
161b0 6e 74 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46  nt */.  Fts3SegF
161c0 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 20 20 20  ilter filter;   
161d0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
161e0 6e 74 20 74 65 72 6d 20 66 69 6c 74 65 72 20 63  nt term filter c
161f0 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 46 74  ondition */.  Ft
16200 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
16210 20 63 73 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   csr;        /* 
16220 43 75 72 73 6f 72 20 74 6f 20 69 74 65 72 61 74  Cursor to iterat
16230 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 28  e through level(
16240 73 29 20 2a 2f 0a 20 20 69 6e 74 20 62 49 67 6e  s) */.  int bIgn
16250 6f 72 65 45 6d 70 74 79 20 3d 20 30 3b 20 20 20  oreEmpty = 0;   
16260 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16270 74 6f 20 69 67 6e 6f 72 65 20 65 6d 70 74 79 20  to ignore empty 
16280 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 61  segments */..  a
16290 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3d 3d 46  ssert( iLevel==F
162a0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
162b0 4c 0a 20 20 20 20 20 20 20 7c 7c 20 69 4c 65 76  L.       || iLev
162c0 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
162d0 4f 52 5f 50 45 4e 44 49 4e 47 0a 20 20 20 20 20  OR_PENDING.     
162e0 20 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30 0a 20    || iLevel>=0. 
162f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
16300 65 76 65 6c 3c 46 54 53 33 5f 53 45 47 44 49 52  evel<FTS3_SEGDIR
16310 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a 20 20 61  _MAXLEVEL );.  a
16320 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30  ssert( iIndex>=0
16330 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49   && iIndex<p->nI
16340 6e 64 65 78 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ndex );..  rc = 
16350 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
16360 61 64 65 72 43 75 72 73 6f 72 28 70 2c 20 69 49  aderCursor(p, iI
16370 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c 20 30 2c  ndex, iLevel, 0,
16380 20 30 2c 20 31 2c 20 30 2c 20 26 63 73 72 29 3b   0, 1, 0, &csr);
16390 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
163a0 45 5f 4f 4b 20 7c 7c 20 63 73 72 2e 6e 53 65 67  E_OK || csr.nSeg
163b0 6d 65 6e 74 3d 3d 30 20 29 20 67 6f 74 6f 20 66  ment==0 ) goto f
163c0 69 6e 69 73 68 65 64 3b 0a 0a 20 20 69 66 28 20  inished;..  if( 
163d0 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47  iLevel==FTS3_SEG
163e0 43 55 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20  CURSOR_ALL ){.  
163f0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69    /* This call i
16400 73 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73  s to merge all s
16410 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64  egments in the d
16420 61 74 61 62 61 73 65 20 74 6f 20 61 20 73 69 6e  atabase to a sin
16430 67 6c 65 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  gle.    ** segme
16440 6e 74 2e 20 54 68 65 20 6c 65 76 65 6c 20 6f 66  nt. The level of
16450 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   the new segment
16460 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
16470 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79   the numerically
16480 20 0a 20 20 20 20 2a 2a 20 67 72 65 61 74 65 73   .    ** greates
16490 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20  t segment level 
164a0 63 75 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e  currently presen
164b0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
164c0 65 20 66 6f 72 20 74 68 69 73 0a 20 20 20 20 2a  e for this.    *
164d0 2a 20 69 6e 64 65 78 2e 20 54 68 65 20 69 64 78  * index. The idx
164e0 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65 67 6d   of the new segm
164f0 65 6e 74 20 69 73 20 61 6c 77 61 79 73 20 30 2e  ent is always 0.
16500 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 73 72    */.    if( csr
16510 2e 6e 53 65 67 6d 65 6e 74 3d 3d 31 20 29 7b 0a  .nSegment==1 ){.
16520 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16530 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 67 6f  E_DONE;.      go
16540 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  to finished;.   
16550 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33   }.    rc = fts3
16560 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28  SegmentMaxLevel(
16570 70 2c 20 69 49 6e 64 65 78 2c 20 26 69 4e 65 77  p, iIndex, &iNew
16580 4c 65 76 65 6c 29 3b 0a 20 20 20 20 62 49 67 6e  Level);.    bIgn
16590 6f 72 65 45 6d 70 74 79 20 3d 20 31 3b 0a 0a 20  oreEmpty = 1;.. 
165a0 20 7d 65 6c 73 65 20 69 66 28 20 69 4c 65 76 65   }else if( iLeve
165b0 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
165c0 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20  R_PENDING ){.   
165d0 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 69 49 6e   iNewLevel = iIn
165e0 64 65 78 20 2a 20 46 54 53 33 5f 53 45 47 44 49  dex * FTS3_SEGDI
165f0 52 5f 4d 41 58 4c 45 56 45 4c 3b 20 0a 20 20 20  R_MAXLEVEL; .   
16600 20 72 63 20 3d 20 66 74 73 33 41 6c 6c 6f 63 61   rc = fts3Alloca
16610 74 65 53 65 67 64 69 72 49 64 78 28 70 2c 20 69  teSegdirIdx(p, i
16620 49 6e 64 65 78 2c 20 30 2c 20 26 69 49 64 78 29  Index, 0, &iIdx)
16630 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
16640 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74  * This call is t
16650 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  o merge all segm
16660 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20 69 4c  ents at level iL
16670 65 76 65 6c 2e 20 66 69 6e 64 20 74 68 65 20 6e  evel. find the n
16680 65 78 74 0a 20 20 20 20 2a 2a 20 61 76 61 69 6c  ext.    ** avail
16690 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 69 6e 64  able segment ind
166a0 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76  ex at level iLev
166b0 65 6c 2b 31 2e 20 54 68 65 20 63 61 6c 6c 20 74  el+1. The call t
166c0 6f 0a 20 20 20 20 2a 2a 20 66 74 73 33 41 6c 6c  o.    ** fts3All
166d0 6f 63 61 74 65 53 65 67 64 69 72 49 64 78 28 29  ocateSegdirIdx()
166e0 20 77 69 6c 6c 20 6d 65 72 67 65 20 74 68 65 20   will merge the 
166f0 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65  segments at leve
16700 6c 20 69 4c 65 76 65 6c 2b 31 20 74 6f 20 0a 20  l iLevel+1 to . 
16710 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
16720 4c 65 76 65 6c 2b 32 20 73 65 67 6d 65 6e 74 20  Level+2 segment 
16730 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 2a  if necessary.  *
16740 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 41  /.    rc = fts3A
16750 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
16760 28 70 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  (p, iIndex, iLev
16770 65 6c 2b 31 2c 20 26 69 49 64 78 29 3b 0a 20 20  el+1, &iIdx);.  
16780 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 69 49    iNewLevel = iI
16790 6e 64 65 78 20 2a 20 46 54 53 33 5f 53 45 47 44  ndex * FTS3_SEGD
167a0 49 52 5f 4d 41 58 4c 45 56 45 4c 20 2b 20 69 4c  IR_MAXLEVEL + iL
167b0 65 76 65 6c 2b 31 3b 0a 20 20 7d 0a 20 20 69 66  evel+1;.  }.  if
167c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
167d0 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b  ) goto finished;
167e0 0a 20 20 61 73 73 65 72 74 28 20 63 73 72 2e 6e  .  assert( csr.n
167f0 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  Segment>0 );.  a
16800 73 73 65 72 74 28 20 69 4e 65 77 4c 65 76 65 6c  ssert( iNewLevel
16810 3e 3d 28 69 49 6e 64 65 78 2a 46 54 53 33 5f 53  >=(iIndex*FTS3_S
16820 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 20  EGDIR_MAXLEVEL) 
16830 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65  );.  assert( iNe
16840 77 4c 65 76 65 6c 3c 28 28 69 49 6e 64 65 78 2b  wLevel<((iIndex+
16850 31 29 2a 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  1)*FTS3_SEGDIR_M
16860 41 58 4c 45 56 45 4c 29 20 29 3b 0a 0a 20 20 6d  AXLEVEL) );..  m
16870 65 6d 73 65 74 28 26 66 69 6c 74 65 72 2c 20 30  emset(&filter, 0
16880 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67  , sizeof(Fts3Seg
16890 46 69 6c 74 65 72 29 29 3b 0a 20 20 66 69 6c 74  Filter));.  filt
168a0 65 72 2e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f  er.flags = FTS3_
168b0 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f  SEGMENT_REQUIRE_
168c0 50 4f 53 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c  POS;.  filter.fl
168d0 61 67 73 20 7c 3d 20 28 62 49 67 6e 6f 72 65 45  ags |= (bIgnoreE
168e0 6d 70 74 79 20 3f 20 46 54 53 33 5f 53 45 47 4d  mpty ? FTS3_SEGM
168f0 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59  ENT_IGNORE_EMPTY
16900 20 3a 20 30 29 3b 0a 0a 20 20 72 63 20 3d 20 73   : 0);..  rc = s
16910 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
16920 64 65 72 53 74 61 72 74 28 70 2c 20 26 63 73 72  derStart(p, &csr
16930 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20 20 77 68  , &filter);.  wh
16940 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ile( SQLITE_OK==
16950 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  rc ){.    rc = s
16960 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
16970 64 65 72 53 74 65 70 28 70 2c 20 26 63 73 72 29  derStep(p, &csr)
16980 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16990 4c 49 54 45 5f 52 4f 57 20 29 20 62 72 65 61 6b  LITE_ROW ) break
169a0 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  ;.    rc = fts3S
169b0 65 67 57 72 69 74 65 72 41 64 64 28 70 2c 20 26  egWriterAdd(p, &
169c0 70 57 72 69 74 65 72 2c 20 31 2c 20 0a 20 20 20  pWriter, 1, .   
169d0 20 20 20 20 20 63 73 72 2e 7a 54 65 72 6d 2c 20       csr.zTerm, 
169e0 63 73 72 2e 6e 54 65 72 6d 2c 20 63 73 72 2e 61  csr.nTerm, csr.a
169f0 44 6f 63 6c 69 73 74 2c 20 63 73 72 2e 6e 44 6f  Doclist, csr.nDo
16a00 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  clist);.  }.  if
16a10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16a20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b  ) goto finished;
16a30 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
16a40 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65  er );..  if( iLe
16a50 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55 52  vel!=FTS3_SEGCUR
16a60 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20  SOR_PENDING ){. 
16a70 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
16a80 74 65 53 65 67 64 69 72 28 70 2c 20 69 49 6e 64  teSegdir(p, iInd
16a90 65 78 2c 20 69 4c 65 76 65 6c 2c 20 63 73 72 2e  ex, iLevel, csr.
16aa0 61 70 53 65 67 6d 65 6e 74 2c 20 63 73 72 2e 6e  apSegment, csr.n
16ab0 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66  Segment);.    if
16ac0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16ad0 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b  ) goto finished;
16ae0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33  .  }.  rc = fts3
16af0 53 65 67 57 72 69 74 65 72 46 6c 75 73 68 28 70  SegWriterFlush(p
16b00 2c 20 70 57 72 69 74 65 72 2c 20 69 4e 65 77 4c  , pWriter, iNewL
16b10 65 76 65 6c 2c 20 69 49 64 78 29 3b 0a 0a 20 66  evel, iIdx);.. f
16b20 69 6e 69 73 68 65 64 3a 0a 20 20 66 74 73 33 53  inished:.  fts3S
16b30 65 67 57 72 69 74 65 72 46 72 65 65 28 70 57 72  egWriterFree(pWr
16b40 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  iter);.  sqlite3
16b50 46 74 73 33 53 65 67 52 65 61 64 65 72 46 69 6e  Fts3SegReaderFin
16b60 69 73 68 28 26 63 73 72 29 3b 0a 20 20 72 65 74  ish(&csr);.  ret
16b70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a  urn rc;.}.../* .
16b80 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e  ** Flush the con
16b90 74 65 6e 74 73 20 6f 66 20 70 65 6e 64 69 6e 67  tents of pending
16ba0 54 65 72 6d 73 20 74 6f 20 6c 65 76 65 6c 20 30  Terms to level 0
16bb0 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e   segments..*/.in
16bc0 74 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e  t sqlite3Fts3Pen
16bd0 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 46  dingTermsFlush(F
16be0 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
16bf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16c00 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  OK;.  int i;.  f
16c10 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
16c20 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49  TE_OK && i<p->nI
16c30 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
16c40 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74  rc = fts3Segment
16c50 4d 65 72 67 65 28 70 2c 20 69 2c 20 46 54 53 33  Merge(p, i, FTS3
16c60 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49  _SEGCURSOR_PENDI
16c70 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  NG);.    if( rc=
16c80 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
16c90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16ca0 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33   }.  sqlite3Fts3
16cb0 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61  PendingTermsClea
16cc0 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r(p);.  return r
16cd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63 6f  c;.}../*.** Enco
16ce0 64 65 20 4e 20 69 6e 74 65 67 65 72 73 20 61 73  de N integers as
16cf0 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 61 20   varints into a 
16d00 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blob..*/.static 
16d10 76 6f 69 64 20 66 74 73 33 45 6e 63 6f 64 65 49  void fts3EncodeI
16d20 6e 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20 4e  ntArray(.  int N
16d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
16d40 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   The number of i
16d50 6e 74 65 67 65 72 73 20 74 6f 20 65 6e 63 6f 64  ntegers to encod
16d60 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20  e */.  u32 *a,  
16d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16d80 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
16d90 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 2c  */.  char *zBuf,
16da0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
16db0 20 74 68 65 20 42 4c 4f 42 20 68 65 72 65 20 2a   the BLOB here *
16dc0 2f 0a 20 20 69 6e 74 20 2a 70 4e 42 75 66 20 20  /.  int *pNBuf  
16dd0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
16de0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16df0 69 66 20 7a 42 75 66 5b 5d 20 75 73 65 64 20 68  if zBuf[] used h
16e00 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
16e10 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  i, j;.  for(i=j=
16e20 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<N; i++){.  
16e30 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    j += sqlite3Ft
16e40 73 33 50 75 74 56 61 72 69 6e 74 28 26 7a 42 75  s3PutVarint(&zBu
16e50 66 5b 6a 5d 2c 20 28 73 71 6c 69 74 65 33 5f 69  f[j], (sqlite3_i
16e60 6e 74 36 34 29 61 5b 69 5d 29 3b 0a 20 20 7d 0a  nt64)a[i]);.  }.
16e70 20 20 2a 70 4e 42 75 66 20 3d 20 6a 3b 0a 7d 0a    *pNBuf = j;.}.
16e80 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
16e90 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73 20  blob of varints 
16ea0 69 6e 74 6f 20 4e 20 69 6e 74 65 67 65 72 73 0a  into N integers.
16eb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
16ec0 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61  ts3DecodeIntArra
16ed0 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  y(.  int N,     
16ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
16ef0 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72  umber of integer
16f00 73 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20  s to decode */. 
16f10 20 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20   u32 *a,        
16f20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
16f30 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
16f40 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
16f50 2a 7a 42 75 66 2c 20 20 2f 2a 20 54 68 65 20 42  *zBuf,  /* The B
16f60 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  LOB containing t
16f70 68 65 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20 20  he varints */.  
16f80 69 6e 74 20 6e 42 75 66 20 20 20 20 20 20 20 20  int nBuf        
16f90 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74 68     /* size of th
16fa0 65 20 42 4c 4f 42 20 2a 2f 0a 29 7b 0a 20 20 69  e BLOB */.){.  i
16fb0 6e 74 20 69 2c 20 6a 3b 0a 20 20 55 4e 55 53 45  nt i, j;.  UNUSE
16fc0 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 42 75 66  D_PARAMETER(nBuf
16fd0 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  );.  for(i=j=0; 
16fe0 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  i<N; i++){.    s
16ff0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a  qlite3_int64 x;.
17000 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33      j += sqlite3
17010 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26 7a  Fts3GetVarint(&z
17020 42 75 66 5b 6a 5d 2c 20 26 78 29 3b 0a 20 20 20  Buf[j], &x);.   
17030 20 61 73 73 65 72 74 28 6a 3c 3d 6e 42 75 66 29   assert(j<=nBuf)
17040 3b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 28 75 33  ;.    a[i] = (u3
17050 32 29 28 78 20 26 20 30 78 66 66 66 66 66 66 66  2)(x & 0xfffffff
17060 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  f);.  }.}../*.**
17070 20 49 6e 73 65 72 74 20 74 68 65 20 73 69 7a 65   Insert the size
17080 73 20 28 69 6e 20 74 6f 6b 65 6e 73 29 20 66 6f  s (in tokens) fo
17090 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
170a0 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a   the document.**
170b0 20 77 69 74 68 20 64 6f 63 69 64 20 65 71 75 61   with docid equa
170c0 6c 20 74 6f 20 70 2d 3e 69 50 72 65 76 44 6f 63  l to p->iPrevDoc
170d0 69 64 2e 20 20 54 68 65 20 73 69 7a 65 73 20 61  id.  The sizes a
170e0 72 65 20 65 6e 63 6f 64 65 64 20 61 73 0a 2a 2a  re encoded as.**
170f0 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e   a blob of varin
17100 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
17110 69 64 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63  id fts3InsertDoc
17120 73 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52 43  size(.  int *pRC
17130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17140 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17150 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33  t code */.  Fts3
17160 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
17170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17180 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
17190 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 75  to insert */.  u
171a0 33 32 20 2a 61 53 7a 20 20 20 20 20 20 20 20 20  32 *aSz         
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
171c0 2a 20 53 69 7a 65 73 20 6f 66 20 65 61 63 68 20  * Sizes of each 
171d0 63 6f 6c 75 6d 6e 2c 20 69 6e 20 74 6f 6b 65 6e  column, in token
171e0 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
171f0 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  pBlob;          
17200 20 20 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20 65     /* The BLOB e
17210 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 64  ncoding of the d
17220 6f 63 75 6d 65 6e 74 20 73 69 7a 65 20 2a 2f 0a  ocument size */.
17230 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20    int nBlob;    
17240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17250 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
17260 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 73   the BLOB */.  s
17270 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
17280 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65  mt;     /* State
17290 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 69 6e 73  ment used to ins
172a0 65 72 74 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ert the encoding
172b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
172d0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
172e0 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
172f0 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
17300 20 72 65 74 75 72 6e 3b 0a 20 20 70 42 6c 6f 62   return;.  pBlob
17310 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
17320 63 28 20 31 30 2a 70 2d 3e 6e 43 6f 6c 75 6d 6e  c( 10*p->nColumn
17330 20 29 3b 0a 20 20 69 66 28 20 70 42 6c 6f 62 3d   );.  if( pBlob=
17340 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  =0 ){.    *pRC =
17350 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17360 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
17370 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72   fts3EncodeIntAr
17380 72 61 79 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20  ray(p->nColumn, 
17390 61 53 7a 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c  aSz, pBlob, &nBl
173a0 6f 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  ob);.  rc = fts3
173b0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52  SqlStmt(p, SQL_R
173c0 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 2c 20  EPLACE_DOCSIZE, 
173d0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
173e0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
173f0 74 65 33 5f 66 72 65 65 28 70 42 6c 6f 62 29 3b  te3_free(pBlob);
17400 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
17410 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
17420 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
17430 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 70  nt64(pStmt, 1, p
17440 2d 3e 69 50 72 65 76 44 6f 63 69 64 29 3b 0a 20  ->iPrevDocid);. 
17450 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
17460 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 70 42 6c  ob(pStmt, 2, pBl
17470 6f 62 2c 20 6e 42 6c 6f 62 2c 20 73 71 6c 69 74  ob, nBlob, sqlit
17480 65 33 5f 66 72 65 65 29 3b 0a 20 20 73 71 6c 69  e3_free);.  sqli
17490 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
174a0 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74 65  .  *pRC = sqlite
174b0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
174c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
174d0 30 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20  0 of the %_stat 
174e0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61  table contains a
174f0 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67   blob consisting
17500 20 6f 66 20 4e 20 76 61 72 69 6e 74 73 2c 0a 2a   of N varints,.*
17510 2a 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  * where N is the
17520 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20   number of user 
17530 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  defined columns 
17540 69 6e 20 74 68 65 20 66 74 73 33 20 74 61 62 6c  in the fts3 tabl
17550 65 20 70 6c 75 73 0a 2a 2a 20 74 77 6f 2e 20 49  e plus.** two. I
17560 66 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  f nCol is the nu
17570 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66  mber of user def
17580 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  ined columns, th
17590 65 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  en values of the
175a0 20 0a 2a 2a 20 76 61 72 69 6e 74 73 20 61 72 65   .** varints are
175b0 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   set as follows:
175c0 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20  .**.**   Varint 
175d0 30 3a 20 20 20 20 20 20 20 54 6f 74 61 6c 20 6e  0:       Total n
175e0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
175f0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
17600 2a 20 20 20 56 61 72 69 6e 74 20 31 2e 2e 6e 43  *   Varint 1..nC
17610 6f 6c 3a 20 46 6f 72 20 65 61 63 68 20 63 6f 6c  ol: For each col
17620 75 6d 6e 2c 20 74 68 65 20 74 6f 74 61 6c 20 6e  umn, the total n
17630 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
17640 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20  stored in.**    
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
17660 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c  he column for al
17670 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61  l rows of the ta
17680 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  ble..**.**   Var
17690 69 6e 74 20 31 2b 6e 43 6f 6c 3a 20 20 54 68 65  int 1+nCol:  The
176a0 20 74 6f 74 61 6c 20 73 69 7a 65 2c 20 69 6e 20   total size, in 
176b0 62 79 74 65 73 2c 20 6f 66 20 61 6c 6c 20 74 65  bytes, of all te
176c0 78 74 20 76 61 6c 75 65 73 20 69 6e 20 61 6c 6c  xt values in all
176d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
176e0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
176f0 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
17700 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74   table..**.*/.st
17710 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 55 70  atic void fts3Up
17720 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 0a 20  dateDocTotals(. 
17730 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20   int *pRC,      
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 63   /* The result c
17760 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62  ode */.  Fts3Tab
17770 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
17780 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
17790 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 20  e being updated 
177a0 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e 73  */.  u32 *aSzIns
177b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
177c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 63       /* Size inc
177d0 72 65 61 73 65 73 20 2a 2f 0a 20 20 75 33 32 20  reases */.  u32 
177e0 2a 61 53 7a 44 65 6c 2c 20 20 20 20 20 20 20 20  *aSzDel,        
177f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17800 69 7a 65 20 64 65 63 72 65 61 73 65 73 20 2a 2f  ize decreases */
17810 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 20 20 20  .  int nChng    
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 69 6e 20     /* Change in 
17840 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f  the number of do
17850 63 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  cuments */.){.  
17860 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20  char *pBlob;    
17870 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
17880 61 67 65 20 66 6f 72 20 42 4c 4f 42 20 77 72 69  age for BLOB wri
17890 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61 74  tten into %_stat
178a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b   */.  int nBlob;
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
178c0 2a 20 53 69 7a 65 20 6f 66 20 42 4c 4f 42 20 77  * Size of BLOB w
178d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74  ritten into %_st
178e0 61 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 3b 20  at */.  u32 *a; 
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17900 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 74   /* Array of int
17910 65 67 65 72 73 20 74 68 61 74 20 62 65 63 6f 6d  egers that becom
17920 65 73 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20  es the BLOB */. 
17930 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17940 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61  Stmt;     /* Sta
17950 74 65 6d 65 6e 74 20 66 6f 72 20 72 65 61 64 69  tement for readi
17960 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20 2a  ng and writing *
17970 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17990 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
179a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
179b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
179c0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
179d0 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
179e0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53 74 61    const int nSta
179f0 74 20 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  t = p->nColumn+2
17a00 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  ;..  if( *pRC ) 
17a10 72 65 74 75 72 6e 3b 0a 20 20 61 20 3d 20 73 71  return;.  a = sq
17a20 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28 73  lite3_malloc( (s
17a30 69 7a 65 6f 66 28 75 33 32 29 2b 31 30 29 2a 6e  izeof(u32)+10)*n
17a40 53 74 61 74 20 29 3b 0a 20 20 69 66 28 20 61 3d  Stat );.  if( a=
17a50 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  =0 ){.    *pRC =
17a60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17a70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
17a80 20 70 42 6c 6f 62 20 3d 20 28 63 68 61 72 2a 29   pBlob = (char*)
17a90 26 61 5b 6e 53 74 61 74 5d 3b 0a 20 20 72 63 20  &a[nStat];.  rc 
17aa0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
17ab0 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 54   SQL_SELECT_DOCT
17ac0 4f 54 41 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29  OTAL, &pStmt, 0)
17ad0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
17ae0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
17af0 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  );.    *pRC = rc
17b00 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
17b10 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
17b20 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
17b30 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 66  ITE_ROW ){.    f
17b40 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61  ts3DecodeIntArra
17b50 79 28 6e 53 74 61 74 2c 20 61 2c 0a 20 20 20 20  y(nStat, a,.    
17b60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
17b70 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
17b80 30 29 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  0),.         sql
17b90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
17ba0 73 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  s(pStmt, 0));.  
17bb0 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
17bc0 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(a, 0, sizeof(u
17bd0 33 32 29 2a 28 6e 53 74 61 74 29 20 29 3b 0a 20  32)*(nStat) );. 
17be0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
17bf0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
17c00 20 6e 43 68 6e 67 3c 30 20 26 26 20 61 5b 30 5d   nChng<0 && a[0]
17c10 3c 28 75 33 32 29 28 2d 6e 43 68 6e 67 29 20 29  <(u32)(-nChng) )
17c20 7b 0a 20 20 20 20 61 5b 30 5d 20 3d 20 30 3b 0a  {.    a[0] = 0;.
17c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 5b 30    }else{.    a[0
17c40 5d 20 2b 3d 20 6e 43 68 6e 67 3b 0a 20 20 7d 0a  ] += nChng;.  }.
17c50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
17c60 6e 43 6f 6c 75 6d 6e 2b 31 3b 20 69 2b 2b 29 7b  nColumn+1; i++){
17c70 0a 20 20 20 20 75 33 32 20 78 20 3d 20 61 5b 69  .    u32 x = a[i
17c80 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 78 2b 61  +1];.    if( x+a
17c90 53 7a 49 6e 73 5b 69 5d 20 3c 20 61 53 7a 44 65  SzIns[i] < aSzDe
17ca0 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 78 20  l[i] ){.      x 
17cb0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
17cc0 20 20 20 20 20 20 78 20 3d 20 78 20 2b 20 61 53        x = x + aS
17cd0 7a 49 6e 73 5b 69 5d 20 2d 20 61 53 7a 44 65 6c  zIns[i] - aSzDel
17ce0 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  [i];.    }.    a
17cf0 5b 69 2b 31 5d 20 3d 20 78 3b 0a 20 20 7d 0a 20  [i+1] = x;.  }. 
17d00 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72   fts3EncodeIntAr
17d10 72 61 79 28 6e 53 74 61 74 2c 20 61 2c 20 70 42  ray(nStat, a, pB
17d20 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20  lob, &nBlob);.  
17d30 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
17d40 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f  (p, SQL_REPLACE_
17d50 44 4f 43 54 4f 54 41 4c 2c 20 26 70 53 74 6d 74  DOCTOTAL, &pStmt
17d60 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
17d70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
17d80 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20  ee(a);.    *pRC 
17d90 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
17da0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
17db0 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
17dc0 20 31 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62   1, pBlob, nBlob
17dd0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
17de0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
17df0 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20  (pStmt);.  *pRC 
17e00 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
17e10 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65  pStmt);.  sqlite
17e20 33 5f 66 72 65 65 28 61 29 3b 0a 7d 0a 0a 73 74  3_free(a);.}..st
17e30 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 4f  atic int fts3DoO
17e40 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c  ptimize(Fts3Tabl
17e50 65 20 2a 70 2c 20 69 6e 74 20 62 52 65 74 75 72  e *p, int bRetur
17e60 6e 44 6f 6e 65 29 7b 0a 20 20 69 6e 74 20 69 3b  nDone){.  int i;
17e70 0a 20 20 69 6e 74 20 62 53 65 65 6e 44 6f 6e 65  .  int bSeenDone
17e80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
17e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f   SQLITE_OK;.  fo
17ea0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
17eb0 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e  E_OK && i<p->nIn
17ec0 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  dex; i++){.    r
17ed0 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d  c = fts3SegmentM
17ee0 65 72 67 65 28 70 2c 20 69 2c 20 46 54 53 33 5f  erge(p, i, FTS3_
17ef0 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 29 3b 0a  SEGCURSOR_ALL);.
17f00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17f10 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
17f20 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20 31 3b 0a   bSeenDone = 1;.
17f30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17f40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
17f50 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
17f60 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
17f70 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
17f80 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29  ingTermsClear(p)
17f90 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
17fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 52  =SQLITE_OK && bR
17fb0 65 74 75 72 6e 44 6f 6e 65 20 26 26 20 62 53 65  eturnDone && bSe
17fc0 65 6e 44 6f 6e 65 29 20 3f 20 53 51 4c 49 54 45  enDone) ? SQLITE
17fd0 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a 7d 0a 0a 2f  _DONE : rc;.}../
17fe0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17ff0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
18000 6e 20 74 68 65 20 75 73 65 72 20 65 78 65 63 75  n the user execu
18010 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  tes the followin
18020 67 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a 0a  g statement:.**.
18030 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
18040 54 4f 20 3c 74 62 6c 3e 28 3c 74 62 6c 3e 29 20  TO <tbl>(<tbl>) 
18050 56 41 4c 55 45 53 28 27 72 65 62 75 69 6c 64 27  VALUES('rebuild'
18060 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 6e 74  );.**.** The ent
18070 69 72 65 20 46 54 53 20 69 6e 64 65 78 20 69 73  ire FTS index is
18080 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 72   discarded and r
18090 65 62 75 69 6c 74 2e 20 49 66 20 74 68 65 20 74  ebuilt. If the t
180a0 61 62 6c 65 20 69 73 20 6f 6e 65 20 0a 2a 2a 20  able is one .** 
180b0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
180c0 65 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 6f 70  e content=xxx op
180d0 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6e  tion, then the n
180e0 65 77 20 69 6e 64 65 78 20 69 73 20 62 61 73 65  ew index is base
180f0 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
18100 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
18110 74 68 65 20 78 78 78 20 74 61 62 6c 65 2e 20 4f  the xxx table. O
18120 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
18130 72 65 62 75 69 6c 74 20 62 61 73 65 64 0a 2a 2a  rebuilt based.**
18140 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
18150 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e   of the %_conten
18160 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  t table..*/.stat
18170 69 63 20 69 6e 74 20 66 74 73 33 44 6f 52 65 62  ic int fts3DoReb
18180 75 69 6c 64 28 46 74 73 33 54 61 62 6c 65 20 2a  uild(Fts3Table *
18190 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  p){.  int rc;   
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
181c0 43 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  Code */..  rc = 
181d0 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70 2c  fts3DeleteAll(p,
181e0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
181f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18200 75 33 32 20 2a 61 53 7a 20 3d 20 30 3b 0a 20 20  u32 *aSz = 0;.  
18210 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20    u32 *aSzIns = 
18220 30 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 44  0;.    u32 *aSzD
18230 65 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  el = 0;.    sqli
18240 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
18250 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 45 6e  = 0;.    int nEn
18260 74 72 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  try = 0;..    /*
18270 20 43 6f 6d 70 6f 73 65 20 61 6e 64 20 70 72 65   Compose and pre
18280 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74 61 74  pare an SQL stat
18290 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f 70 20 74 68  ement to loop th
182a0 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e  rough the conten
182b0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  t table */.    c
182c0 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
182d0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
182e0 45 43 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52 65  ECT %s" , p->zRe
182f0 61 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20  adExprlist);.   
18300 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20   if( !zSql ){.  
18310 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18320 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
18330 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18340 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
18350 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
18360 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
18370 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18380 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  zSql);.    }..  
18390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
183a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
183b0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
183c0 75 33 32 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75  u32) * (p->nColu
183d0 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20 20 20 20 61  mn+1)*3;.      a
183e0 53 7a 20 3d 20 28 75 33 32 20 2a 29 73 71 6c 69  Sz = (u32 *)sqli
183f0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
18400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 7a  );.      if( aSz
18410 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
18420 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18430 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18440 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 53         memset(aS
18450 7a 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  z, 0, nByte);.  
18460 20 20 20 20 20 20 61 53 7a 49 6e 73 20 3d 20 26        aSzIns = &
18470 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  aSz[p->nColumn+1
18480 5d 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 44 65  ];.        aSzDe
18490 6c 20 3d 20 26 61 53 7a 49 6e 73 5b 70 2d 3e 6e  l = &aSzIns[p->n
184a0 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20  Column+1];.     
184b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68   }.    }..    wh
184c0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
184d0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
184e0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
184f0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Stmt) ){.      i
18500 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 72  nt iCol;.      r
18510 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
18520 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 73 71 6c  ermsDocid(p, sql
18530 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
18540 34 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  4(pStmt, 0));.  
18550 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75      aSz[p->nColu
18560 6d 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  mn] = 0;.      f
18570 6f 72 28 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53  or(iCol=0; rc==S
18580 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c  QLITE_OK && iCol
18590 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f  <p->nColumn; iCo
185a0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  l++){.        co
185b0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
185c0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
185d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
185e0 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b  (pStmt, iCol+1);
185f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
18600 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
18610 64 28 70 2c 20 7a 2c 20 69 43 6f 6c 2c 20 26 61  d(p, z, iCol, &a
18620 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 20  Sz[iCol]);.     
18630 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d     aSz[p->nColum
18640 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f  n] += sqlite3_co
18650 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
18660 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20  , iCol+1);.     
18670 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
18680 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
18690 20 20 20 20 20 20 20 66 74 73 33 49 6e 73 65 72         fts3Inser
186a0 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c  tDocsize(&rc, p,
186b0 20 61 53 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20   aSz);.      }. 
186c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
186d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
186e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
186f0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
18700 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
18710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18720 20 20 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20 20 20     nEntry++;.   
18730 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
18740 20 69 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d   iCol<=p->nColum
18750 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  n; iCol++){.    
18760 20 20 20 20 20 20 61 53 7a 49 6e 73 5b 69 43 6f        aSzIns[iCo
18770 6c 5d 20 2b 3d 20 61 53 7a 5b 69 43 6f 6c 5d 3b  l] += aSz[iCol];
18780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18790 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
187a0 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a   p->bHasStat ){.
187b0 20 20 20 20 20 20 66 74 73 33 55 70 64 61 74 65        fts3Update
187c0 44 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c 20 70  DocTotals(&rc, p
187d0 2c 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c  , aSzIns, aSzDel
187e0 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 7d  , nEntry);.    }
187f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18800 65 28 61 53 7a 29 3b 0a 0a 20 20 20 20 69 66 28  e(aSz);..    if(
18810 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20   pStmt ){.      
18820 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65  int rc2 = sqlite
18830 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
18840 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
18850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18860 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
18870 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18880 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
18890 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20  }../*.** Handle 
188a0 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e 53 45  a 'special' INSE
188b0 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  RT of the form:.
188c0 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52 54 20  **.**   "INSERT 
188d0 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20 56 41  INTO tbl(tbl) VA
188e0 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a 2a 2a  LUES(<expr>)".**
188f0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 61  .** Argument pVa
18900 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  l contains the r
18910 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72 3e 2e  esult of <expr>.
18920 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f   Currently the o
18930 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 66  nly .** meaningf
18940 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e 73 65  ul value to inse
18950 72 74 20 69 73 20 74 68 65 20 74 65 78 74 20 27  rt is the text '
18960 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a 73 74  optimize'..*/.st
18970 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 70 65  atic int fts3Spe
18980 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73 33 54  cialInsert(Fts3T
18990 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  able *p, sqlite3
189a0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20  _value *pVal){. 
189b0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
189c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189d0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
189e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
189f0 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zVal = (const c
18a00 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
18a10 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
18a20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
18a30 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
18a40 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20 21  (pVal);..  if( !
18a50 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  zVal ){.    retu
18a60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
18a70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61  .  }else if( nVa
18a80 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c 69 74  l==8 && 0==sqlit
18a90 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c  e3_strnicmp(zVal
18aa0 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20 38 29  , "optimize", 8)
18ab0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
18ac0 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c 20 30  3DoOptimize(p, 0
18ad0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
18ae0 56 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73 71 6c  Val==7 && 0==sql
18af0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
18b00 61 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c 20 37  al, "rebuild", 7
18b10 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  ) ){.    rc = ft
18b20 73 33 44 6f 52 65 62 75 69 6c 64 28 70 29 3b 0a  s3DoRebuild(p);.
18b30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
18b40 53 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  ST.  }else if( n
18b50 56 61 6c 3e 39 20 26 26 20 30 3d 3d 73 71 6c 69  Val>9 && 0==sqli
18b60 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
18b70 6c 2c 20 22 6e 6f 64 65 73 69 7a 65 3d 22 2c 20  l, "nodesize=", 
18b80 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4e 6f  9) ){.    p->nNo
18b90 64 65 53 69 7a 65 20 3d 20 61 74 6f 69 28 26 7a  deSize = atoi(&z
18ba0 56 61 6c 5b 39 5d 29 3b 0a 20 20 20 20 72 63 20  Val[9]);.    rc 
18bb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
18bc0 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 31 31  else if( nVal>11
18bd0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
18be0 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6d  trnicmp(zVal, "m
18bf0 61 78 70 65 6e 64 69 6e 67 3d 22 2c 20 39 29 20  axpending=", 9) 
18c00 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65  ){.    p->nMaxPe
18c10 6e 64 69 6e 67 44 61 74 61 20 3d 20 61 74 6f 69  ndingData = atoi
18c20 28 26 7a 56 61 6c 5b 31 31 5d 29 3b 0a 20 20 20  (&zVal[11]);.   
18c30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18c40 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
18c50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18c60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
18c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18c80 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 61  ** Delete all ca
18c90 63 68 65 64 20 64 65 66 65 72 72 65 64 20 64 6f  ched deferred do
18ca0 63 6c 69 73 74 73 2e 20 44 65 66 65 72 72 65 64  clists. Deferred
18cb0 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20 63 61   doclists are ca
18cc0 63 68 65 64 0a 2a 2a 20 28 61 6c 6c 6f 63 61 74  ched.** (allocat
18cd0 65 64 29 20 62 79 20 74 68 65 20 73 71 6c 69 74  ed) by the sqlit
18ce0 65 33 46 74 73 33 43 61 63 68 65 44 65 66 65 72  e3Fts3CacheDefer
18cf0 72 65 64 44 6f 63 6c 69 73 74 73 28 29 20 66 75  redDoclists() fu
18d00 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
18d10 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65 44  sqlite3Fts3FreeD
18d20 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28  eferredDoclists(
18d30 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
18d40 29 7b 0a 20 20 46 74 73 33 44 65 66 65 72 72 65  ){.  Fts3Deferre
18d50 64 54 6f 6b 65 6e 20 2a 70 44 65 66 3b 0a 20 20  dToken *pDef;.  
18d60 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e 70  for(pDef=pCsr->p
18d70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 3b 20  Deferred; pDef; 
18d80 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74  pDef=pDef->pNext
18d90 29 7b 0a 20 20 20 20 66 74 73 33 50 65 6e 64 69  ){.    fts3Pendi
18da0 6e 67 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65  ngListDelete(pDe
18db0 66 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  f->pList);.    p
18dc0 44 65 66 2d 3e 70 4c 69 73 74 20 3d 20 30 3b 0a  Def->pList = 0;.
18dd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
18de0 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  e all entries in
18df0 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65 66 66   the pCsr->pDeff
18e00 65 72 65 64 20 6c 69 73 74 2e 20 45 6e 74 72 69  ered list. Entri
18e10 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
18e20 0a 2a 2a 20 74 68 69 73 20 6c 69 73 74 20 75 73  .** this list us
18e30 69 6e 67 20 73 71 6c 69 74 65 33 46 74 73 33 44  ing sqlite3Fts3D
18e40 65 66 65 72 54 6f 6b 65 6e 28 29 2e 0a 2a 2f 0a  eferToken()..*/.
18e50 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
18e60 46 72 65 65 44 65 66 65 72 72 65 64 54 6f 6b 65  FreeDeferredToke
18e70 6e 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70  ns(Fts3Cursor *p
18e80 43 73 72 29 7b 0a 20 20 46 74 73 33 44 65 66 65  Csr){.  Fts3Defe
18e90 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 3b  rredToken *pDef;
18ea0 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54  .  Fts3DeferredT
18eb0 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b 0a 20 20 66  oken *pNext;.  f
18ec0 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e 70 44  or(pDef=pCsr->pD
18ed0 65 66 65 72 72 65 64 3b 20 70 44 65 66 3b 20 70  eferred; pDef; p
18ee0 44 65 66 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Def=pNext){.    
18ef0 70 4e 65 78 74 20 3d 20 70 44 65 66 2d 3e 70 4e  pNext = pDef->pN
18f00 65 78 74 3b 0a 20 20 20 20 66 74 73 33 50 65 6e  ext;.    fts3Pen
18f10 64 69 6e 67 4c 69 73 74 44 65 6c 65 74 65 28 70  dingListDelete(p
18f20 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  Def->pList);.   
18f30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
18f40 65 66 29 3b 0a 20 20 7d 0a 20 20 70 43 73 72 2d  ef);.  }.  pCsr-
18f50 3e 70 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  >pDeferred = 0;.
18f60 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18f70 65 20 64 65 66 65 72 72 65 64 2d 64 6f 63 6c 69  e deferred-docli
18f80 73 74 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65  sts for all toke
18f90 6e 73 20 69 6e 20 74 68 65 20 70 43 73 72 2d 3e  ns in the pCsr->
18fa0 70 44 65 66 65 72 72 65 64 20 6c 69 73 74 0a 2a  pDeferred list.*
18fb0 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  * based on the r
18fc0 6f 77 20 74 68 61 74 20 70 43 73 72 20 63 75 72  ow that pCsr cur
18fd0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
18fe0 2e 0a 2a 2a 0a 2a 2a 20 41 20 64 65 66 65 72 72  ..**.** A deferr
18ff0 65 64 2d 64 6f 63 6c 69 73 74 20 69 73 20 6c 69  ed-doclist is li
19000 6b 65 20 61 6e 79 20 6f 74 68 65 72 20 64 6f 63  ke any other doc
19010 6c 69 73 74 20 77 69 74 68 20 70 6f 73 69 74 69  list with positi
19020 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  on information.*
19030 2a 20 69 6e 63 6c 75 64 65 64 2c 20 65 78 63 65  * included, exce
19040 70 74 20 74 68 61 74 20 69 74 20 6f 6e 6c 79 20  pt that it only 
19050 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
19060 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 6f   for a single ro
19070 77 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c  w of the.** tabl
19080 65 2c 20 6e 6f 74 20 66 6f 72 20 61 6c 6c 20 72  e, not for all r
19090 6f 77 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ows..*/.int sqli
190a0 74 65 33 46 74 73 33 43 61 63 68 65 44 65 66 65  te3Fts3CacheDefe
190b0 72 72 65 64 44 6f 63 6c 69 73 74 73 28 46 74 73  rredDoclists(Fts
190c0 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a  3Cursor *pCsr){.
190d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
190e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
190f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
19100 20 2a 2f 0a 20 20 69 66 28 20 70 43 73 72 2d 3e   */.  if( pCsr->
19110 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20  pDeferred ){.   
19120 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19140 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
19150 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  e through table 
19160 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 73  columns */.    s
19170 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
19180 63 69 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  cid;         /* 
19190 44 6f 63 69 64 20 6f 66 20 74 68 65 20 72 6f 77  Docid of the row
191a0 20 70 43 73 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCsr points to 
191b0 2a 2f 0a 20 20 20 20 46 74 73 33 44 65 66 65 72  */.    Fts3Defer
191c0 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 3b 20  redToken *pDef; 
191d0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
191e0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
191f0 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
19200 2a 2f 0a 20 20 0a 20 20 20 20 46 74 73 33 54 61  */.  .    Fts3Ta
19210 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
19220 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65  ble *)pCsr->base
19230 2e 70 56 74 61 62 3b 0a 20 20 20 20 73 71 6c 69  .pVtab;.    sqli
19240 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70  te3_tokenizer *p
19250 54 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65  T = p->pTokenize
19260 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  r;.    sqlite3_t
19270 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
19280 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d  const *pModule =
19290 20 70 54 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20   pT->pModule;.  
192a0 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43   .    assert( pC
192b0 73 72 2d 3e 69 73 52 65 71 75 69 72 65 53 65 65  sr->isRequireSee
192c0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 69 44 6f 63  k==0 );.    iDoc
192d0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
192e0 75 6d 6e 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e  umn_int64(pCsr->
192f0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 0a 20 20  pStmt, 0);.  .  
19300 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
19310 6e 43 6f 6c 75 6d 6e 20 26 26 20 72 63 3d 3d 53  nColumn && rc==S
19320 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
19330 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
19340 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
19350 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
19360 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73 72  column_text(pCsr
19370 2d 3e 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20  ->pStmt, i+1);. 
19380 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b       sqlite3_tok
19390 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70  enizer_cursor *p
193a0 54 43 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 20  TC = 0;.  .     
193b0 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
193c0 4f 70 65 6e 28 70 54 2c 20 7a 54 65 78 74 2c 20  Open(pT, zText, 
193d0 2d 31 2c 20 26 70 54 43 29 3b 0a 20 20 20 20 20  -1, &pTC);.     
193e0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
193f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19400 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f   char const *zTo
19410 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42 75  ken;       /* Bu
19420 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
19430 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  token */.       
19440 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 20 20 20 20   int nToken;    
19450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19460 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
19470 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   token */.      
19480 20 20 69 6e 74 20 69 44 75 6d 31 2c 20 69 44 75    int iDum1, iDu
19490 6d 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  m2;         /* D
194a0 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20 2a  ummy variables *
194b0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50  /.        int iP
194c0 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
194d0 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
194e0 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54 65 78  of token in zTex
194f0 74 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20  t */.  .        
19500 70 54 43 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 20  pTC->pTokenizer 
19510 3d 20 70 54 3b 0a 20 20 20 20 20 20 20 20 72 63  = pT;.        rc
19520 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78   = pModule->xNex
19530 74 28 70 54 43 2c 20 26 7a 54 6f 6b 65 6e 2c 20  t(pTC, &zToken, 
19540 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c  &nToken, &iDum1,
19550 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b   &iDum2, &iPos);
19560 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 44 65  .        for(pDe
19570 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  f=pCsr->pDeferre
19580 64 3b 20 70 44 65 66 20 26 26 20 72 63 3d 3d 53  d; pDef && rc==S
19590 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65 66 3d 70  QLITE_OK; pDef=p
195a0 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Def->pNext){.   
195b0 20 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73         Fts3Phras
195c0 65 54 6f 6b 65 6e 20 2a 70 50 54 20 3d 20 70 44  eToken *pPT = pD
195d0 65 66 2d 3e 70 54 6f 6b 65 6e 3b 0a 20 20 20 20  ef->pToken;.    
195e0 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
195f0 3e 69 43 6f 6c 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d  >iCol>=p->nColum
19600 6e 20 7c 7c 20 70 44 65 66 2d 3e 69 43 6f 6c 3d  n || pDef->iCol=
19610 3d 69 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  =i).           &
19620 26 20 28 70 50 54 2d 3e 62 46 69 72 73 74 3d 3d  & (pPT->bFirst==
19630 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29 0a 20 20  0 || iPos==0).  
19640 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 54           && (pPT
19650 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 28  ->n==nToken || (
19660 70 50 54 2d 3e 69 73 50 72 65 66 69 78 20 26 26  pPT->isPrefix &&
19670 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e 29 29   pPT->n<nToken))
19680 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
19690 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54 6f 6b 65 6e  0==memcmp(zToken
196a0 2c 20 70 50 54 2d 3e 7a 2c 20 70 50 54 2d 3e 6e  , pPT->z, pPT->n
196b0 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
196c0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 33              fts3
196d0 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
196e0 64 28 26 70 44 65 66 2d 3e 70 4c 69 73 74 2c 20  d(&pDef->pList, 
196f0 69 44 6f 63 69 64 2c 20 69 2c 20 69 50 6f 73 2c  iDocid, i, iPos,
19700 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20   &rc);.         
19710 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
19720 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
19730 54 43 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  TC ) pModule->xC
19740 6c 6f 73 65 28 70 54 43 29 3b 0a 20 20 20 20 20  lose(pTC);.     
19750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19760 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
19770 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 0a  TE_OK;.    }.  .
19780 20 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73      for(pDef=pCs
19790 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44  r->pDeferred; pD
197a0 65 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ef && rc==SQLITE
197b0 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e  _OK; pDef=pDef->
197c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
197d0 28 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 29 7b  ( pDef->pList ){
197e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
197f0 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
19800 65 6e 64 56 61 72 69 6e 74 28 26 70 44 65 66 2d  endVarint(&pDef-
19810 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  >pList, 0);.    
19820 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19830 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
19840 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 44 65  nt sqlite3Fts3De
19850 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69 73 74 28  ferredTokenList(
19860 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54  .  Fts3DeferredT
19870 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63 68 61 72  oken *p, .  char
19880 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20 20 69 6e   **ppData, .  in
19890 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a 20 20 63  t *pnData.){.  c
198a0 68 61 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74  har *pRet;.  int
198b0 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c 69 74 65   nSkip;.  sqlite
198c0 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79 3b 0a 0a  3_int64 dummy;..
198d0 20 20 2a 70 70 44 61 74 61 20 3d 20 30 3b 0a 20    *ppData = 0;. 
198e0 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a 0a 20   *pnData = 0;.. 
198f0 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d 3d 30   if( p->pList==0
19900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
19910 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
19920 20 70 52 65 74 20 3d 20 28 63 68 61 72 20 2a 29   pRet = (char *)
19930 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
19940 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61 29 3b  ->pList->nData);
19950 0a 20 20 69 66 28 20 21 70 52 65 74 20 29 20 72  .  if( !pRet ) r
19960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
19970 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20 3d 20 73  EM;..  nSkip = s
19980 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
19990 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61 44  int(p->pList->aD
199a0 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  ata, &dummy);.  
199b0 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e 70 4c 69  *pnData = p->pLi
199c0 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 6b 69  st->nData - nSki
199d0 70 3b 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70  p;.  *ppData = p
199e0 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d 63 70 79  Ret;.  .  memcpy
199f0 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c 69 73 74  (pRet, &p->pList
19a00 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70 5d 2c 20  ->aData[nSkip], 
19a10 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75  *pnData);.  retu
19a20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19a30 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
19a40 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e 20 70 54  try for token pT
19a50 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70 43 73 72  oken to the pCsr
19a60 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69 73 74  ->pDeferred list
19a70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19a80 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 0a  Fts3DeferToken(.
19a90 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
19aa0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
19ab0 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20    /* Fts3 table 
19ac0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74 73 33  cursor */.  Fts3
19ad0 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f  PhraseToken *pTo
19ae0 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ken,        /* T
19af0 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 20 2a 2f  oken to defer */
19b00 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68 61     /* Column tha
19b30 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20 61 70 70  t token must app
19b40 65 61 72 20 69 6e 20 28 6f 72 20 2d 31 29 20 2a  ear in (or -1) *
19b50 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65 66 65 72  /.){.  Fts3Defer
19b60 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65 72  redToken *pDefer
19b70 72 65 64 3b 0a 20 20 70 44 65 66 65 72 72 65 64  red;.  pDeferred
19b80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
19b90 63 28 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72  c(sizeof(*pDefer
19ba0 72 65 64 29 29 3b 0a 20 20 69 66 28 20 21 70 44  red));.  if( !pD
19bb0 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20 72  eferred ){.    r
19bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
19bd0 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
19be0 28 70 44 65 66 65 72 72 65 64 2c 20 30 2c 20 73  (pDeferred, 0, s
19bf0 69 7a 65 6f 66 28 2a 70 44 65 66 65 72 72 65 64  izeof(*pDeferred
19c00 29 29 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d  ));.  pDeferred-
19c10 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f 6b 65 6e  >pToken = pToken
19c20 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e 70  ;.  pDeferred->p
19c30 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e 70 44 65  Next = pCsr->pDe
19c40 66 65 72 72 65 64 3b 20 0a 20 20 70 44 65 66 65  ferred; .  pDefe
19c50 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f  rred->iCol = iCo
19c60 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65  l;.  pCsr->pDefe
19c70 72 72 65 64 20 3d 20 70 44 65 66 65 72 72 65 64  rred = pDeferred
19c80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
19c90 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3d 3d  ken->pDeferred==
19ca0 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70  0 );.  pToken->p
19cb0 44 65 66 65 72 72 65 64 20 3d 20 70 44 65 66 65  Deferred = pDefe
19cc0 72 72 65 64 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rred;..  return 
19cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19ce0 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61 6c 75 65  .** SQLite value
19cf0 20 70 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73   pRowid contains
19d00 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20   the rowid of a 
19d10 72 6f 77 20 74 68 61 74 20 6d 61 79 20 6f 72 20  row that may or 
19d20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 70 72  may not be.** pr
19d30 65 73 65 6e 74 20 69 6e 20 74 68 65 20 46 54 53  esent in the FTS
19d40 33 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69  3 table. If it i
19d50 73 2c 20 64 65 6c 65 74 65 20 69 74 20 61 6e 64  s, delete it and
19d60 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 6e 74   adjust the cont
19d70 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75 62 73 69  ents.** of subsi
19d80 64 75 61 72 79 20 64 61 74 61 20 73 74 72 75 63  duary data struc
19d90 74 75 72 65 73 20 61 63 63 6f 72 64 69 6e 67 6c  tures accordingl
19da0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
19db0 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77   fts3DeleteByRow
19dc0 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  id(.  Fts3Table 
19dd0 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p, .  sqlite3_v
19de0 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 0a 20  alue *pRowid, . 
19df0 20 69 6e 74 20 2a 70 6e 44 6f 63 2c 0a 20 20 75   int *pnDoc,.  u
19e00 33 32 20 2a 61 53 7a 44 65 6c 0a 29 7b 0a 20 20  32 *aSzDel.){.  
19e10 69 6e 74 20 69 73 45 6d 70 74 79 20 3d 20 30 3b  int isEmpty = 0;
19e20 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33  .  int rc = fts3
19e30 49 73 45 6d 70 74 79 28 70 2c 20 70 52 6f 77 69  IsEmpty(p, pRowi
19e40 64 2c 20 26 69 73 45 6d 70 74 79 29 3b 0a 20 20  d, &isEmpty);.  
19e50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19e60 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 45  K ){.    if( isE
19e70 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mpty ){.      /*
19e80 20 44 65 6c 65 74 69 6e 67 20 74 68 69 73 20 72   Deleting this r
19e90 6f 77 20 6d 65 61 6e 73 20 74 68 65 20 77 68 6f  ow means the who
19ea0 6c 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  le table is empt
19eb0 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a  y. In this case.
19ec0 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20        ** delete 
19ed0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
19ee0 61 6c 6c 20 74 68 72 65 65 20 74 61 62 6c 65 73  all three tables
19ef0 20 61 6e 64 20 74 68 72 6f 77 20 61 77 61 79 20   and throw away 
19f00 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  any.      ** dat
19f10 61 20 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67  a in the pending
19f20 54 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65  Terms hash table
19f30 2e 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  .  */.      rc =
19f40 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70   fts3DeleteAll(p
19f50 2c 20 31 29 3b 0a 20 20 20 20 20 20 2a 70 6e 44  , 1);.      *pnD
19f60 6f 63 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31 3b  oc = *pnDoc - 1;
19f70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19f80 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19f90 69 52 65 6d 6f 76 65 20 3d 20 73 71 6c 69 74 65  iRemove = sqlite
19fa0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 52  3_value_int64(pR
19fb0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 72 63 20  owid);.      rc 
19fc0 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
19fd0 6d 73 44 6f 63 69 64 28 70 2c 20 69 52 65 6d 6f  msDocid(p, iRemo
19fe0 76 65 29 3b 0a 20 20 20 20 20 20 66 74 73 33 44  ve);.      fts3D
19ff0 65 6c 65 74 65 54 65 72 6d 73 28 26 72 63 2c 20  eleteTerms(&rc, 
1a000 70 2c 20 70 52 6f 77 69 64 2c 20 61 53 7a 44 65  p, pRowid, aSzDe
1a010 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  l);.      if( p-
1a020 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20  >zContentTbl==0 
1a030 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53  ){.        fts3S
1a040 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
1a050 51 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e 54 45 4e  QL_DELETE_CONTEN
1a060 54 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20  T, &pRowid);.   
1a070 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1a080 5f 63 68 61 6e 67 65 73 28 70 2d 3e 64 62 29 20  _changes(p->db) 
1a090 29 20 2a 70 6e 44 6f 63 20 3d 20 2a 70 6e 44 6f  ) *pnDoc = *pnDo
1a0a0 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  c - 1;.      }el
1a0b0 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 44  se{.        *pnD
1a0c0 6f 63 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31 3b  oc = *pnDoc - 1;
1a0d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a0e0 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  f( p->bHasDocsiz
1a0f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  e ){.        fts
1a100 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c  3SqlExec(&rc, p,
1a110 20 53 51 4c 5f 44 45 4c 45 54 45 5f 44 4f 43 53   SQL_DELETE_DOCS
1a120 49 5a 45 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20  IZE, &pRowid);. 
1a130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a140 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1a150 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1a160 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77  ction does the w
1a170 6f 72 6b 20 66 6f 72 20 74 68 65 20 78 55 70 64  ork for the xUpd
1a180 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20 46 54  ate method of FT
1a190 53 33 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  S3 virtual.** ta
1a1a0 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  bles..*/.int sql
1a1b0 69 74 65 33 46 74 73 33 55 70 64 61 74 65 4d 65  ite3Fts3UpdateMe
1a1c0 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
1a1d0 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20  vtab *pVtab,    
1a1e0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
1a1f0 76 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  vtab object */. 
1a200 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67 75   /* Size of argu
1a230 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  ment array */.  
1a240 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1a250 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20  apVal,          
1a260 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
1a270 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ments */.  sqlit
1a280 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 20  e_int64 *pRowid 
1a290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1a2a0 54 3a 20 54 68 65 20 61 66 66 65 63 74 65 64 20  T: The affected 
1a2b0 28 6f 72 20 65 66 66 65 63 74 65 64 29 20 72 6f  (or effected) ro
1a2c0 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  wid */.){.  Fts3
1a2d0 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
1a2e0 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20  Table *)pVtab;. 
1a2f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a300 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1a310 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1a320 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 6d 6f 76  */.  int isRemov
1a330 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1a340 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1a350 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
1a360 4c 45 54 45 20 2a 2f 0a 20 20 75 33 32 20 2a 61  LETE */.  u32 *a
1a370 53 7a 49 6e 73 20 3d 20 30 3b 20 20 20 20 20 20  SzIns = 0;      
1a380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a390 65 73 20 6f 66 20 69 6e 73 65 72 74 65 64 20 64  es of inserted d
1a3a0 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 75 33  ocuments */.  u3
1a3b0 32 20 2a 61 53 7a 44 65 6c 3b 20 20 20 20 20 20  2 *aSzDel;      
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a3d0 20 53 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65   Sizes of delete
1a3e0 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20  d documents */. 
1a3f0 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 20   int nChng = 0; 
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a410 20 2f 2a 20 4e 65 74 20 63 68 61 6e 67 65 20 69   /* Net change i
1a420 6e 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75  n number of docu
1a430 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62  ments */.  int b
1a440 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 30 3b 0a  InsertDone = 0;.
1a450 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
1a460 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 0a 20  egments==0 );.. 
1a470 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20   /* Check for a 
1a480 22 73 70 65 63 69 61 6c 22 20 49 4e 53 45 52 54  "special" INSERT
1a490 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20   operation. One 
1a4a0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
1a4b0 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20  *.  **   INSERT 
1a4c0 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41  INTO xyz(xyz) VA
1a4d0 4c 55 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b  LUES('command');
1a4e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  .  */.  if( nArg
1a4f0 3e 31 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  >1 .   && sqlite
1a500 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
1a510 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  al[0])==SQLITE_N
1a520 55 4c 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74  ULL .   && sqlit
1a530 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
1a540 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  Val[p->nColumn+2
1a550 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])!=SQLITE_NULL 
1a560 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  .  ){.    rc = f
1a570 74 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74  ts3SpecialInsert
1a580 28 70 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f  (p, apVal[p->nCo
1a590 6c 75 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f  lumn+2]);.    go
1a5a0 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20  to update_out;. 
1a5b0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
1a5c0 65 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  e space to hold 
1a5d0 74 68 65 20 63 68 61 6e 67 65 20 69 6e 20 64 6f  the change in do
1a5e0 63 75 6d 65 6e 74 20 73 69 7a 65 73 20 2a 2f 0a  cument sizes */.
1a5f0 20 20 61 53 7a 49 6e 73 20 3d 20 73 71 6c 69 74    aSzIns = sqlit
1a600 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
1a610 66 28 61 53 7a 49 6e 73 5b 30 5d 29 2a 28 70 2d  f(aSzIns[0])*(p-
1a620 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a 32 20 29 3b  >nColumn+1)*2 );
1a630 0a 20 20 69 66 28 20 61 53 7a 49 6e 73 3d 3d 30  .  if( aSzIns==0
1a640 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a650 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
1a660 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a  oto update_out;.
1a670 20 20 7d 0a 20 20 61 53 7a 44 65 6c 20 3d 20 26    }.  aSzDel = &
1a680 61 53 7a 49 6e 73 5b 70 2d 3e 6e 43 6f 6c 75 6d  aSzIns[p->nColum
1a690 6e 2b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  n+1];.  memset(a
1a6a0 53 7a 49 6e 73 2c 20 30 2c 20 73 69 7a 65 6f 66  SzIns, 0, sizeof
1a6b0 28 61 53 7a 49 6e 73 5b 30 5d 29 2a 28 70 2d 3e  (aSzIns[0])*(p->
1a6c0 6e 43 6f 6c 75 6d 6e 2b 31 29 2a 32 29 3b 0a 0a  nColumn+1)*2);..
1a6d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a6e0 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  an INSERT operat
1a6f0 69 6f 6e 2c 20 6f 72 20 61 6e 20 55 50 44 41 54  ion, or an UPDAT
1a700 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20  E that modifies 
1a710 74 68 65 20 72 6f 77 69 64 0a 20 20 2a 2a 20 76  the rowid.  ** v
1a720 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20  alue, then this 
1a730 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72  operation requir
1a740 65 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  es constraint ha
1a750 6e 64 6c 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  ndling..  **.  *
1a760 2a 20 49 66 20 74 68 65 20 6f 6e 2d 63 6f 6e 66  * If the on-conf
1a770 6c 69 63 74 20 6d 6f 64 65 20 69 73 20 52 45 50  lict mode is REP
1a780 4c 41 43 45 2c 20 74 68 69 73 20 6d 65 61 6e 73  LACE, this means
1a790 20 74 68 61 74 20 74 68 65 20 65 78 69 73 74 69   that the existi
1a7a0 6e 67 20 72 6f 77 0a 20 20 2a 2a 20 73 68 6f 75  ng row.  ** shou
1a7b0 6c 64 20 62 65 20 64 65 6c 65 74 65 64 20 66 72  ld be deleted fr
1a7c0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1a7d0 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67  before inserting
1a7e0 20 74 68 65 20 6e 65 77 20 72 6f 77 2e 20 4f 72   the new row. Or
1a7f0 2c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 6f 6e  ,.  ** if the on
1a800 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69  -conflict mode i
1a810 73 20 6f 74 68 65 72 20 74 68 61 6e 20 52 45 50  s other than REP
1a820 4c 41 43 45 2c 20 74 68 65 6e 20 74 68 69 73 20  LACE, then this 
1a830 6d 65 74 68 6f 64 20 6d 75 73 74 0a 20 20 2a 2a  method must.  **
1a840 20 64 65 74 65 63 74 20 74 68 65 20 63 6f 6e 66   detect the conf
1a850 6c 69 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  lict and return 
1a860 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1a870 54 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69  T before beginni
1a880 6e 67 20 74 6f 0a 20 20 2a 2a 20 6d 6f 64 69 66  ng to.  ** modif
1a890 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
1a8a0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1a8b0 6e 41 72 67 3e 31 20 26 26 20 70 2d 3e 7a 43 6f  nArg>1 && p->zCo
1a8c0 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20  ntentTbl==0 ){. 
1a8d0 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 76     /* Find the v
1a8e0 61 6c 75 65 20 6f 62 6a 65 63 74 20 74 68 61 74  alue object that
1a8f0 20 68 6f 6c 64 73 20 74 68 65 20 6e 65 77 20 72   holds the new r
1a900 6f 77 69 64 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  owid value. */. 
1a910 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
1a920 20 2a 70 4e 65 77 52 6f 77 69 64 20 3d 20 61 70   *pNewRowid = ap
1a930 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e  Val[3+p->nColumn
1a940 5d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ];.    if( sqlit
1a950 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e  e3_value_type(pN
1a960 65 77 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45  ewRowid)==SQLITE
1a970 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  _NULL ){.      p
1a980 4e 65 77 52 6f 77 69 64 20 3d 20 61 70 56 61 6c  NewRowid = apVal
1a990 5b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  [1];.    }..    
1a9a0 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
1a9b0 65 5f 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64  e_type(pNewRowid
1a9c0 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 26  )!=SQLITE_NULL &
1a9d0 26 20 28 20 0a 20 20 20 20 20 20 20 20 73 71 6c  & ( .        sql
1a9e0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
1a9f0 61 70 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54  apVal[0])==SQLIT
1aa00 45 5f 4e 55 4c 4c 0a 20 20 20 20 20 7c 7c 20 73  E_NULL.     || s
1aa10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1aa20 36 34 28 61 70 56 61 6c 5b 30 5d 29 21 3d 73 71  64(apVal[0])!=sq
1aa30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
1aa40 34 28 70 4e 65 77 52 6f 77 69 64 29 0a 20 20 20  4(pNewRowid).   
1aa50 20 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68   )){.      /* Th
1aa60 65 20 6e 65 77 20 72 6f 77 69 64 20 69 73 20 6e  e new rowid is n
1aa70 6f 74 20 4e 55 4c 4c 20 28 69 6e 20 74 68 69 73  ot NULL (in this
1aa80 20 63 61 73 65 20 74 68 65 20 72 6f 77 69 64 20   case the rowid 
1aa90 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
1aaa0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1aab0 73 73 69 67 6e 65 64 20 61 6e 64 20 74 68 65 72  ssigned and ther
1aac0 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 6f  e is no chance o
1aad0 66 20 61 20 63 6f 6e 66 6c 69 63 74 29 2c 20 61  f a conflict), a
1aae0 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nd .      ** the
1aaf0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65 69   statement is ei
1ab00 74 68 65 72 20 61 6e 20 49 4e 53 45 52 54 20 6f  ther an INSERT o
1ab10 72 20 61 6e 20 55 50 44 41 54 45 20 74 68 61 74  r an UPDATE that
1ab20 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 20 20   modifies the.  
1ab30 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 63 6f 6c      ** rowid col
1ab40 75 6d 6e 2e 20 53 6f 20 69 66 20 74 68 65 20 63  umn. So if the c
1ab50 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20  onflict mode is 
1ab60 52 45 50 4c 41 43 45 2c 20 74 68 65 6e 20 64 65  REPLACE, then de
1ab70 6c 65 74 65 20 61 6e 79 0a 20 20 20 20 20 20 2a  lete any.      *
1ab80 2a 20 65 78 69 73 74 69 6e 67 20 72 6f 77 20 77  * existing row w
1ab90 69 74 68 20 72 6f 77 69 64 3d 70 4e 65 77 52 6f  ith rowid=pNewRo
1aba0 77 69 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  wid. .      **. 
1abb0 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74       ** Or, if t
1abc0 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65  he conflict mode
1abd0 20 69 73 20 6e 6f 74 20 52 45 50 4c 41 43 45 2c   is not REPLACE,
1abe0 20 69 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   insert the new 
1abf0 72 65 63 6f 72 64 20 69 6e 74 6f 20 0a 20 20 20  record into .   
1ac00 20 20 20 2a 2a 20 74 68 65 20 25 5f 63 6f 6e 74     ** the %_cont
1ac10 65 6e 74 20 74 61 62 6c 65 2e 20 49 66 20 77 65  ent table. If we
1ac20 20 68 69 74 20 74 68 65 20 64 75 70 6c 69 63 61   hit the duplica
1ac30 74 65 20 72 6f 77 69 64 20 63 6f 6e 73 74 72 61  te rowid constra
1ac40 69 6e 74 20 28 6f 72 20 61 6e 79 0a 20 20 20 20  int (or any.    
1ac50 20 20 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72    ** other error
1ac60 29 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  ) while doing so
1ac70 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  , return immedia
1ac80 74 65 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tely..      **. 
1ac90 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61       ** This bra
1aca0 6e 63 68 20 6d 61 79 20 61 6c 73 6f 20 72 75 6e  nch may also run
1acb0 20 69 66 20 70 4e 65 77 52 6f 77 69 64 20 63 6f   if pNewRowid co
1acc0 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65 20 74  ntains a value t
1acd0 68 61 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20  hat cannot.     
1ace0 20 2a 2a 20 62 65 20 6c 6f 73 73 6c 65 73 73 6c   ** be losslessl
1acf0 79 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  y converted to a
1ad00 6e 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 74 68  n integer. In th
1ad10 69 73 20 63 61 73 65 2c 20 74 68 65 20 65 76 65  is case, the eve
1ad20 6e 74 75 61 6c 20 0a 20 20 20 20 20 20 2a 2a 20  ntual .      ** 
1ad30 63 61 6c 6c 20 74 6f 20 66 74 73 33 49 6e 73 65  call to fts3Inse
1ad40 72 74 44 61 74 61 28 29 20 28 65 69 74 68 65 72  rtData() (either
1ad50 20 6a 75 73 74 20 62 65 6c 6f 77 20 6f 72 20 66   just below or f
1ad60 75 72 74 68 65 72 20 6f 6e 20 69 6e 20 74 68 69  urther on in thi
1ad70 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
1ad80 69 6f 6e 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ion) will return
1ad90 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
1ada0 2e 20 49 66 20 66 74 73 33 44 65 6c 65 74 65 42  . If fts3DeleteB
1adb0 79 52 6f 77 69 64 20 69 73 20 0a 20 20 20 20 20  yRowid is .     
1adc0 20 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 69 74 20   ** invoked, it 
1add0 77 69 6c 6c 20 64 65 6c 65 74 65 20 7a 65 72 6f  will delete zero
1ade0 20 72 6f 77 73 20 28 73 69 6e 63 65 20 6e 6f 20   rows (since no 
1adf0 72 6f 77 20 77 69 6c 6c 20 68 61 76 65 0a 20 20  row will have.  
1ae00 20 20 20 20 2a 2a 20 64 6f 63 69 64 3d 24 70 4e      ** docid=$pN
1ae10 65 77 52 6f 77 69 64 20 69 66 20 24 70 4e 65 77  ewRowid if $pNew
1ae20 52 6f 77 69 64 20 69 73 20 6e 6f 74 20 61 6e 20  Rowid is not an 
1ae30 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29 2e 0a  integer value)..
1ae40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1ae50 66 28 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  f( sqlite3_vtab_
1ae60 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28 70 2d 3e 64  on_conflict(p->d
1ae70 62 29 3d 3d 53 51 4c 49 54 45 5f 52 45 50 4c 41  b)==SQLITE_REPLA
1ae80 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CE ){.        rc
1ae90 20 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79 52   = fts3DeleteByR
1aea0 6f 77 69 64 28 70 2c 20 70 4e 65 77 52 6f 77 69  owid(p, pNewRowi
1aeb0 64 2c 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65  d, &nChng, aSzDe
1aec0 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
1aed0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
1aee0 73 33 49 6e 73 65 72 74 44 61 74 61 28 70 2c 20  s3InsertData(p, 
1aef0 61 70 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a  apVal, pRowid);.
1af00 20 20 20 20 20 20 20 20 62 49 6e 73 65 72 74 44          bInsertD
1af10 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
1af20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1af30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1af40 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74  {.    goto updat
1af50 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
1af60 20 49 66 20 74 68 69 73 20 69 73 20 61 20 44 45   If this is a DE
1af70 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 6f  LETE or UPDATE o
1af80 70 65 72 61 74 69 6f 6e 2c 20 72 65 6d 6f 76 65  peration, remove
1af90 20 74 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e   the old record.
1afa0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1afb0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
1afc0 61 6c 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  al[0])!=SQLITE_N
1afd0 55 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ULL ){.    asser
1afe0 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t( sqlite3_value
1aff0 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d  _type(apVal[0])=
1b000 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
1b010 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  );.    rc = fts3
1b020 44 65 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c  DeleteByRowid(p,
1b030 20 61 70 56 61 6c 5b 30 5d 2c 20 26 6e 43 68 6e   apVal[0], &nChn
1b040 67 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20  g, aSzDel);.    
1b050 69 73 52 65 6d 6f 76 65 20 3d 20 31 3b 0a 20 20  isRemove = 1;.  
1b060 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 69  }.  .  /* If thi
1b070 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f  s is an INSERT o
1b080 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  r UPDATE operati
1b090 6f 6e 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  on, insert the n
1b0a0 65 77 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20  ew record. */.  
1b0b0 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 72 63  if( nArg>1 && rc
1b0c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b0d0 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 44 6f     if( bInsertDo
1b0e0 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ne==0 ){.      r
1b0f0 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44 61  c = fts3InsertDa
1b100 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f  ta(p, apVal, pRo
1b110 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
1b120 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
1b130 52 41 49 4e 54 20 26 26 20 70 2d 3e 7a 43 6f 6e  RAINT && p->zCon
1b140 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20  tentTbl==0 ){.  
1b150 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 5f 43        rc = FTS_C
1b160 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20  ORRUPT_VTAB;.   
1b170 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1b180 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b190 20 26 26 20 28 21 69 73 52 65 6d 6f 76 65 20 7c   && (!isRemove |
1b1a0 7c 20 2a 70 52 6f 77 69 64 21 3d 70 2d 3e 69 50  | *pRowid!=p->iP
1b1b0 72 65 76 44 6f 63 69 64 20 29 20 29 7b 0a 20 20  revDocid ) ){.  
1b1c0 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e      rc = fts3Pen
1b1d0 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70  dingTermsDocid(p
1b1e0 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  , *pRowid);.    
1b1f0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1b200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b210 20 61 73 73 65 72 74 28 20 70 2d 3e 69 50 72 65   assert( p->iPre
1b220 76 44 6f 63 69 64 3d 3d 2a 70 52 6f 77 69 64 20  vDocid==*pRowid 
1b230 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
1b240 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70 2c  s3InsertTerms(p,
1b250 20 61 70 56 61 6c 2c 20 61 53 7a 49 6e 73 29 3b   apVal, aSzIns);
1b260 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b270 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b  ->bHasDocsize ){
1b280 0a 20 20 20 20 20 20 66 74 73 33 49 6e 73 65 72  .      fts3Inser
1b290 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c  tDocsize(&rc, p,
1b2a0 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d 0a   aSzIns);.    }.
1b2b0 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 7d      nChng++;.  }
1b2c0 0a 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73 53  ..  if( p->bHasS
1b2d0 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73 33 55  tat ){.    fts3U
1b2e0 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 26  pdateDocTotals(&
1b2f0 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61  rc, p, aSzIns, a
1b300 53 7a 44 65 6c 2c 20 6e 43 68 6e 67 29 3b 0a 20  SzDel, nChng);. 
1b310 20 7d 0a 0a 20 75 70 64 61 74 65 5f 6f 75 74 3a   }.. update_out:
1b320 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1b330 61 53 7a 49 6e 73 29 3b 0a 20 20 73 71 6c 69 74  aSzIns);.  sqlit
1b340 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c  e3Fts3SegmentsCl
1b350 6f 73 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ose(p);.  return
1b360 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46   rc;.}../* .** F
1b370 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 69 6e  lush any data in
1b380 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
1b390 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  ms hash table to
1b3a0 20 64 69 73 6b 2e 20 49 66 20 73 75 63 63 65 73   disk. If succes
1b3b0 73 66 75 6c 2c 0a 2a 2a 20 6d 65 72 67 65 20 61  sful,.** merge a
1b3c0 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ll segments in t
1b3d0 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 63  he database (inc
1b3e0 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 73  luding the new s
1b3f0 65 67 6d 65 6e 74 2c 20 69 66 20 0a 2a 2a 20 74  egment, if .** t
1b400 68 65 72 65 20 77 61 73 20 61 6e 79 20 64 61 74  here was any dat
1b410 61 20 74 6f 20 66 6c 75 73 68 29 20 69 6e 74 6f  a to flush) into
1b420 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
1b430 74 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t. .*/.int sqlit
1b440 65 33 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 46  e3Fts3Optimize(F
1b450 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
1b460 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
1b470 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1b480 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 66 74  b, "SAVEPOINT ft
1b490 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  s3", 0, 0, 0);. 
1b4a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b4b0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  OK ){.    rc = f
1b4c0 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c  ts3DoOptimize(p,
1b4d0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   1);.    if( rc=
1b4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
1b4f0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1b500 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
1b510 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1b520 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 66 74  >db, "RELEASE ft
1b530 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  s3", 0, 0, 0);. 
1b540 20 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51       if( rc2!=SQ
1b550 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
1b560 63 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c2;.    }else{. 
1b570 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
1b580 63 28 70 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41  c(p->db, "ROLLBA
1b590 43 4b 20 54 4f 20 66 74 73 33 22 2c 20 30 2c 20  CK TO fts3", 0, 
1b5a0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
1b5b0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
1b5c0 20 22 52 45 4c 45 41 53 45 20 66 74 73 33 22 2c   "RELEASE fts3",
1b5d0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
1b5e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
1b5f0 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
1b600 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1b610 0a 7d 0a 0a 23 65 6e 64 69 66 0a                 .}..#endif.