/ Hex Artifact Content
Login

Artifact f87bb2d27d31cb7a7bf306747079095393c9d073:


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 20 20 69 6e 74 20  for PT */.  int 
1010: 62 4c 6f 6f 6b 75 70 3b 20 20 20 20 20 20 20 20  bLookup;        
1020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1030: 72 75 65 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70  rue for a lookup
1040: 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 73 71 6c 69   only */..  sqli
1050: 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74  te3_int64 iStart
1060: 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 52  Block;      /* R
1070: 6f 77 69 64 20 6f 66 20 66 69 72 73 74 20 6c 65  owid of first le
1080: 61 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76  af block to trav
1090: 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  erse */.  sqlite
10a0: 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e 64  3_int64 iLeafEnd
10b0: 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20 52 6f 77  Block;    /* Row
10c0: 69 64 20 6f 66 20 66 69 6e 61 6c 20 6c 65 61 66  id of final leaf
10d0: 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65 72   block to traver
10e0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
10f0: 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b 3b  int64 iEndBlock;
1100: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1110: 20 6f 66 20 66 69 6e 61 6c 20 62 6c 6f 63 6b 20   of final block 
1120: 69 6e 20 73 65 67 6d 65 6e 74 20 28 6f 72 20 30  in segment (or 0
1130: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  ) */.  sqlite3_i
1140: 6e 74 36 34 20 69 43 75 72 72 65 6e 74 42 6c 6f  nt64 iCurrentBlo
1150: 63 6b 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  ck;    /* Curren
1160: 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 28 6f 72  t leaf block (or
1170: 20 30 29 20 2a 2f 0a 0a 20 20 63 68 61 72 20 2a   0) */..  char *
1180: 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  aNode;          
1190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
11a0: 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64 61 74  nter to node dat
11b0: 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  a (or NULL) */. 
11c0: 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20 20 20   int nNode;     
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
11f0: 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f 72 20  er at aNode (or 
1200: 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70  0) */.  int nPop
1210: 75 6c 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  ulate;          
1220: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 30          /* If >0
1230: 2c 20 62 79 74 65 73 20 6f 66 20 62 75 66 66 65  , bytes of buffe
1240: 72 20 61 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65 64  r aNode[] loaded
1250: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c   */.  sqlite3_bl
1260: 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20  ob *pBlob;      
1270: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
1280: 4e 55 4c 4c 2c 20 62 6c 6f 62 20 68 61 6e 64 6c  NULL, blob handl
1290: 65 20 74 6f 20 72 65 61 64 20 6e 6f 64 65 20 2a  e to read node *
12a0: 2f 0a 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65  /..  Fts3HashEle
12b0: 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65 6d 3b 0a  m **ppNextElem;.
12c0: 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20  .  /* Variables 
12d0: 73 65 74 20 62 79 20 66 74 73 33 53 65 67 52 65  set by fts3SegRe
12e0: 61 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65 73  aderNext(). Thes
12f0: 65 20 6d 61 79 20 62 65 20 72 65 61 64 20 64 69  e may be read di
1300: 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
1310: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79 20  he caller. They 
1320: 61 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20 74  are valid from t
1330: 68 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74 52  he time SegmentR
1340: 65 61 64 65 72 4e 65 77 28 29 20 72 65 74 75 72  eaderNew() retur
1350: 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53 65  ns.  ** until Se
1360: 67 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74 28  gmentReaderNext(
1370: 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
1380: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
1390: 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28 69  QLITE_OK.  ** (i
13a0: 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29  .e. SQLITE_DONE)
13b0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ..  */.  int nTe
13c0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
13d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13e0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  er of bytes in c
13f0: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
1400: 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
1430: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
1440: 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63 3b   int nTermAlloc;
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
1470: 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66 66  ze of zTerm buff
1480: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  er */.  char *aD
1490: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
14a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14b0: 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 6f 66  er to doclist of
14c0: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
14d0: 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74  /.  int nDoclist
14e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14f0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
1500: 6f 63 6c 69 73 74 20 69 6e 20 63 75 72 72 65 6e  oclist in curren
1510: 74 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f 2a  t entry */..  /*
1520: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1530: 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65  ariables are use
1540: 64 20 62 79 20 66 74 73 33 53 65 67 52 65 61 64  d by fts3SegRead
1550: 65 72 4e 65 78 74 44 6f 63 69 64 28 29 20 74 6f  erNextDocid() to
1560: 20 69 74 65 72 61 74 65 20 0a 20 20 2a 2a 20 74   iterate .  ** t
1570: 68 72 6f 75 67 68 20 74 68 65 20 63 75 72 72 65  hrough the curre
1580: 6e 74 20 64 6f 63 6c 69 73 74 20 28 61 44 6f 63  nt doclist (aDoc
1590: 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 29 2e 0a  list/nDoclist)..
15a0: 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f 66    */.  char *pOf
15b0: 66 73 65 74 4c 69 73 74 3b 0a 20 20 69 6e 74 20  fsetList;.  int 
15c0: 6e 4f 66 66 73 65 74 4c 69 73 74 3b 20 20 20 20  nOffsetList;    
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15e0: 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 70 65  or descending pe
15f0: 6e 64 69 6e 67 20 73 65 67 2d 72 65 61 64 65 72  nding seg-reader
1600: 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c 69  s only */.  sqli
1610: 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
1620: 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66 74  ;.};..#define ft
1630: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
1640: 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70 70  ding(p) ((p)->pp
1650: 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64 65  NextElem!=0).#de
1660: 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61 64  fine fts3SegRead
1670: 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29 20  erIsRootOnly(p) 
1680: 28 28 70 29 2d 3e 61 4e 6f 64 65 3d 3d 28 63 68  ((p)->aNode==(ch
1690: 61 72 20 2a 29 26 28 70 29 5b 31 5d 29 0a 0a 2f  ar *)&(p)[1])../
16a0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
16b0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
16c0: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 72  re is used to cr
16d0: 65 61 74 65 20 61 20 73 65 67 6d 65 6e 74 20 62  eate a segment b
16e0: 2d 74 72 65 65 20 69 6e 20 74 68 65 0a 2a 2a 20  -tree in the.** 
16f0: 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 69 6e  database. The in
1700: 74 65 72 6e 61 6c 20 64 65 74 61 69 6c 73 20 6f  ternal details o
1710: 66 20 74 68 69 73 20 74 79 70 65 20 61 72 65 20  f this type are 
1720: 6f 6e 6c 79 20 61 63 63 65 73 73 65 64 20 62 79  only accessed by
1730: 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
1740: 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
1750: 2a 2a 20 20 20 66 74 73 33 53 65 67 57 72 69 74  **   fts3SegWrit
1760: 65 72 41 64 64 28 29 0a 2a 2a 20 20 20 66 74 73  erAdd().**   fts
1770: 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68 28  3SegWriterFlush(
1780: 29 0a 2a 2a 20 20 20 66 74 73 33 53 65 67 57 72  ).**   fts3SegWr
1790: 69 74 65 72 46 72 65 65 28 29 0a 2a 2f 0a 73 74  iterFree().*/.st
17a0: 72 75 63 74 20 53 65 67 6d 65 6e 74 57 72 69 74  ruct SegmentWrit
17b0: 65 72 20 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  er {.  SegmentNo
17c0: 64 65 20 2a 70 54 72 65 65 3b 20 20 20 20 20 20  de *pTree;      
17d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
17e0: 72 20 74 6f 20 69 6e 74 65 72 69 6f 72 20 74 72  r to interior tr
17f0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
1800: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1810: 69 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  iFirst;         
1820: 20 20 2f 2a 20 46 69 72 73 74 20 73 6c 6f 74 20    /* First slot 
1830: 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 77 72  in %_segments wr
1840: 69 74 74 65 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  itten */.  sqlit
1850: 65 33 5f 69 6e 74 36 34 20 69 46 72 65 65 3b 20  e3_int64 iFree; 
1860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1870: 78 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20  xt free slot in 
1880: 25 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  %_segments */.  
1890: 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 72  /* Pointer to pr
18c0: 65 76 69 6f 75 73 20 74 65 72 6d 20 62 75 66 66  evious term buff
18d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  er */.  int nTer
18e0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
18f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1900: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 54  r of bytes in zT
1910: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  erm */.  int nMa
1920: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
1930: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1940: 20 6f 66 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66   of malloc'd buf
1950: 66 65 72 20 61 74 20 7a 4d 61 6c 6c 6f 63 20 2a  fer at zMalloc *
1960: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f  /.  char *zMallo
1970: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1980: 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
1990: 73 70 61 63 65 20 28 70 6f 73 73 69 62 6c 79 29  space (possibly)
19a0: 20 75 73 65 64 20 66 6f 72 20 7a 54 65 72 6d 20   used for zTerm 
19b0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  */.  int nSize; 
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
19e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 20 61 44  allocation at aD
19f0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ata */.  int nDa
1a00: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1a20: 73 20 6f 66 20 64 61 74 61 20 69 6e 20 61 44 61  s of data in aDa
1a30: 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ta */.  char *aD
1a40: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1a50: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1a60: 65 72 20 74 6f 20 62 6c 6f 63 6b 20 66 72 6f 6d  er to block from
1a70: 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a   malloc() */.};.
1a80: 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53 65 67 6d  ./*.** Type Segm
1a90: 65 6e 74 4e 6f 64 65 20 69 73 20 75 73 65 64 20  entNode is used 
1aa0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
1ab0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
1ac0: 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 74 68   to create.** th
1ad0: 65 20 69 6e 74 65 72 69 6f 72 20 70 61 72 74 20  e interior part 
1ae0: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  of the segment b
1af0: 2b 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  +-tree structure
1b00: 73 20 28 65 76 65 72 79 74 68 69 6e 67 20 65 78  s (everything ex
1b10: 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c 65 61 66  cept.** the leaf
1b20: 20 6e 6f 64 65 73 29 2e 20 54 68 65 73 65 20 66   nodes). These f
1b30: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74 79 70  unctions and typ
1b40: 65 20 61 72 65 20 6f 6e 6c 79 20 65 76 65 72 20  e are only ever 
1b50: 75 73 65 64 20 62 79 20 63 6f 64 65 0a 2a 2a 20  used by code.** 
1b60: 77 69 74 68 69 6e 20 74 68 65 20 66 74 73 33 53  within the fts3S
1b70: 65 67 57 72 69 74 65 72 58 58 58 28 29 20 66 61  egWriterXXX() fa
1b80: 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mily of function
1b90: 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1ba0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 4e  e..**.**   fts3N
1bb0: 6f 64 65 41 64 64 54 65 72 6d 28 29 0a 2a 2a 20  odeAddTerm().** 
1bc0: 20 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28    fts3NodeWrite(
1bd0: 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65 46  ).**   fts3NodeF
1be0: 72 65 65 28 29 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ree().**.** When
1bf0: 20 61 20 62 2b 74 72 65 65 20 69 73 20 77 72 69   a b+tree is wri
1c00: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
1c10: 62 61 73 65 20 28 65 69 74 68 65 72 20 61 73 20  base (either as 
1c20: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 6d 65  a result of a me
1c30: 72 67 65 0a 2a 2a 20 6f 72 20 74 68 65 20 70 65  rge.** or the pe
1c40: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c  nding-terms tabl
1c50: 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64 29  e being flushed)
1c60: 2c 20 6c 65 61 76 65 73 20 61 72 65 20 77 72 69  , leaves are wri
1c70: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
1c80: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c90: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 79 20  as soon as they 
1ca0: 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 70  are completely p
1cb0: 6f 70 75 6c 61 74 65 64 2e 20 54 68 65 20 69 6e  opulated. The in
1cc0: 74 65 72 69 6f 72 20 6f 66 0a 2a 2a 20 74 68 65  terior of.** the
1cd0: 20 74 72 65 65 20 69 73 20 61 73 73 65 6d 62 6c   tree is assembl
1ce0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64  ed in memory and
1cf0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 6f 6e 6c   written out onl
1d00: 79 20 6f 6e 63 65 20 61 6c 6c 20 6c 65 61 76 65  y once all leave
1d10: 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 70  s have.** been p
1d20: 6f 70 75 6c 61 74 65 64 20 61 6e 64 20 73 74 6f  opulated and sto
1d30: 72 65 64 2e 20 54 68 69 73 20 69 73 20 4f 6b 2c  red. This is Ok,
1d40: 20 61 73 20 74 68 65 20 62 2b 2d 74 72 65 65 20   as the b+-tree 
1d50: 66 61 6e 6f 75 74 20 69 73 20 75 73 75 61 6c 6c  fanout is usuall
1d60: 79 0a 2a 2a 20 76 65 72 79 20 6c 61 72 67 65 2c  y.** very large,
1d70: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
1d80: 65 20 69 6e 74 65 72 69 6f 72 20 6f 66 20 74 68  e interior of th
1d90: 65 20 74 72 65 65 20 63 6f 6e 73 75 6d 65 73 20  e tree consumes 
1da0: 72 65 6c 61 74 69 76 65 6c 79 20 0a 2a 2a 20 6c  relatively .** l
1db0: 69 74 74 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  ittle memory..*/
1dc0: 0a 73 74 72 75 63 74 20 53 65 67 6d 65 6e 74 4e  .struct SegmentN
1dd0: 6f 64 65 20 7b 0a 20 20 53 65 67 6d 65 6e 74 4e  ode {.  SegmentN
1de0: 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  ode *pParent;   
1df0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
1e00: 74 20 6e 6f 64 65 20 28 6f 72 20 4e 55 4c 4c 20  t node (or NULL 
1e10: 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 29 20 2a  for root node) *
1e20: 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  /.  SegmentNode 
1e30: 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
1e40: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e50: 6f 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  o right-sibling 
1e60: 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  */.  SegmentNode
1e70: 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20   *pLeftmost;    
1e80: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1e90: 74 6f 20 6c 65 66 74 2d 6d 6f 73 74 20 6e 6f 64  to left-most nod
1ea0: 65 20 6f 66 20 74 68 69 73 20 64 65 70 74 68 20  e of this depth 
1eb0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  */.  int nEntry;
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ee0: 66 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20  f terms written 
1ef0: 74 6f 20 6e 6f 64 65 20 73 6f 20 66 61 72 20 2a  to node so far *
1f00: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b  /.  char *zTerm;
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1f30: 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  o previous term 
1f40: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
1f50: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f70: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1f80: 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  n zTerm */.  int
1f90: 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20   nMalloc;       
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fb0: 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63 27 64  Size of malloc'd
1fc0: 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61 6c 6c   buffer at zMall
1fd0: 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  oc */.  char *zM
1fe0: 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  alloc;          
1ff0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f          /* Mallo
2000: 63 27 64 20 73 70 61 63 65 20 28 70 6f 73 73 69  c'd space (possi
2010: 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20 7a 54  bly) used for zT
2020: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  erm */.  int nDa
2030: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2040: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2050: 73 20 6f 66 20 76 61 6c 69 64 20 64 61 74 61 20  s of valid data 
2060: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72  so far */.  char
2070: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
2080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2090: 6f 64 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a  ode data */.};..
20a0: 2f 2a 0a 2a 2a 20 56 61 6c 69 64 20 76 61 6c 75  /*.** Valid valu
20b0: 65 73 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  es for the secon
20c0: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66 74  d argument to ft
20d0: 73 33 53 71 6c 53 74 6d 74 28 29 2e 0a 2a 2f 0a  s3SqlStmt()..*/.
20e0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45  #define SQL_DELE
20f0: 54 45 5f 43 4f 4e 54 45 4e 54 20 20 20 20 20 20  TE_CONTENT      
2100: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
2110: 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59 20 20 20   SQL_IS_EMPTY   
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45  1.#define SQL_DE
2140: 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54  LETE_ALL_CONTENT
2150: 20 20 20 20 20 20 20 20 20 32 20 0a 23 64 65 66           2 .#def
2160: 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41  ine SQL_DELETE_A
2170: 4c 4c 5f 53 45 47 4d 45 4e 54 53 20 20 20 20 20  LL_SEGMENTS     
2180: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 53 51 4c     3.#define SQL
2190: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 44  _DELETE_ALL_SEGD
21a0: 49 52 20 20 20 20 20 20 20 20 20 20 34 0a 23 64  IR          4.#d
21b0: 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45  efine SQL_DELETE
21c0: 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 20 20 20 20  _ALL_DOCSIZE    
21d0: 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 53       5.#define S
21e0: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 54  QL_DELETE_ALL_ST
21f0: 41 54 20 20 20 20 20 20 20 20 20 20 20 20 36 0a  AT            6.
2200: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
2210: 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f  CT_CONTENT_BY_RO
2220: 57 49 44 20 20 20 20 37 0a 23 64 65 66 69 6e 65  WID    7.#define
2230: 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e   SQL_NEXT_SEGMEN
2240: 54 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  T_INDEX         
2250: 38 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 49 4e  8.#define SQL_IN
2260: 53 45 52 54 5f 53 45 47 4d 45 4e 54 53 20 20 20  SERT_SEGMENTS   
2270: 20 20 20 20 20 20 20 20 20 39 0a 23 64 65 66 69           9.#defi
2280: 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d  ne SQL_NEXT_SEGM
2290: 45 4e 54 53 5f 49 44 20 20 20 20 20 20 20 20 20  ENTS_ID         
22a0: 20 31 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   10.#define SQL_
22b0: 49 4e 53 45 52 54 5f 53 45 47 44 49 52 20 20 20  INSERT_SEGDIR   
22c0: 20 20 20 20 20 20 20 20 20 20 31 31 0a 23 64 65            11.#de
22d0: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f  fine SQL_SELECT_
22e0: 4c 45 56 45 4c 20 20 20 20 20 20 20 20 20 20 20  LEVEL           
22f0: 20 20 20 31 32 0a 23 64 65 66 69 6e 65 20 53 51     12.#define SQ
2300: 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52  L_SELECT_LEVEL_R
2310: 41 4e 47 45 20 20 20 20 20 20 20 20 31 33 0a 23  ANGE        13.#
2320: 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43  define SQL_SELEC
2330: 54 5f 4c 45 56 45 4c 5f 43 4f 55 4e 54 20 20 20  T_LEVEL_COUNT   
2340: 20 20 20 20 20 31 34 0a 23 64 65 66 69 6e 65 20       14.#define 
2350: 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49  SQL_SELECT_SEGDI
2360: 52 5f 4d 41 58 5f 4c 45 56 45 4c 20 20 20 31 35  R_MAX_LEVEL   15
2370: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c  .#define SQL_DEL
2380: 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c  ETE_SEGDIR_LEVEL
2390: 20 20 20 20 20 20 20 31 36 0a 23 64 65 66 69 6e         16.#defin
23a0: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47  e SQL_DELETE_SEG
23b0: 4d 45 4e 54 53 5f 52 41 4e 47 45 20 20 20 20 20  MENTS_RANGE     
23c0: 31 37 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 43  17.#define SQL_C
23d0: 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 20 20  ONTENT_INSERT   
23e0: 20 20 20 20 20 20 20 20 20 31 38 0a 23 64 65 66           18.#def
23f0: 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 44  ine SQL_DELETE_D
2400: 4f 43 53 49 5a 45 20 20 20 20 20 20 20 20 20 20  OCSIZE          
2410: 20 20 31 39 0a 23 64 65 66 69 6e 65 20 53 51 4c    19.#define SQL
2420: 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45  _REPLACE_DOCSIZE
2430: 20 20 20 20 20 20 20 20 20 20 20 32 30 0a 23 64             20.#d
2440: 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54  efine SQL_SELECT
2450: 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20 20  _DOCSIZE        
2460: 20 20 20 20 32 31 0a 23 64 65 66 69 6e 65 20 53      21.#define S
2470: 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 54 4f 54  QL_SELECT_DOCTOT
2480: 41 4c 20 20 20 20 20 20 20 20 20 20 20 32 32 0a  AL           22.
2490: 23 64 65 66 69 6e 65 20 53 51 4c 5f 52 45 50 4c  #define SQL_REPL
24a0: 41 43 45 5f 44 4f 43 54 4f 54 41 4c 20 20 20 20  ACE_DOCTOTAL    
24b0: 20 20 20 20 20 20 32 33 0a 0a 23 64 65 66 69 6e        23..#defin
24c0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c  e SQL_SELECT_ALL
24d0: 5f 50 52 45 46 49 58 5f 4c 45 56 45 4c 20 20 20  _PREFIX_LEVEL   
24e0: 32 34 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  24.#define SQL_D
24f0: 45 4c 45 54 45 5f 41 4c 4c 5f 54 45 52 4d 53 5f  ELETE_ALL_TERMS_
2500: 53 45 47 44 49 52 20 20 20 32 35 0a 0a 23 64 65  SEGDIR   25..#de
2510: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2520: 53 45 47 44 49 52 5f 52 41 4e 47 45 20 20 20 20  SEGDIR_RANGE    
2530: 20 20 20 32 36 0a 0a 23 64 65 66 69 6e 65 20 53     26..#define S
2540: 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41  QL_SELECT_ALL_LA
2550: 4e 47 49 44 20 20 20 20 20 20 20 20 20 32 37 0a  NGID         27.
2560: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2570: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2580: 6f 62 74 61 69 6e 20 61 6e 20 53 51 4c 69 74 65  obtain an SQLite
2590: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
25a0: 65 6e 74 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f  ent handle.** fo
25b0: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
25c0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
25d0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
25e0: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
25f0: 2c 0a 2a 2a 20 2a 70 70 20 69 73 20 73 65 74 20  ,.** *pp is set 
2600: 74 6f 20 74 68 65 20 72 65 71 75 65 73 74 65 64  to the requested
2610: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
2620: 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
2630: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
2640: 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
2650: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
2660: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2670: 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
2680: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
2690: 61 70 56 61 6c 20 69 73 20 6e 6f 74 20 4e 55 4c  apVal is not NUL
26a0: 4c 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  L, then it must 
26b0: 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61  point to an arra
26c0: 79 20 77 69 74 68 0a 2a 2a 20 61 74 20 6c 65 61  y with.** at lea
26d0: 73 74 20 61 73 20 6d 61 6e 79 20 65 6e 74 72 69  st as many entri
26e0: 65 73 20 61 73 20 74 68 65 20 72 65 71 75 65 73  es as the reques
26f0: 74 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61  ted statement ha
2700: 73 20 62 6f 75 6e 64 20 0a 2a 2a 20 70 61 72 61  s bound .** para
2710: 6d 65 74 65 72 73 2e 20 54 68 65 20 76 61 6c 75  meters. The valu
2720: 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20  es are bound to 
2730: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73 20 70  the statements p
2740: 61 72 61 6d 65 74 65 72 73 20 62 65 66 6f 72 65  arameters before
2750: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  .** returning..*
2760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2770: 33 53 71 6c 53 74 6d 74 28 0a 20 20 46 74 73 33  3SqlStmt(.  Fts3
2780: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
2790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
27a0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
27b0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74  dle */.  int eSt
27c0: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
27e0: 6f 66 20 74 68 65 20 53 51 4c 5f 58 58 58 20 63  of the SQL_XXX c
27f0: 6f 6e 73 74 61 6e 74 73 20 61 62 6f 76 65 20 2a  onstants above *
2800: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2810: 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20   **pp,          
2820: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74      /* OUT: Stat
2830: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
2840: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2850: 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
2860: 20 20 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20 62    /* Values to b
2870: 69 6e 64 20 74 6f 20 73 74 61 74 65 6d 65 6e 74  ind to statement
2880: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
2890: 68 61 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b  har *azSql[] = {
28a0: 0a 2f 2a 20 30 20 20 2a 2f 20 20 22 44 45 4c 45  ./* 0  */  "DELE
28b0: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63  TE FROM %Q.'%q_c
28c0: 6f 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f  ontent' WHERE ro
28d0: 77 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20  wid = ?",./* 1  
28e0: 2a 2f 20 20 22 53 45 4c 45 43 54 20 4e 4f 54 20  */  "SELECT NOT 
28f0: 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 64 6f  EXISTS(SELECT do
2900: 63 69 64 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  cid FROM %Q.'%q_
2910: 63 6f 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72  content' WHERE r
2920: 6f 77 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20  owid!=?)",./* 2 
2930: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
2940: 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74  M %Q.'%q_content
2950: 27 22 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20 22 44  '",./* 3  */  "D
2960: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
2970: 71 5f 73 65 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a  q_segments'",./*
2980: 20 34 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20   4  */  "DELETE 
2990: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
29a0: 69 72 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20  ir'",./* 5  */  
29b0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
29c0: 27 25 71 5f 64 6f 63 73 69 7a 65 27 22 2c 0a 2f  '%q_docsize'",./
29d0: 2a 20 36 20 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 6  */  "DELETE
29e0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74 61   FROM %Q.'%q_sta
29f0: 74 27 22 2c 0a 2f 2a 20 37 20 20 2a 2f 20 20 22  t'",./* 7  */  "
2a00: 53 45 4c 45 43 54 20 25 73 20 57 48 45 52 45 20  SELECT %s WHERE 
2a10: 72 6f 77 69 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20  rowid=?",./* 8  
2a20: 2a 2f 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c  */  "SELECT (SEL
2a30: 45 43 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f  ECT max(idx) FRO
2a40: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
2a50: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
2a60: 29 20 2b 20 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f  ) + 1",./* 9  */
2a70: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
2a80: 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 28  Q.'%q_segments'(
2a90: 62 6c 6f 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20  blockid, block) 
2aa0: 56 41 4c 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f  VALUES(?, ?)",./
2ab0: 2a 20 31 30 20 2a 2f 20 20 22 53 45 4c 45 43 54  * 10 */  "SELECT
2ac0: 20 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43   coalesce((SELEC
2ad0: 54 20 6d 61 78 28 62 6c 6f 63 6b 69 64 29 20 46  T max(blockid) F
2ae0: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65  ROM %Q.'%q_segme
2af0: 6e 74 73 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a  nts') + 1, 1)",.
2b00: 2f 2a 20 31 31 20 2a 2f 20 20 22 49 4e 53 45 52  /* 11 */  "INSER
2b10: 54 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65  T INTO %Q.'%q_se
2b20: 67 64 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f  gdir' VALUES(?,?
2b30: 2c 3f 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20  ,?,?,?,?)",..   
2b40: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2b50: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64   segments in ord
2b60: 65 72 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  er from oldest t
2b70: 6f 20 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20  o newest.*/ ./* 
2b80: 31 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69  12 */  "SELECT i
2b90: 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c  dx, start_block,
2ba0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
2bb0: 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f  k, end_block, ro
2bc0: 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ot ".           
2bd0: 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65   "FROM %Q.'%q_se
2be0: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
2bf0: 6c 20 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69  l = ? ORDER BY i
2c00: 64 78 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a  dx ASC",./* 13 *
2c10: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
2c20: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
2c30: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
2c40: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
2c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
2c60: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
2c70: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  ' WHERE level BE
2c80: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22 0a 20  TWEEN ? AND ?". 
2c90: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
2ca0: 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43 2c  R BY level DESC,
2cb0: 20 69 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31   idx ASC",../* 1
2cc0: 34 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f  4 */  "SELECT co
2cd0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27  unt(*) FROM %Q.'
2ce0: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
2cf0: 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20   level = ?",./* 
2d00: 31 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d  15 */  "SELECT m
2d10: 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25  ax(level) FROM %
2d20: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
2d30: 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45  ERE level BETWEE
2d40: 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20  N ? AND ?",../* 
2d50: 31 36 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  16 */  "DELETE F
2d60: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
2d70: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  r' WHERE level =
2d80: 20 3f 22 2c 0a 2f 2a 20 31 37 20 2a 2f 20 20 22   ?",./* 17 */  "
2d90: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
2da0: 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45  %q_segments' WHE
2db0: 52 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45  RE blockid BETWE
2dc0: 45 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20  EN ? AND ?",./* 
2dd0: 31 38 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49  18 */  "INSERT I
2de0: 4e 54 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  NTO %Q.'%q_conte
2df0: 6e 74 27 20 56 41 4c 55 45 53 28 25 73 29 22 2c  nt' VALUES(%s)",
2e00: 0a 2f 2a 20 31 39 20 2a 2f 20 20 22 44 45 4c 45  ./* 19 */  "DELE
2e10: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64  TE FROM %Q.'%q_d
2e20: 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f  ocsize' WHERE do
2e30: 63 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20  cid = ?",./* 20 
2e40: 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54  */  "REPLACE INT
2e50: 4f 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  O %Q.'%q_docsize
2e60: 27 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a  ' VALUES(?,?)",.
2e70: 2f 2a 20 32 31 20 2a 2f 20 20 22 53 45 4c 45 43  /* 21 */  "SELEC
2e80: 54 20 73 69 7a 65 20 46 52 4f 4d 20 25 51 2e 27  T size FROM %Q.'
2e90: 25 71 5f 64 6f 63 73 69 7a 65 27 20 57 48 45 52  %q_docsize' WHER
2ea0: 45 20 64 6f 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32  E docid=?",./* 2
2eb0: 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 76 61  2 */  "SELECT va
2ec0: 6c 75 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  lue FROM %Q.'%q_
2ed0: 73 74 61 74 27 20 57 48 45 52 45 20 69 64 3d 30  stat' WHERE id=0
2ee0: 22 2c 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 52 45  ",./* 23 */  "RE
2ef0: 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25  PLACE INTO %Q.'%
2f00: 71 5f 73 74 61 74 27 20 56 41 4c 55 45 53 28 30  q_stat' VALUES(0
2f10: 2c 3f 29 22 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20  ,?)",./* 24 */  
2f20: 22 22 2c 0a 2f 2a 20 32 35 20 2a 2f 20 20 22 22  "",./* 25 */  ""
2f30: 2c 0a 0a 2f 2a 20 32 36 20 2a 2f 20 22 44 45 4c  ,../* 26 */ "DEL
2f40: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
2f50: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
2f60: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
2f70: 44 20 3f 22 2c 0a 2f 2a 20 32 37 20 2a 2f 20 22  D ?",./* 27 */ "
2f80: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2f90: 6c 65 76 65 6c 20 2f 20 28 31 30 32 34 20 2a 20  level / (1024 * 
2fa0: 3f 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  ?) FROM %Q.'%q_s
2fb0: 65 67 64 69 72 27 22 2c 0a 0a 20 20 7d 3b 0a 20  egdir'",..  };. 
2fc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2fd0: 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  _OK;.  sqlite3_s
2fe0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 61  tmt *pStmt;..  a
2ff0: 73 73 65 72 74 28 20 53 69 7a 65 6f 66 41 72 72  ssert( SizeofArr
3000: 61 79 28 61 7a 53 71 6c 29 3d 3d 53 69 7a 65 6f  ay(azSql)==Sizeo
3010: 66 41 72 72 61 79 28 70 2d 3e 61 53 74 6d 74 29  fArray(p->aStmt)
3020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 53   );.  assert( eS
3030: 74 6d 74 3c 53 69 7a 65 6f 66 41 72 72 61 79 28  tmt<SizeofArray(
3040: 61 7a 53 71 6c 29 20 26 26 20 65 53 74 6d 74 3e  azSql) && eStmt>
3050: 3d 30 20 29 3b 0a 20 20 0a 20 20 70 53 74 6d 74  =0 );.  .  pStmt
3060: 20 3d 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d   = p->aStmt[eStm
3070: 74 5d 3b 0a 20 20 69 66 28 20 21 70 53 74 6d 74  t];.  if( !pStmt
3080: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   ){.    char *zS
3090: 71 6c 3b 0a 20 20 20 20 69 66 28 20 65 53 74 6d  ql;.    if( eStm
30a0: 74 3d 3d 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49  t==SQL_CONTENT_I
30b0: 4e 53 45 52 54 20 29 7b 0a 20 20 20 20 20 20 7a  NSERT ){.      z
30c0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
30d0: 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d  rintf(azSql[eStm
30e0: 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  t], p->zDb, p->z
30f0: 4e 61 6d 65 2c 20 70 2d 3e 7a 57 72 69 74 65 45  Name, p->zWriteE
3100: 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65  xprlist);.    }e
3110: 6c 73 65 20 69 66 28 20 65 53 74 6d 74 3d 3d 53  lse if( eStmt==S
3120: 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e  QL_SELECT_CONTEN
3130: 54 5f 42 59 5f 52 4f 57 49 44 20 29 7b 0a 20 20  T_BY_ROWID ){.  
3140: 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
3150: 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c  e3_mprintf(azSql
3160: 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 52 65 61  [eStmt], p->zRea
3170: 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20  dExprlist);.    
3180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71  }else{.      zSq
3190: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
31a0: 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d  ntf(azSql[eStmt]
31b0: 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61  , p->zDb, p->zNa
31c0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  me);.    }.    i
31d0: 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  f( !zSql ){.    
31e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
31f0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
3200: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
3210: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
3220: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
3230: 70 53 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20  pStmt, NULL);.  
3240: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3250: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 61 73  (zSql);.      as
3260: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
3270: 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 20  _OK || pStmt==0 
3280: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 53 74 6d  );.      p->aStm
3290: 74 5b 65 53 74 6d 74 5d 20 3d 20 70 53 74 6d 74  t[eStmt] = pStmt
32a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
32b0: 28 20 61 70 56 61 6c 20 29 7b 0a 20 20 20 20 69  ( apVal ){.    i
32c0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 50  nt i;.    int nP
32d0: 61 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 62  aram = sqlite3_b
32e0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
32f0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
3300: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
3310: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 50 61 72  ITE_OK && i<nPar
3320: 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  am; i++){.      
3330: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
3340: 64 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69  d_value(pStmt, i
3350: 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b 0a 20  +1, apVal[i]);. 
3360: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 20 3d     }.  }.  *pp =
3370: 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e   pStmt;.  return
3380: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
3390: 6e 74 20 66 74 73 33 53 65 6c 65 63 74 44 6f 63  nt fts3SelectDoc
33a0: 73 69 7a 65 28 0a 20 20 46 74 73 33 54 61 62 6c  size(.  Fts3Tabl
33b0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
33d0: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
33e0: 20 20 69 6e 74 20 65 53 74 6d 74 2c 20 20 20 20    int eStmt,    
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 2f 2a 20 45 69 74 68 65 72 20 53 51 4c 5f    /* Either SQL_
3410: 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 20 6f  SELECT_DOCSIZE o
3420: 72 20 44 4f 43 54 4f 54 41 4c 20 2a 2f 0a 20 20  r DOCTOTAL */.  
3430: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
3440: 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ocid,           
3450: 2f 2a 20 44 6f 63 69 64 20 74 6f 20 62 69 6e 64  /* Docid to bind
3460: 20 66 6f 72 20 53 51 4c 5f 53 45 4c 45 43 54 5f   for SQL_SELECT_
3470: 44 4f 43 53 49 5a 45 20 2a 2f 0a 20 20 73 71 6c  DOCSIZE */.  sql
3480: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
3490: 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
34a0: 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68  OUT: Statement h
34b0: 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  andle */.){.  sq
34c0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
34d0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
34e0: 20 53 74 61 74 65 6d 65 6e 74 20 72 65 71 75 65   Statement reque
34f0: 73 74 65 64 20 66 72 6f 6d 20 66 74 73 33 53 71  sted from fts3Sq
3500: 6c 53 74 6d 74 28 29 20 2a 2f 0a 20 20 69 6e 74  lStmt() */.  int
3510: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3530: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
3540: 20 20 61 73 73 65 72 74 28 20 65 53 74 6d 74 3d    assert( eStmt=
3550: 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53  =SQL_SELECT_DOCS
3560: 49 5a 45 20 7c 7c 20 65 53 74 6d 74 3d 3d 53 51  IZE || eStmt==SQ
3570: 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 54 4f 54 41  L_SELECT_DOCTOTA
3580: 4c 20 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73  L );..  rc = fts
3590: 33 53 71 6c 53 74 6d 74 28 70 54 61 62 2c 20 65  3SqlStmt(pTab, e
35a0: 53 74 6d 74 2c 20 26 70 53 74 6d 74 2c 20 30 29  Stmt, &pStmt, 0)
35b0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
35c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
35d0: 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45   eStmt==SQL_SELE
35e0: 43 54 5f 44 4f 43 53 49 5a 45 20 29 7b 0a 20 20  CT_DOCSIZE ){.  
35f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
3600: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
3610: 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a   iDocid);.    }.
3620: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3630: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
3640: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3650: 5f 52 4f 57 20 7c 7c 20 73 71 6c 69 74 65 33 5f  _ROW || sqlite3_
3660: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
3670: 74 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 42 4c  t, 0)!=SQLITE_BL
3680: 4f 42 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OB ){.      rc =
3690: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
36a0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
36b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36c0: 20 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55 50   rc = FTS_CORRUP
36d0: 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 70 53  T_VTAB;.      pS
36e0: 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
36f0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
3700: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
3710: 20 20 7d 0a 0a 20 20 2a 70 70 53 74 6d 74 20 3d    }..  *ppStmt =
3720: 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e   pStmt;.  return
3730: 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   rc;.}..int sqli
3740: 74 65 33 46 74 73 33 53 65 6c 65 63 74 44 6f 63  te3Fts3SelectDoc
3750: 74 6f 74 61 6c 28 0a 20 20 46 74 73 33 54 61 62  total(.  Fts3Tab
3760: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
3770: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33           /* Fts3
3780: 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
3790: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
37a0: 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20  **ppStmt        
37b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65     /* OUT: State
37c0: 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29  ment handle */.)
37d0: 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53  {.  return fts3S
37e0: 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 70 54 61  electDocsize(pTa
37f0: 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f  b, SQL_SELECT_DO
3800: 43 54 4f 54 41 4c 2c 20 30 2c 20 70 70 53 74 6d  CTOTAL, 0, ppStm
3810: 74 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  t);.}..int sqlit
3820: 65 33 46 74 73 33 53 65 6c 65 63 74 44 6f 63 73  e3Fts3SelectDocs
3830: 69 7a 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ize(.  Fts3Table
3840: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
3850: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74         /* Fts3 t
3860: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
3870: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
3880: 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20  Docid,          
3890: 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20 72 65 61   /* Docid to rea
38a0: 64 20 73 69 7a 65 20 64 61 74 61 20 66 6f 72 20  d size data for 
38b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
38c0: 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20  t **ppStmt      
38d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61       /* OUT: Sta
38e0: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f  tement handle */
38f0: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  .){.  return fts
3900: 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 70  3SelectDocsize(p
3910: 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  Tab, SQL_SELECT_
3920: 44 4f 43 53 49 5a 45 2c 20 69 44 6f 63 69 64 2c  DOCSIZE, iDocid,
3930: 20 70 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a   ppStmt);.}../*.
3940: 2a 2a 20 53 69 6d 69 6c 61 72 20 74 6f 20 66 74  ** Similar to ft
3950: 73 33 53 71 6c 53 74 6d 74 28 29 2e 20 45 78 63  s3SqlStmt(). Exc
3960: 65 70 74 2c 20 61 66 74 65 72 20 62 69 6e 64 69  ept, after bindi
3970: 6e 67 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  ng the parameter
3980: 73 20 69 6e 0a 2a 2a 20 61 72 72 61 79 20 61 70  s in.** array ap
3990: 56 61 6c 5b 5d 20 74 6f 20 74 68 65 20 53 51 4c  Val[] to the SQL
39a0: 20 73 74 61 74 65 6d 65 6e 74 20 69 64 65 6e 74   statement ident
39b0: 69 66 69 65 64 20 62 79 20 65 53 74 6d 74 2c 20  ified by eStmt, 
39c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
39d0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a   is executed..**
39e0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c 49  .** Returns SQLI
39f0: 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 73 74 61  TE_OK if the sta
3a00: 74 65 6d 65 6e 74 20 69 73 20 73 75 63 63 65 73  tement is succes
3a10: 73 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2c  sfully executed,
3a20: 20 6f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   or an.** SQLite
3a30: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
3a40: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
3a50: 20 76 6f 69 64 20 66 74 73 33 53 71 6c 45 78 65   void fts3SqlExe
3a60: 63 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20  c(.  int *pRC,  
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a80: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
3a90: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
3aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3ab0: 65 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a  e FTS3 table */.
3ac0: 20 20 69 6e 74 20 65 53 74 6d 74 2c 20 20 20 20    int eStmt,    
3ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
3ae0: 64 65 78 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  dex of statement
3af0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a   to evaluate */.
3b00: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3b10: 2a 2a 61 70 56 61 6c 20 20 20 20 2f 2a 20 50 61  **apVal    /* Pa
3b20: 72 61 6d 65 74 65 72 73 20 74 6f 20 62 69 6e 64  rameters to bind
3b30: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
3b40: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
3b50: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 2a 70  int rc;.  if( *p
3b60: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72  RC ) return;.  r
3b70: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
3b80: 70 2c 20 65 53 74 6d 74 2c 20 26 70 53 74 6d 74  p, eStmt, &pStmt
3b90: 2c 20 61 70 56 61 6c 29 3b 20 0a 20 20 69 66 28  , apVal); .  if(
3ba0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3bb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
3bc0: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  ep(pStmt);.    r
3bd0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
3be0: 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  t(pStmt);.  }.  
3bf0: 2a 70 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 0a 2f  *pRC = rc;.}.../
3c00: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3c10: 6f 6e 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  on ensures that 
3c20: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
3c30: 62 74 61 69 6e 65 64 20 61 20 73 68 61 72 65 64  btained a shared
3c40: 2d 63 61 63 68 65 0a 2a 2a 20 74 61 62 6c 65 2d  -cache.** table-
3c50: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25 5f 63 6f  lock on the %_co
3c60: 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69  ntent table. Thi
3c70: 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
3c80: 66 6f 72 65 20 72 65 61 64 69 6e 67 0a 2a 2a 20  fore reading.** 
3c90: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 74  data from the ft
3ca0: 73 33 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69  s3 table. If thi
3cb0: 73 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63  s lock is not ac
3cc0: 71 75 69 72 65 64 20 66 69 72 73 74 2c 20 74 68  quired first, th
3cd0: 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
3ce0: 20 6d 61 79 20 65 6e 64 20 75 70 20 68 6f 6c 64   may end up hold
3cf0: 69 6e 67 20 72 65 61 64 2d 6c 6f 63 6b 73 20 6f  ing read-locks o
3d00: 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  n the %_segments
3d10: 20 61 6e 64 20 25 5f 73 65 67 64 69 72 0a 2a 2a   and %_segdir.**
3d20: 20 74 61 62 6c 65 73 2c 20 62 75 74 20 6e 6f 20   tables, but no 
3d30: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
3d40: 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
3d50: 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
3d60: 73 20 0a 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63  s .** a second c
3d70: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62  onnection will b
3d80: 65 20 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20  e able to write 
3d90: 74 6f 20 74 68 65 20 66 74 73 33 20 74 61 62 6c  to the fts3 tabl
3da0: 65 2c 20 62 75 74 0a 2a 2a 20 61 74 74 65 6d 70  e, but.** attemp
3db0: 74 69 6e 67 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ting to commit t
3dc0: 68 6f 73 65 20 77 72 69 74 65 73 20 6d 69 67 68  hose writes migh
3dd0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
3de0: 4c 4f 43 4b 45 44 20 6f 72 0a 2a 2a 20 53 51 4c  LOCKED or.** SQL
3df0: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
3e00: 44 43 41 43 48 45 20 28 62 65 63 61 75 73 65 20  DCACHE (because 
3e10: 74 68 65 20 63 6f 6d 6d 69 74 20 61 74 74 65 6d  the commit attem
3e20: 70 74 73 20 74 6f 20 6f 62 74 61 69 6e 20 0a 2a  pts to obtain .*
3e30: 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 6f 6e  * write-locks on
3e40: 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
3e50: 61 6e 64 20 25 5f 73 65 67 64 69 72 20 2a 2a 20  and %_segdir ** 
3e60: 74 61 62 6c 65 73 29 2e 20 0a 2a 2a 0a 2a 2a 20  tables). .**.** 
3e70: 57 65 20 74 72 79 20 74 6f 20 61 76 6f 69 64 20  We try to avoid 
3e80: 74 68 69 73 20 62 65 63 61 75 73 65 20 69 66 20  this because if 
3e90: 46 54 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79  FTS3 returns any
3ea0: 20 65 72 72 6f 72 20 77 68 65 6e 20 63 6f 6d 6d   error when comm
3eb0: 69 74 74 69 6e 67 0a 2a 2a 20 61 20 74 72 61 6e  itting.** a tran
3ec0: 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f  saction, the who
3ed0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  le transaction w
3ee0: 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
3ef0: 63 6b 2e 20 41 6e 64 20 74 68 69 73 20 69 73 0a  ck. And this is.
3f00: 2a 2a 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72  ** not what user
3f10: 73 20 65 78 70 65 63 74 20 77 68 65 6e 20 74 68  s expect when th
3f20: 65 79 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f  ey get SQLITE_LO
3f30: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
3f40: 2e 20 49 74 20 63 61 6e 0a 2a 2a 20 73 74 69 6c  . It can.** stil
3f50: 6c 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  l happen if the 
3f60: 75 73 65 72 20 72 65 61 64 73 20 64 61 74 61 20  user reads data 
3f70: 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
3f80: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 6f 72 0a  e %_segments or.
3f90: 2a 2a 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  ** %_segdir tabl
3fa0: 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 67 6f  es instead of go
3fb0: 69 6e 67 20 74 68 72 6f 75 67 68 20 46 54 53 33  ing through FTS3
3fc0: 20 74 68 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 54   though..**.** T
3fd0: 68 69 73 20 72 65 61 73 6f 6e 69 6e 67 20 64 6f  his reasoning do
3fe0: 65 73 20 6e 6f 74 20 61 70 70 6c 79 20 74 6f 20  es not apply to 
3ff0: 61 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 74 61  a content=xxx ta
4000: 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
4010: 74 65 33 46 74 73 33 52 65 61 64 4c 6f 63 6b 28  te3Fts3ReadLock(
4020: 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20  Fts3Table *p){. 
4030: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
4060: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
4070: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
4080: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
4090: 74 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  t used to obtain
40a0: 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 69 66 28 20   lock */..  if( 
40b0: 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d  p->zContentTbl==
40c0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  0 ){.    rc = ft
40d0: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
40e0: 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f  _SELECT_CONTENT_
40f0: 42 59 5f 52 4f 57 49 44 2c 20 26 70 53 74 6d 74  BY_ROWID, &pStmt
4100: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
4110: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4120: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
4130: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 31 29  d_null(pStmt, 1)
4140: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4150: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
4160: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4170: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
4180: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
4190: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
41a0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
41b0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c  c;.}..static sql
41c0: 69 74 65 33 5f 69 6e 74 36 34 20 67 65 74 41 62  ite3_int64 getAb
41d0: 73 6f 6c 75 74 65 4c 65 76 65 6c 28 0a 20 20 46  soluteLevel(.  F
41e0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20  ts3Table *p, .  
41f0: 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 0a 20 20  int iLangid, .  
4200: 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a 20 20 69  int iIndex, .  i
4210: 6e 74 20 69 4c 65 76 65 6c 0a 29 7b 0a 20 20 61  nt iLevel.){.  a
4220: 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e 3d  ssert( iLangid>=
4230: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4240: 2d 3e 6e 49 6e 64 65 78 3e 30 20 29 3b 0a 20 20  ->nIndex>0 );.  
4250: 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e 3d  assert( iIndex>=
4260: 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e  0 && iIndex<p->n
4270: 49 6e 64 65 78 20 29 3b 0a 20 20 72 65 74 75 72  Index );.  retur
4280: 6e 20 28 69 4c 61 6e 67 69 64 20 2a 20 70 2d 3e  n (iLangid * p->
4290: 6e 49 6e 64 65 78 20 2b 20 69 49 6e 64 65 78 29  nIndex + iIndex)
42a0: 20 2a 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d   * FTS3_SEGDIR_M
42b0: 41 58 4c 45 56 45 4c 20 2b 20 69 4c 65 76 65 6c  AXLEVEL + iLevel
42c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
42d0: 2a 70 70 53 74 6d 74 20 74 6f 20 61 20 73 74 61  *ppStmt to a sta
42e0: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74 68  tement handle th
42f0: 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  at may be used t
4300: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
4310: 68 0a 2a 2a 20 61 6c 6c 20 72 6f 77 73 20 69 6e  h.** all rows in
4320: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
4330: 62 6c 65 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 74  ble, from oldest
4340: 20 74 6f 20 6e 65 77 65 73 74 2e 20 49 66 20 73   to newest. If s
4350: 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
4360: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
4370: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
4380: 72 73 20 77 68 69 6c 65 20 70 72 65 70 61 72 69  rs while prepari
4390: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
43a0: 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
43b0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
43c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  e..**.** There i
43d0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
43e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
43f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
4400: 6f 6d 70 69 6c 65 64 20 66 6f 72 0a 2a 2a 20 65  ompiled for.** e
4410: 61 63 68 20 46 54 53 33 20 74 61 62 6c 65 2e 0a  ach FTS3 table..
4420: 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 6d  **.** The statem
4430: 65 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65 20  ent returns the 
4440: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6c 75 6d 6e  following column
4450: 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67  s from the %_seg
4460: 64 69 72 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a  dir table:.**.**
4470: 20 20 20 30 3a 20 69 64 78 0a 2a 2a 20 20 20 31     0: idx.**   1
4480: 3a 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a 2a  : start_block.**
4490: 20 20 20 32 3a 20 6c 65 61 76 65 73 5f 65 6e 64     2: leaves_end
44a0: 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 33 3a 20 65  _block.**   3: e
44b0: 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 34 3a  nd_block.**   4:
44c0: 20 72 6f 6f 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c   root.*/.int sql
44d0: 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64 69  ite3Fts3AllSegdi
44e0: 72 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  rs(.  Fts3Table 
44f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
4500: 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
4510: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61  ble */.  int iLa
4520: 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ngid,           
4530: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67           /* Lang
4540: 75 61 67 65 20 62 65 69 6e 67 20 71 75 65 72 69  uage being queri
4550: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  ed */.  int iInd
4560: 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
4570: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
4580: 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 5b 5d   for p->aIndex[]
4590: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
45a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
45b0: 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74        /* Level t
45c0: 6f 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 73 71  o select */.  sq
45d0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
45e0: 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt           /*
45f0: 20 4f 55 54 3a 20 43 6f 6d 70 69 6c 65 64 20 73   OUT: Compiled s
4600: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
4610: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
4620: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
4630: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69   0;..  assert( i
4640: 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
4650: 55 52 53 4f 52 5f 41 4c 4c 20 7c 7c 20 69 4c 65  URSOR_ALL || iLe
4660: 76 65 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  vel>=0 );.  asse
4670: 72 74 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f  rt( iLevel<FTS3_
4680: 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20  SEGDIR_MAXLEVEL 
4690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e  );.  assert( iIn
46a0: 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78  dex>=0 && iIndex
46b0: 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20  <p->nIndex );.. 
46c0: 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
46d0: 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45 43 54 20  .    /* "SELECT 
46e0: 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20  * FROM %_segdir 
46f0: 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57  WHERE level BETW
4700: 45 45 4e 20 3f 20 41 4e 44 20 3f 20 4f 52 44 45  EEN ? AND ? ORDE
4710: 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20  R BY ..." */.   
4720: 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
4730: 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
4740: 4c 45 56 45 4c 5f 52 41 4e 47 45 2c 20 26 70 53  LEVEL_RANGE, &pS
4750: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
4760: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4770: 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  { .      sqlite3
4780: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
4790: 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74  t, 1, getAbsolut
47a0: 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
47b0: 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a  d, iIndex, 0));.
47c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
47d0: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 2c  nd_int(pStmt, 2,
47e0: 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 41   .          getA
47f0: 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20  bsoluteLevel(p, 
4800: 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
4810: 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58   FTS3_SEGDIR_MAX
4820: 4c 45 56 45 4c 2d 31 29 0a 20 20 20 20 20 20 29  LEVEL-1).      )
4830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
4840: 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45 43 54 20  .    /* "SELECT 
4850: 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20  * FROM %_segdir 
4860: 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20  WHERE level = ? 
4870: 4f 52 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f  ORDER BY ..." */
4880: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
4890: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
48a0: 45 43 54 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d  ECT_LEVEL, &pStm
48b0: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
48c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c==SQLITE_OK ){ 
48d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
48e0: 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  ind_int(pStmt, 1
48f0: 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  , getAbsoluteLev
4900: 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
4910: 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 29 3b  Index, iLevel));
4920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
4930: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
4940: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
4950: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 73 69  *.** Append a si
4960: 6e 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61  ngle varint to a
4970: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 62 75 66   PendingList buf
4980: 66 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  fer. SQLITE_OK i
4990: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66  s returned.** if
49a0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
49b0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
49c0: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
49d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
49e0: 69 6f 6e 20 61 6c 73 6f 20 73 65 72 76 65 73 20  ion also serves 
49f0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
4a00: 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75  PendingList stru
4a10: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  cture itself..**
4a20: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f   For example, to
4a30: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 65   create a new Pe
4a40: 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74  ndingList struct
4a50: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
4a60: 77 6f 0a 2a 2a 20 76 61 72 69 6e 74 73 3a 0a 2a  wo.** varints:.*
4a70: 2a 0a 2a 2a 20 20 20 50 65 6e 64 69 6e 67 4c 69  *.**   PendingLi
4a80: 73 74 20 2a 70 20 3d 20 30 3b 0a 2a 2a 20 20 20  st *p = 0;.**   
4a90: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
4aa0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20  ppendVarint(&p, 
4ab0: 31 29 3b 0a 2a 2a 20 20 20 66 74 73 33 50 65 6e  1);.**   fts3Pen
4ac0: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
4ad0: 72 69 6e 74 28 26 70 2c 20 32 29 3b 0a 2a 2f 0a  rint(&p, 2);.*/.
4ae0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
4af0: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
4b00: 56 61 72 69 6e 74 28 0a 20 20 50 65 6e 64 69 6e  Varint(.  Pendin
4b10: 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20  gList **pp,     
4b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
4b30: 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
4b40: 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75  PendingList stru
4b50: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
4b60: 69 6e 74 36 34 20 69 20 20 20 20 20 20 20 20 20  int64 i         
4b70: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
4b80: 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61   to append to da
4b90: 74 61 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69  ta */.){.  Pendi
4ba0: 6e 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b  ngList *p = *pp;
4bb0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
4bc0: 6f 72 20 67 72 6f 77 20 74 68 65 20 50 65 6e 64  or grow the Pend
4bd0: 69 6e 67 4c 69 73 74 20 61 73 20 72 65 71 75 69  ingList as requi
4be0: 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70  red. */.  if( !p
4bf0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   ){.    p = sqli
4c00: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
4c10: 66 28 2a 70 29 20 2b 20 31 30 30 29 3b 0a 20 20  f(*p) + 100);.  
4c20: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
4c30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4c40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
4c50: 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 31 30 30   p->nSpace = 100
4c60: 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d  ;.    p->aData =
4c70: 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a   (char *)&p[1];.
4c80: 20 20 20 20 70 2d 3e 6e 44 61 74 61 20 3d 20 30      p->nData = 0
4c90: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
4ca0: 20 70 2d 3e 6e 44 61 74 61 2b 46 54 53 33 5f 56   p->nData+FTS3_V
4cb0: 41 52 49 4e 54 5f 4d 41 58 2b 31 3e 70 2d 3e 6e  ARINT_MAX+1>p->n
4cc0: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74  Space ){.    int
4cd0: 20 6e 4e 65 77 20 3d 20 70 2d 3e 6e 53 70 61 63   nNew = p->nSpac
4ce0: 65 20 2a 20 32 3b 0a 20 20 20 20 70 20 3d 20 73  e * 2;.    p = s
4cf0: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
4d00: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 6e  , sizeof(*p) + n
4d10: 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21 70  New);.    if( !p
4d20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4d30: 33 5f 66 72 65 65 28 2a 70 70 29 3b 0a 20 20 20  3_free(*pp);.   
4d40: 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20     *pp = 0;.    
4d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4d60: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
4d70: 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65   p->nSpace = nNe
4d80: 77 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  w;.    p->aData 
4d90: 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b  = (char *)&p[1];
4da0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
4db0: 64 20 74 68 65 20 6e 65 77 20 73 65 72 69 61 6c  d the new serial
4dc0: 69 7a 65 64 20 76 61 72 69 6e 74 20 74 6f 20 74  ized varint to t
4dd0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
4de0: 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 6e 44 61 74  st. */.  p->nDat
4df0: 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
4e00: 50 75 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 44  PutVarint(&p->aD
4e10: 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 2c 20 69  ata[p->nData], i
4e20: 29 3b 0a 20 20 70 2d 3e 61 44 61 74 61 5b 70 2d  );.  p->aData[p-
4e30: 3e 6e 44 61 74 61 5d 20 3d 20 27 5c 30 27 3b 0a  >nData] = '\0';.
4e40: 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74    *pp = p;.  ret
4e50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4e60: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 64 6f  ../*.** Add a do
4e70: 63 69 64 2f 63 6f 6c 75 6d 6e 2f 70 6f 73 69 74  cid/column/posit
4e80: 69 6f 6e 20 65 6e 74 72 79 20 74 6f 20 61 20 50  ion entry to a P
4e90: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
4ea0: 74 75 72 65 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a  ture. Non-zero.*
4eb0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
4ec0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 69   the structure i
4ed0: 73 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  s sqlite3_reallo
4ee0: 63 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ced as part of a
4ef0: 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 74  dding.** the ent
4f00: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a  ry. Otherwise, z
4f10: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ero..**.** If an
4f20: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
4f30: 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  s, *pRc is set t
4f40: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62  o SQLITE_NOMEM b
4f50: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
4f60: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 61 6c 77 61  .** Zero is alwa
4f70: 79 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74  ys returned in t
4f80: 68 69 73 20 63 61 73 65 2e 20 4f 74 68 65 72 77  his case. Otherw
4f90: 69 73 65 2c 20 69 66 20 6e 6f 20 4f 4f 4d 20 65  ise, if no OOM e
4fa0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
4fb0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  it is set to SQL
4fc0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
4fd0: 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e  c int fts3Pendin
4fe0: 67 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  gListAppend(.  P
4ff0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c  endingList **pp,
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5010: 2a 20 49 4e 2f 4f 55 54 3a 20 50 65 6e 64 69 6e  * IN/OUT: Pendin
5020: 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20  gList structure 
5030: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
5040: 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20  64 iDocid,      
5050: 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f       /* Docid fo
5060: 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a  r entry to add *
5070: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
5080: 34 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  4 iCol,         
5090: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f      /* Column fo
50a0: 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a  r entry to add *
50b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
50c0: 34 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  4 iPos,         
50d0: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
50e0: 6f 66 20 74 65 72 6d 20 66 6f 72 20 65 6e 74 72  of term for entr
50f0: 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e  y to add */.  in
5100: 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20  t *pRc          
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5120: 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64   OUT: Return cod
5130: 65 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e  e */.){.  Pendin
5140: 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a  gList *p = *pp;.
5150: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
5160: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
5170: 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74 44   !p || p->iLastD
5180: 6f 63 69 64 3c 3d 69 44 6f 63 69 64 20 29 3b 0a  ocid<=iDocid );.
5190: 0a 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e  .  if( !p || p->
51a0: 69 4c 61 73 74 44 6f 63 69 64 21 3d 69 44 6f 63  iLastDocid!=iDoc
51b0: 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  id ){.    sqlite
51c0: 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 20 3d  3_int64 iDelta =
51d0: 20 69 44 6f 63 69 64 20 2d 20 28 70 20 3f 20 70   iDocid - (p ? p
51e0: 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3a 20 30  ->iLastDocid : 0
51f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
5200: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
5210: 3e 6e 44 61 74 61 3c 70 2d 3e 6e 53 70 61 63 65  >nData<p->nSpace
5220: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5230: 28 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44  ( p->aData[p->nD
5240: 61 74 61 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ata]==0 );.     
5250: 20 70 2d 3e 6e 44 61 74 61 2b 2b 3b 0a 20 20 20   p->nData++;.   
5260: 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
5270: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33  E_OK!=(rc = fts3
5280: 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
5290: 64 56 61 72 69 6e 74 28 26 70 2c 20 69 44 65 6c  dVarint(&p, iDel
52a0: 74 61 29 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ta)) ){.      go
52b0: 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 70  to pendinglistap
52c0: 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  pend_out;.    }.
52d0: 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20      p->iLastCol 
52e0: 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 69 4c 61  = -1;.    p->iLa
52f0: 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 70  stPos = 0;.    p
5300: 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3d 20 69  ->iLastDocid = i
5310: 44 6f 63 69 64 3b 0a 20 20 7d 0a 20 20 69 66 28  Docid;.  }.  if(
5320: 20 69 43 6f 6c 3e 30 20 26 26 20 70 2d 3e 69 4c   iCol>0 && p->iL
5330: 61 73 74 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a  astCol!=iCol ){.
5340: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
5350: 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e  K!=(rc = fts3Pen
5360: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
5370: 72 69 6e 74 28 26 70 2c 20 31 29 29 0a 20 20 20  rint(&p, 1)).   
5380: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
5390: 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e  (rc = fts3Pendin
53a0: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
53b0: 74 28 26 70 2c 20 69 43 6f 6c 29 29 0a 20 20 20  t(&p, iCol)).   
53c0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
53d0: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64  endinglistappend
53e0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
53f0: 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 69 43  p->iLastCol = iC
5400: 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74  ol;.    p->iLast
5410: 50 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  Pos = 0;.  }.  i
5420: 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
5430: 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 3e 70    assert( iPos>p
5440: 2d 3e 69 4c 61 73 74 50 6f 73 20 7c 7c 20 28 69  ->iLastPos || (i
5450: 50 6f 73 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 61  Pos==0 && p->iLa
5460: 73 74 50 6f 73 3d 3d 30 29 20 29 3b 0a 20 20 20  stPos==0) );.   
5470: 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
5480: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
5490: 74 28 26 70 2c 20 32 2b 69 50 6f 73 2d 70 2d 3e  t(&p, 2+iPos-p->
54a0: 69 4c 61 73 74 50 6f 73 29 3b 0a 20 20 20 20 69  iLastPos);.    i
54b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
54c0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 61   ){.      p->iLa
54d0: 73 74 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20  stPos = iPos;.  
54e0: 20 20 7d 0a 20 20 7d 0a 0a 20 70 65 6e 64 69 6e    }.  }.. pendin
54f0: 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3a  glistappend_out:
5500: 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20  .  *pRc = rc;.  
5510: 69 66 28 20 70 21 3d 2a 70 70 20 29 7b 0a 20 20  if( p!=*pp ){.  
5520: 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 20 20 72    *pp = p;.    r
5530: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
5540: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5550: 2a 20 46 72 65 65 20 61 20 50 65 6e 64 69 6e 67  * Free a Pending
5560: 4c 69 73 74 20 6f 62 6a 65 63 74 20 61 6c 6c 6f  List object allo
5570: 63 61 74 65 64 20 62 79 20 66 74 73 33 50 65 6e  cated by fts3Pen
5580: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 29  dingListAppend()
5590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
55a0: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
55b0: 44 65 6c 65 74 65 28 50 65 6e 64 69 6e 67 4c 69  Delete(PendingLi
55c0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71  st *pList){.  sq
55d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74  lite3_free(pList
55e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
55f0: 61 6e 20 65 6e 74 72 79 20 74 6f 20 6f 6e 65 20  an entry to one 
5600: 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  of the pending-t
5610: 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73  erms hash tables
5620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5630: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
5640: 41 64 64 4f 6e 65 28 0a 20 20 46 74 73 33 54 61  AddOne(.  Fts3Ta
5650: 62 6c 65 20 2a 70 2c 0a 20 20 69 6e 74 20 69 43  ble *p,.  int iC
5660: 6f 6c 2c 0a 20 20 69 6e 74 20 69 50 6f 73 2c 0a  ol,.  int iPos,.
5670: 20 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73    Fts3Hash *pHas
5680: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
5690: 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20 74 65 72    /* Pending ter
56a0: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  ms hash table to
56b0: 20 61 64 64 20 65 6e 74 72 79 20 74 6f 20 2a 2f   add entry to */
56c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
56d0: 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 6e 54 6f  Token,.  int nTo
56e0: 6b 65 6e 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67  ken.){.  Pending
56f0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69  List *pList;.  i
5700: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5710: 4b 3b 0a 0a 20 20 70 4c 69 73 74 20 3d 20 28 50  K;..  pList = (P
5720: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73  endingList *)fts
5730: 33 48 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c  3HashFind(pHash,
5740: 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29   zToken, nToken)
5750: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
5760: 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
5770: 44 61 74 61 20 2d 3d 20 28 70 4c 69 73 74 2d 3e  Data -= (pList->
5780: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b  nData + nToken +
5790: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
57a0: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  Elem));.  }.  if
57b0: 28 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73  ( fts3PendingLis
57c0: 74 41 70 70 65 6e 64 28 26 70 4c 69 73 74 2c 20  tAppend(&pList, 
57d0: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 69  p->iPrevDocid, i
57e0: 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 72 63 29 20  Col, iPos, &rc) 
57f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  ){.    if( pList
5800: 3d 3d 66 74 73 33 48 61 73 68 49 6e 73 65 72 74  ==fts3HashInsert
5810: 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20  (pHash, zToken, 
5820: 6e 54 6f 6b 65 6e 2c 20 70 4c 69 73 74 29 20 29  nToken, pList) )
5830: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  {.      /* Mallo
5840: 63 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 69  c failed while i
5850: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
5860: 20 65 6e 74 72 79 2e 20 54 68 69 73 20 63 61 6e   entry. This can
5870: 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20   only .      ** 
5880: 68 61 70 70 65 6e 20 69 66 20 74 68 65 72 65 20  happen if there 
5890: 77 61 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  was no previous 
58a0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
58b0: 6f 6b 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  oken..      */. 
58c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
58d0: 66 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61  fts3HashFind(pHa
58e0: 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  sh, zToken, nTok
58f0: 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  en) );.      sql
5900: 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
5910: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
5920: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
5930: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
5940: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5950: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
5960: 2b 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61  += (pList->nData
5970: 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65   + nToken + size
5980: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29  of(Fts3HashElem)
5990: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
59a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b  rc;.}../*.** Tok
59b0: 65 6e 69 7a 65 20 74 68 65 20 6e 75 6c 2d 74 65  enize the nul-te
59c0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
59d0: 7a 54 65 78 74 20 61 6e 64 20 61 64 64 20 61 6c  zText and add al
59e0: 6c 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68 65 0a  l tokens to the.
59f0: 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  ** pending-terms
5a00: 20 68 61 73 68 2d 74 61 62 6c 65 2e 20 54 68 65   hash-table. The
5a10: 20 64 6f 63 69 64 20 75 73 65 64 20 69 73 20 74   docid used is t
5a20: 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  hat currently st
5a30: 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e 69 50  ored in.** p->iP
5a40: 72 65 76 44 6f 63 69 64 2c 20 61 6e 64 20 74 68  revDocid, and th
5a50: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70 65 63  e column is spec
5a60: 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e  ified by argumen
5a70: 74 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  t iCol..**.** If
5a80: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
5a90: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5aa0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
5ab0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
5ac0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
5ad0: 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  nt fts3PendingTe
5ae0: 72 6d 73 41 64 64 28 0a 20 20 46 74 73 33 54 61  rmsAdd(.  Fts3Ta
5af0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
5b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
5b10: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65  le into which te
5b20: 78 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  xt will be inser
5b30: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61  ted */.  int iLa
5b40: 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ngid,           
5b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67           /* Lang
5b60: 75 61 67 65 20 69 64 20 74 6f 20 75 73 65 20 2a  uage id to use *
5b70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5b80: 7a 54 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  zText,          
5b90: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 64      /* Text of d
5ba0: 6f 63 75 6d 65 6e 74 20 74 6f 20 62 65 20 69 6e  ocument to be in
5bb0: 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
5bc0: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5be0: 6f 6c 75 6d 6e 20 69 6e 74 6f 20 77 68 69 63 68  olumn into which
5bf0: 20 74 65 78 74 20 69 73 20 62 65 69 6e 67 20 69   text is being i
5c00: 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 75 33 32  nserted */.  u32
5c10: 20 2a 70 6e 57 6f 72 64 20 20 20 20 20 20 20 20   *pnWord        
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5c30: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 74  OUT: Number of t
5c40: 6f 6b 65 6e 73 20 69 6e 73 65 72 74 65 64 20 2a  okens inserted *
5c50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
5c60: 20 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 69   int iStart;.  i
5c70: 6e 74 20 69 45 6e 64 3b 0a 20 20 69 6e 74 20 69  nt iEnd;.  int i
5c80: 50 6f 73 3b 0a 20 20 69 6e 74 20 6e 57 6f 72 64  Pos;.  int nWord
5c90: 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20 63 6f   = 0;..  char co
5ca0: 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69  nst *zToken;.  i
5cb0: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 73 71  nt nToken;..  sq
5cc0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20  lite3_tokenizer 
5cd0: 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d  *pTokenizer = p-
5ce0: 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73  >pTokenizer;.  s
5cf0: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
5d00: 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70  _module const *p
5d10: 4d 6f 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69  Module = pTokeni
5d20: 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  zer->pModule;.  
5d30: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
5d40: 72 5f 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a  r_cursor *pCsr;.
5d50: 20 20 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73    int (*xNext)(s
5d60: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
5d70: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
5d80: 2c 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ,.      const ch
5d90: 61 72 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69  ar**,int*,int*,i
5da0: 6e 74 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73  nt*,int*);..  as
5db0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72  sert( pTokenizer
5dc0: 20 26 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a   && pModule );..
5dd0: 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
5de0: 20 68 61 73 20 69 6e 73 65 72 74 65 64 20 61 20   has inserted a 
5df0: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 69 73  NULL value, this
5e00: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
5e10: 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
5e20: 2a 20 7a 54 65 78 74 3d 3d 30 2e 20 49 6e 20 74  * zText==0. In t
5e30: 68 69 73 20 63 61 73 65 2c 20 61 64 64 20 7a 65  his case, add ze
5e40: 72 6f 20 74 6f 6b 65 6e 20 65 6e 74 72 69 65 73  ro token entries
5e50: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
5e60: 6c 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 74  le and .  ** ret
5e70: 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
5e80: 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a  if( zText==0 ){.
5e90: 20 20 20 20 2a 70 6e 57 6f 72 64 20 3d 20 30 3b      *pnWord = 0;
5ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5eb0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
5ec0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70   = sqlite3Fts3Op
5ed0: 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b  enTokenizer(pTok
5ee0: 65 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c  enizer, iLangid,
5ef0: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73   zText, -1, &pCs
5f00: 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
5f10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
5f20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
5f30: 20 78 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65   xNext = pModule
5f40: 2d 3e 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65  ->xNext;.  while
5f50: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a  ( SQLITE_OK==rc.
5f60: 20 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f        && SQLITE_
5f70: 4f 4b 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28  OK==(rc = xNext(
5f80: 70 43 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26  pCsr, &zToken, &
5f90: 6e 54 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c  nToken, &iStart,
5fa0: 20 26 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a   &iEnd, &iPos)).
5fb0: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
5fc0: 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 57      if( iPos>=nW
5fd0: 6f 72 64 20 29 20 6e 57 6f 72 64 20 3d 20 69 50  ord ) nWord = iP
5fe0: 6f 73 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  os+1;..    /* Po
5ff0: 73 69 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62  sitions cannot b
6000: 65 20 6e 65 67 61 74 69 76 65 3b 20 77 65 20 75  e negative; we u
6010: 73 65 20 2d 31 20 61 73 20 61 20 74 65 72 6d 69  se -1 as a termi
6020: 6e 61 74 6f 72 20 69 6e 74 65 72 6e 61 6c 6c 79  nator internally
6030: 2e 0a 20 20 20 20 2a 2a 20 54 6f 6b 65 6e 73 20  ..    ** Tokens 
6040: 6d 75 73 74 20 68 61 76 65 20 61 20 6e 6f 6e 2d  must have a non-
6050: 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20  zero length..   
6060: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 6f 73   */.    if( iPos
6070: 3c 30 20 7c 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c  <0 || !zToken ||
6080: 20 6e 54 6f 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20   nToken<=0 ){.  
6090: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
60a0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
60b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
60c0: 2a 20 41 64 64 20 74 68 65 20 74 65 72 6d 20 74  * Add the term t
60d0: 6f 20 74 68 65 20 74 65 72 6d 73 20 69 6e 64 65  o the terms inde
60e0: 78 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  x */.    rc = ft
60f0: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
6100: 64 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 70 2c  dOne(.        p,
6110: 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 2d   iCol, iPos, &p-
6120: 3e 61 49 6e 64 65 78 5b 30 5d 2e 68 50 65 6e 64  >aIndex[0].hPend
6130: 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  ing, zToken, nTo
6140: 6b 65 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 0a  ken.    );.    .
6150: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74      /* Add the t
6160: 65 72 6d 20 74 6f 20 65 61 63 68 20 6f 66 20 74  erm to each of t
6170: 68 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  he prefix indexe
6180: 73 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  s that it is not
6190: 20 74 6f 6f 20 0a 20 20 20 20 2a 2a 20 73 68 6f   too .    ** sho
61a0: 72 74 20 66 6f 72 2e 20 2a 2f 0a 20 20 20 20 66  rt for. */.    f
61b0: 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
61c0: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49  TE_OK && i<p->nI
61d0: 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
61e0: 20 20 73 74 72 75 63 74 20 46 74 73 33 49 6e 64    struct Fts3Ind
61f0: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 26 70 2d  ex *pIndex = &p-
6200: 3e 61 49 6e 64 65 78 5b 69 5d 3b 0a 20 20 20 20  >aIndex[i];.    
6210: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3c 70 49 6e    if( nToken<pIn
6220: 64 65 78 2d 3e 6e 50 72 65 66 69 78 20 29 20 63  dex->nPrefix ) c
6230: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72  ontinue;.      r
6240: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
6250: 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20  ermsAddOne(.    
6260: 20 20 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69        p, iCol, i
6270: 50 6f 73 2c 20 26 70 49 6e 64 65 78 2d 3e 68 50  Pos, &pIndex->hP
6280: 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20  ending, zToken, 
6290: 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 0a  pIndex->nPrefix.
62a0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
62b0: 20 7d 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78   }..  pModule->x
62c0: 43 6c 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a  Close(pCsr);.  *
62d0: 70 6e 57 6f 72 64 20 3d 20 6e 57 6f 72 64 3b 0a  pnWord = nWord;.
62e0: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
62f0: 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
6300: 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
6310: 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  /* .** Calling t
6320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
6330: 69 63 61 74 65 73 20 74 68 61 74 20 73 75 62 73  icates that subs
6340: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
6350: 0a 2a 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54  .** fts3PendingT
6360: 65 72 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f  ermsAdd() are to
6370: 20 61 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69   add term/positi
6380: 6f 6e 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f  on-list pairs fo
6390: 72 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  r the.** content
63a0: 73 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e  s of the documen
63b0: 74 20 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f  t with docid iDo
63c0: 63 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cid..*/.static i
63d0: 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  nt fts3PendingTe
63e0: 72 6d 73 44 6f 63 69 64 28 0a 20 20 46 74 73 33  rmsDocid(.  Fts3
63f0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
6400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
6410: 75 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 68  ull-text table h
6420: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
6430: 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
6440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
6450: 6e 67 75 61 67 65 20 69 64 20 6f 66 20 72 6f 77  nguage id of row
6460: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
6470: 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
6480: 20 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20   iDocid         
6490: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20      /* Docid of 
64a0: 72 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65  row being writte
64b0: 6e 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  n */.){.  assert
64c0: 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a  ( iLangid>=0 );.
64d0: 0a 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73  .  /* TODO(shess
64e0: 29 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65  ) Explore whethe
64f0: 72 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73  r partially flus
6500: 68 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20  hing the buffer 
6510: 6f 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66  on.  ** forced-f
6520: 6c 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69  lush would provi
6530: 64 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72  de better perfor
6540: 6d 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63  mance.  I suspec
6550: 74 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77  t that if.  ** w
6560: 65 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f  e ordered the do
6570: 63 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61  clists by size a
6580: 6e 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c  nd flushed the l
6590: 61 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65  argest until the
65a0: 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73  .  ** buffer was
65b0: 20 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61   half empty, tha
65c0: 74 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20  t would let the 
65d0: 6c 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65  less frequent te
65e0: 72 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74  rms.  ** generat
65f0: 65 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74  e longer doclist
6600: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44  s..  */.  if( iD
6610: 6f 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76 44 6f  ocid<=p->iPrevDo
6620: 63 69 64 20 0a 20 20 20 7c 7c 20 70 2d 3e 69 50  cid .   || p->iP
6630: 72 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e 67  revLangid!=iLang
6640: 69 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65 6e  id.   || p->nPen
6650: 64 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61 78  dingData>p->nMax
6660: 50 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20 29  PendingData .  )
6670: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
6680: 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
6690: 67 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a  gTermsFlush(p);.
66a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
66b0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
66c0: 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65  c;.  }.  p->iPre
66d0: 76 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b  vDocid = iDocid;
66e0: 0a 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69  .  p->iPrevLangi
66f0: 64 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72  d = iLangid;.  r
6700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
6720: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
6730: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
6740: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e  rms hash tables.
6750: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
6760: 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
6770: 73 43 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65  sClear(Fts3Table
6780: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
6790: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
67a0: 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Index; i++){.   
67b0: 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70   Fts3HashElem *p
67c0: 45 6c 65 6d 3b 0a 20 20 20 20 46 74 73 33 48 61  Elem;.    Fts3Ha
67d0: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e  sh *pHash = &p->
67e0: 61 49 6e 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69  aIndex[i].hPendi
67f0: 6e 67 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65  ng;.    for(pEle
6800: 6d 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28  m=fts3HashFirst(
6810: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
6820: 45 6c 65 6d 3d 66 74 73 33 48 61 73 68 4e 65 78  Elem=fts3HashNex
6830: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
6840: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c   PendingList *pL
6850: 69 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69  ist = (PendingLi
6860: 73 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74  st *)fts3HashDat
6870: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
6880: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44  fts3PendingListD
6890: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
68a0: 20 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68    }.    fts3Hash
68b0: 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
68c0: 7d 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  }.  p->nPendingD
68d0: 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ata = 0;.}../*.*
68e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
68f0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
6900: 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f   xUpdate() metho
6910: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  d as part of an 
6920: 49 4e 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74  INSERT.** operat
6930: 69 6f 6e 2e 20 49 74 20 61 64 64 73 20 65 6e 74  ion. It adds ent
6940: 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 74 65  ries for each te
6950: 72 6d 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65  rm in the new re
6960: 63 6f 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70  cord to the.** p
6970: 65 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68  endingTerms hash
6980: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72   table..**.** Ar
6990: 67 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20  gument apVal is 
69a0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
69b0: 73 69 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20  similarly named 
69c0: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
69d0: 74 6f 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72 74  to.** fts3Insert
69e0: 44 61 74 61 28 29 2e 20 50 61 72 61 6d 65 74 65  Data(). Paramete
69f0: 72 20 69 44 6f 63 69 64 20 69 73 20 74 68 65 20  r iDocid is the 
6a00: 64 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 77  docid of the new
6a10: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
6a20: 69 6e 74 20 66 74 73 33 49 6e 73 65 72 74 54 65  int fts3InsertTe
6a30: 72 6d 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65  rms(.  Fts3Table
6a40: 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e   *p, .  int iLan
6a50: 67 69 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  gid, .  sqlite3_
6a60: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a  value **apVal, .
6a70: 20 20 75 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20    u32 *aSz.){.  
6a80: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
6ab0: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
6ac0: 32 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  2; i<p->nColumn+
6ad0: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  2; i++){.    con
6ae0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d  st char *zText =
6af0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
6b00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6b10: 74 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20  t(apVal[i]);.   
6b20: 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 50 65   int rc = fts3Pe
6b30: 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70 2c  ndingTermsAdd(p,
6b40: 20 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c   iLangid, zText,
6b50: 20 69 2d 32 2c 20 26 61 53 7a 5b 69 2d 32 5d 29   i-2, &aSz[i-2])
6b60: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
6b70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6b80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
6b90: 7d 0a 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f  }.    aSz[p->nCo
6ba0: 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33  lumn] += sqlite3
6bb0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56  _value_bytes(apV
6bc0: 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  al[i]);.  }.  re
6bd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
6bf0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6c00: 20 62 79 20 74 68 65 20 78 55 70 64 61 74 65 28   by the xUpdate(
6c10: 29 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 6e 20  ) method for an 
6c20: 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
6c30: 2e 0a 2a 2a 20 54 68 65 20 61 70 56 61 6c 20 70  ..** The apVal p
6c40: 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
6c50: 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ed a copy of the
6c60: 20 61 70 56 61 6c 20 61 72 67 75 6d 65 6e 74 20   apVal argument 
6c70: 70 61 73 73 65 64 20 62 79 0a 2a 2a 20 53 51 4c  passed by.** SQL
6c80: 69 74 65 20 74 6f 20 74 68 65 20 78 55 70 64 61  ite to the xUpda
6c90: 74 65 28 29 20 6d 65 74 68 6f 64 2e 20 69 2e 65  te() method. i.e
6ca0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  :.**.**   apVal[
6cb0: 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0]              
6cc0: 20 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 49    Not used for I
6cd0: 4e 53 45 52 54 2e 0a 2a 2a 20 20 20 61 70 56 61  NSERT..**   apVa
6ce0: 6c 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  l[1]            
6cf0: 20 20 20 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61      rowid.**   a
6d00: 70 56 61 6c 5b 32 5d 20 20 20 20 20 20 20 20 20  pVal[2]         
6d10: 20 20 20 20 20 20 20 4c 65 66 74 2d 6d 6f 73 74         Left-most
6d20: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
6d30: 6c 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a  lumn.**   ....**
6d40: 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c     apVal[p->nCol
6d50: 75 6d 6e 2b 31 5d 20 20 20 20 20 52 69 67 68 74  umn+1]     Right
6d60: 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e  -most user-defin
6d70: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61  ed column.**   a
6d80: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
6d90: 32 5d 20 20 20 20 20 48 69 64 64 65 6e 20 63 6f  2]     Hidden co
6da0: 6c 75 6d 6e 20 77 69 74 68 20 73 61 6d 65 20 6e  lumn with same n
6db0: 61 6d 65 20 61 73 20 74 61 62 6c 65 0a 2a 2a 20  ame as table.** 
6dc0: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
6dd0: 6d 6e 2b 33 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+3]     Hidden
6de0: 20 22 64 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 20   "docid" column 
6df0: 28 61 6c 69 61 73 20 66 6f 72 20 72 6f 77 69 64  (alias for rowid
6e00: 29 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e  ).**   apVal[p->
6e10: 6e 43 6f 6c 75 6d 6e 2b 34 5d 20 20 20 20 20 48  nColumn+4]     H
6e20: 69 64 64 65 6e 20 6c 61 6e 67 75 61 67 65 69 64  idden languageid
6e30: 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
6e40: 63 20 69 6e 74 20 66 74 73 33 49 6e 73 65 72 74  c int fts3Insert
6e50: 44 61 74 61 28 0a 20 20 46 74 73 33 54 61 62 6c  Data(.  Fts3Tabl
6e60: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
6e70: 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 2d          /* Full-
6e80: 74 65 78 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  text table */.  
6e90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6ea0: 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20  apVal,          
6eb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 76 61 6c 75  /* Array of valu
6ec0: 65 73 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  es to insert */.
6ed0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
6ee0: 2a 70 69 44 6f 63 69 64 20 20 20 20 20 20 20 20  *piDocid        
6ef0: 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20    /* OUT: Docid 
6f00: 66 6f 72 20 72 6f 77 20 6a 75 73 74 20 69 6e 73  for row just ins
6f10: 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  erted */.){.  in
6f20: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6f40: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
6f50: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
6f60: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 3b 20  pContentInsert; 
6f70: 20 20 2f 2a 20 49 4e 53 45 52 54 20 49 4e 54 4f    /* INSERT INTO
6f80: 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45   %_content VALUE
6f90: 53 28 2e 2e 2e 29 20 2a 2f 0a 0a 20 20 69 66 28  S(...) */..  if(
6fa0: 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20   p->zContentTbl 
6fb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
6fc0: 61 6c 75 65 20 2a 70 52 6f 77 69 64 20 3d 20 61  alue *pRowid = a
6fd0: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
6fe0: 33 5d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  3];.    if( sqli
6ff0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
7000: 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 4e  Rowid)==SQLITE_N
7010: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  ULL ){.      pRo
7020: 77 69 64 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a  wid = apVal[1];.
7030: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
7040: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
7050: 28 70 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45  (pRowid)!=SQLITE
7060: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
7070: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7080: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
7090: 7d 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d  }.    *piDocid =
70a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
70b0: 6e 74 36 34 28 70 52 6f 77 69 64 29 3b 0a 20 20  nt64(pRowid);.  
70c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
70d0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  OK;.  }..  /* Lo
70e0: 63 61 74 65 20 74 68 65 20 73 74 61 74 65 6d 65  cate the stateme
70f0: 6e 74 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74  nt handle used t
7100: 6f 20 69 6e 73 65 72 74 20 64 61 74 61 20 69 6e  o insert data in
7110: 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74  to the %_content
7120: 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
7130: 20 53 51 4c 20 66 6f 72 20 74 68 69 73 20 73 74   SQL for this st
7140: 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 2a 2a  atement is:.  **
7150: 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  .  **   INSERT I
7160: 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41  NTO %_content VA
7170: 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e  LUES(?, ?, ?, ..
7180: 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  .).  **.  ** The
7190: 20 73 74 61 74 65 6d 65 6e 74 20 66 65 61 74 75   statement featu
71a0: 72 65 73 20 4e 20 27 3f 27 20 76 61 72 69 61 62  res N '?' variab
71b0: 6c 65 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20  les, where N is 
71c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
71d0: 65 72 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  er.  ** defined 
71e0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
71f0: 54 53 33 20 74 61 62 6c 65 2c 20 70 6c 75 73 20  TS3 table, plus 
7200: 6f 6e 65 20 66 6f 72 20 74 68 65 20 64 6f 63 69  one for the doci
7210: 64 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  d field..  */.  
7220: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
7230: 28 70 2c 20 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f  (p, SQL_CONTENT_
7240: 49 4e 53 45 52 54 2c 20 26 70 43 6f 6e 74 65 6e  INSERT, &pConten
7250: 74 49 6e 73 65 72 74 2c 20 26 61 70 56 61 6c 5b  tInsert, &apVal[
7260: 31 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  1]);.  if( rc==S
7270: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a  QLITE_OK && p->z
7280: 4c 61 6e 67 75 61 67 65 69 64 20 29 7b 0a 20 20  Languageid ){.  
7290: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
72a0: 69 6e 64 5f 69 6e 74 28 0a 20 20 20 20 20 20 20  ind_int(.       
72b0: 20 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c   pContentInsert,
72c0: 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 2c 20 0a   p->nColumn+2, .
72d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
72e0: 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
72f0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d 29 0a 20  p->nColumn+4]). 
7300: 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20     );.  }.  if( 
7310: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7320: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
7330: 20 54 68 65 72 65 20 69 73 20 61 20 71 75 69 72   There is a quir
7340: 6b 20 68 65 72 65 2e 20 54 68 65 20 75 73 65 72  k here. The user
7350: 73 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  s INSERT stateme
7360: 6e 74 20 6d 61 79 20 68 61 76 65 20 73 70 65 63  nt may have spec
7370: 69 66 69 65 64 0a 20 20 2a 2a 20 61 20 76 61 6c  ified.  ** a val
7380: 75 65 20 66 6f 72 20 74 68 65 20 22 72 6f 77 69  ue for the "rowi
7390: 64 22 20 66 69 65 6c 64 2c 20 66 6f 72 20 74 68  d" field, for th
73a0: 65 20 22 64 6f 63 69 64 22 20 66 69 65 6c 64 2c  e "docid" field,
73b0: 20 6f 72 20 66 6f 72 20 62 6f 74 68 2e 0a 20 20   or for both..  
73c0: 2a 2a 20 57 68 69 63 68 20 69 73 20 61 20 70 72  ** Which is a pr
73d0: 6f 62 6c 65 6d 2c 20 73 69 6e 63 65 20 22 72 6f  oblem, since "ro
73e0: 77 69 64 22 20 61 6e 64 20 22 64 6f 63 69 64 22  wid" and "docid"
73f0: 20 61 72 65 20 61 6c 69 61 73 65 73 20 66 6f 72   are aliases for
7400: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
7410: 61 6c 75 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  alue. For exampl
7420: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49  e:.  **.  **   I
7430: 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73 33 74  NSERT INTO fts3t
7440: 62 6c 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 29  bl(rowid, docid)
7450: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
7460: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46 54 53 33   **.  ** In FTS3
7470: 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  , this is an err
7480: 6f 72 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72  or. It is an err
7490: 6f 72 20 74 6f 20 73 70 65 63 69 66 79 20 6e 6f  or to specify no
74a0: 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 20 20  n-NULL values.  
74b0: 2a 2a 20 66 6f 72 20 62 6f 74 68 20 64 6f 63 69  ** for both doci
74c0: 64 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72  d and some other
74d0: 20 72 6f 77 69 64 20 61 6c 69 61 73 2e 0a 20 20   rowid alias..  
74e0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
74f0: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
7500: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 33  lue_type(apVal[3
7510: 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b  +p->nColumn]) ){
7520: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
7530: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
7540: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30  lue_type(apVal[0
7550: 5d 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  ]).     && SQLIT
7560: 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f  E_NULL!=sqlite3_
7570: 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
7580: 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  [1]).    ){.    
7590: 20 20 2f 2a 20 41 20 72 6f 77 69 64 2f 64 6f 63    /* A rowid/doc
75a0: 69 64 20 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a  id conflict. */.
75b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
75c0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
75d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
75e0: 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 43 6f  3_bind_value(pCo
75f0: 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20 31 2c 20  ntentInsert, 1, 
7600: 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75  apVal[3+p->nColu
7610: 6d 6e 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mn]);.    if( rc
7620: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
7630: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
7640: 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73  /* Execute the s
7650: 74 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65  tatement to inse
7660: 72 74 20 74 68 65 20 72 65 63 6f 72 64 2e 20 53  rt the record. S
7670: 65 74 20 2a 70 69 44 6f 63 69 64 20 74 6f 20 74  et *piDocid to t
7680: 68 65 20 0a 20 20 2a 2a 20 6e 65 77 20 64 6f 63  he .  ** new doc
7690: 69 64 20 76 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a  id value. .  */.
76a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
76b0: 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a  ContentInsert);.
76c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
76d0: 65 73 65 74 28 70 43 6f 6e 74 65 6e 74 49 6e 73  eset(pContentIns
76e0: 65 72 74 29 3b 0a 0a 20 20 2a 70 69 44 6f 63 69  ert);..  *piDoci
76f0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
7700: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 2d  _insert_rowid(p-
7710: 3e 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >db);.  return r
7720: 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  c;.}..../*.** Re
7730: 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72  move all data fr
7740: 6f 6d 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  om the FTS3 tabl
7750: 65 2e 20 43 6c 65 61 72 20 74 68 65 20 68 61 73  e. Clear the has
7760: 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  h table containi
7770: 6e 67 0a 2a 2a 20 70 65 6e 64 69 6e 67 20 74 65  ng.** pending te
7780: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rms..*/.static i
7790: 6e 74 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c  nt fts3DeleteAll
77a0: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69  (Fts3Table *p, i
77b0: 6e 74 20 62 43 6f 6e 74 65 6e 74 29 7b 0a 20 20  nt bContent){.  
77c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
77d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
77e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
77f0: 2f 0a 0a 20 20 2f 2a 20 44 69 73 63 61 72 64 20  /..  /* Discard 
7800: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
7810: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
7820: 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  s hash table. */
7830: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65  .  sqlite3Fts3Pe
7840: 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28  ndingTermsClear(
7850: 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  p);..  /* Delete
7860: 20 65 76 65 72 79 74 68 69 6e 67 20 66 72 6f 6d   everything from
7870: 20 74 68 65 20 73 68 61 64 6f 77 20 74 61 62 6c   the shadow tabl
7880: 65 73 2e 20 45 78 63 65 70 74 2c 20 6c 65 61 76  es. Except, leav
7890: 65 20 25 5f 63 6f 6e 74 65 6e 74 20 61 73 0a 20  e %_content as. 
78a0: 20 2a 2a 20 69 73 20 69 66 20 62 43 6f 6e 74 65   ** is if bConte
78b0: 6e 74 20 69 73 20 66 61 6c 73 65 2e 20 20 2a 2f  nt is false.  */
78c0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 43  .  assert( p->zC
78d0: 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 7c 7c 20  ontentTbl==0 || 
78e0: 62 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 3b 0a 20  bContent==0 );. 
78f0: 20 69 66 28 20 62 43 6f 6e 74 65 6e 74 20 29 20   if( bContent ) 
7900: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
7910: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
7920: 4c 4c 5f 43 4f 4e 54 45 4e 54 2c 20 30 29 3b 0a  LL_CONTENT, 0);.
7930: 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72    fts3SqlExec(&r
7940: 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45  c, p, SQL_DELETE
7950: 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 2c 20 30  _ALL_SEGMENTS, 0
7960: 29 3b 0a 20 20 66 74 73 33 53 71 6c 45 78 65 63  );.  fts3SqlExec
7970: 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
7980: 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52 2c 20  ETE_ALL_SEGDIR, 
7990: 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 62 48 61  0);.  if( p->bHa
79a0: 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20  sDocsize ){.    
79b0: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
79c0: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
79d0: 4c 4c 5f 44 4f 43 53 49 5a 45 2c 20 30 29 3b 0a  LL_DOCSIZE, 0);.
79e0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62 48 61    }.  if( p->bHa
79f0: 73 53 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73  sStat ){.    fts
7a00: 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c  3SqlExec(&rc, p,
7a10: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f   SQL_DELETE_ALL_
7a20: 53 54 41 54 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  STAT, 0);.  }.  
7a30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7a40: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
7a50: 74 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65  t langidFromSele
7a60: 63 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ct(Fts3Table *p,
7a70: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
7a80: 53 65 6c 65 63 74 29 7b 0a 20 20 69 6e 74 20 69  Select){.  int i
7a90: 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 20 20 69 66  Langid = 0;.  if
7aa0: 28 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64  ( p->zLanguageid
7ab0: 20 29 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c   ) iLangid = sql
7ac0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
7ad0: 70 53 65 6c 65 63 74 2c 20 70 2d 3e 6e 43 6f 6c  pSelect, p->nCol
7ae0: 75 6d 6e 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  umn+1);.  return
7af0: 20 69 4c 61 6e 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a   iLangid;.}../*.
7b00: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65  ** The first ele
7b10: 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 70 56 61  ment in the apVa
7b20: 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73  l[] array is ass
7b30: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
7b40: 74 68 65 20 64 6f 63 69 64 0a 2a 2a 20 28 61 6e  the docid.** (an
7b50: 20 69 6e 74 65 67 65 72 29 20 6f 66 20 61 20 72   integer) of a r
7b60: 6f 77 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  ow about to be d
7b70: 65 6c 65 74 65 64 2e 20 52 65 6d 6f 76 65 20 61  eleted. Remove a
7b80: 6c 6c 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  ll terms from th
7b90: 65 0a 2a 2a 20 66 75 6c 6c 2d 74 65 78 74 20 69  e.** full-text i
7ba0: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
7bb0: 76 6f 69 64 20 66 74 73 33 44 65 6c 65 74 65 54  void fts3DeleteT
7bc0: 65 72 6d 73 28 20 0a 20 20 69 6e 74 20 2a 70 52  erms( .  int *pR
7bd0: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
7be0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
7bf0: 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  */.  Fts3Table *
7c00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
7c10: 54 68 65 20 46 54 53 20 74 61 62 6c 65 20 74 6f  The FTS table to
7c20: 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a   delete from */.
7c30: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
7c40: 2a 70 52 6f 77 69 64 2c 20 20 2f 2a 20 54 68 65  *pRowid,  /* The
7c50: 20 64 6f 63 69 64 20 74 6f 20 62 65 20 64 65 6c   docid to be del
7c60: 65 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61  eted */.  u32 *a
7c70: 53 7a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Sz              
7c80: 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 64 65    /* Sizes of de
7c90: 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e 74 20 77  leted document w
7ca0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
7cb0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
7cc0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
7cd0: 65 63 74 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43  ect;..  if( *pRC
7ce0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20   ) return;.  rc 
7cf0: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
7d00: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54   SQL_SELECT_CONT
7d10: 45 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70  ENT_BY_ROWID, &p
7d20: 53 65 6c 65 63 74 2c 20 26 70 52 6f 77 69 64 29  Select, &pRowid)
7d30: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
7d40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
7d50: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
7d60: 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
7d70: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  t) ){.      int 
7d80: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61  i;.      int iLa
7d90: 6e 67 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f  ngid = langidFro
7da0: 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 65 6c 65  mSelect(p, pSele
7db0: 63 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ct);.      rc = 
7dc0: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
7dd0: 44 6f 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 64  Docid(p, iLangid
7de0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
7df0: 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20  _int64(pSelect, 
7e00: 30 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0));.      for(i
7e10: 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =1; rc==SQLITE_O
7e20: 4b 20 26 26 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75  K && i<=p->nColu
7e30: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
7e40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
7e50: 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
7e60: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
7e70: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
7e80: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   i);.        rc 
7e90: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
7ea0: 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69 64  msAdd(p, iLangid
7eb0: 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 61 53  , zText, -1, &aS
7ec0: 7a 5b 69 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20  z[i-1]);.       
7ed0: 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d   aSz[p->nColumn]
7ee0: 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   += sqlite3_colu
7ef0: 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74  mn_bytes(pSelect
7f00: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
7f10: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7f20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
7f30: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
7f40: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
7f50: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
7f60: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7f70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
7f80: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
7f90: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c  (pSelect);.  }el
7fa0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
7fb0: 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a  reset(pSelect);.
7fc0: 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b    }.  *pRC = rc;
7fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
7fe0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 6f  d declaration to
7ff0: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
8000: 20 63 69 72 63 75 6c 61 72 20 64 65 70 65 6e 64   circular depend
8010: 65 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ency between.** 
8020: 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 33 53 65  functions fts3Se
8030: 67 6d 65 6e 74 4d 65 72 67 65 28 29 20 61 6e 64  gmentMerge() and
8040: 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67   fts3AllocateSeg
8050: 64 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73 74 61  dirIdx()..*/.sta
8060: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d  tic int fts3Segm
8070: 65 6e 74 4d 65 72 67 65 28 46 74 73 33 54 61 62  entMerge(Fts3Tab
8080: 6c 65 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  le *, int, int, 
8090: 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  int);../* .** Th
80a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
80b0: 63 61 74 65 73 20 61 20 6e 65 77 20 6c 65 76 65  cates a new leve
80c0: 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65 78 20 69  l iLevel index i
80d0: 6e 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62  n the segdir tab
80e0: 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  le..** Usually, 
80f0: 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f  indexes are allo
8100: 63 61 74 65 64 20 77 69 74 68 69 6e 20 61 20 6c  cated within a l
8110: 65 76 65 6c 20 73 65 71 75 65 6e 74 69 61 6c 6c  evel sequentiall
8120: 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69  y starting.** wi
8130: 74 68 20 30 2c 20 73 6f 20 74 68 65 20 61 6c 6c  th 0, so the all
8140: 6f 63 61 74 65 64 20 69 6e 64 65 78 20 69 73 20  ocated index is 
8150: 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
8160: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
8170: 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a 2a  ned.** by:.**.**
8180: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 69 64     SELECT max(id
8190: 78 29 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72  x) FROM %_segdir
81a0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a   WHERE level = :
81b0: 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f 77  iLevel.**.** How
81c0: 65 76 65 72 2c 20 69 66 20 74 68 65 72 65 20 61  ever, if there a
81d0: 72 65 20 61 6c 72 65 61 64 79 20 46 54 53 33 5f  re already FTS3_
81e0: 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64 65  MERGE_COUNT inde
81f0: 78 65 73 20 61 74 20 74 68 65 20 72 65 71 75 65  xes at the reque
8200: 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74  sted.** level, t
8210: 68 65 79 20 61 72 65 20 6d 65 72 67 65 64 20 69  hey are merged i
8220: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76  nto a single lev
8230: 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20 73 65  el (iLevel+1) se
8240: 67 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 0a 2a  gment and the .*
8250: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  * allocated inde
8260: 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  x is 0..**.** If
8270: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69   successful, *pi
8280: 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
8290: 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  e allocated inde
82a0: 78 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49 54  x slot and SQLIT
82b0: 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E_OK.** returned
82c0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
82d0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
82e0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
82f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
8300: 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
8310: 64 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  dx(.  Fts3Table 
8320: 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67  *p, .  int iLang
8330: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
8340: 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61         /* Langua
8350: 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ge id */.  int i
8360: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
8370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8380: 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65  dex for p->aInde
8390: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  x */.  int iLeve
83a0: 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69 49 64 78  l, .  int *piIdx
83b0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
83e0: 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Code */.  sqlite
83f0: 33 5f 73 74 6d 74 20 2a 70 4e 65 78 74 49 64 78  3_stmt *pNextIdx
8400: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65  ;         /* Que
8410: 72 79 20 66 6f 72 20 6e 65 78 74 20 69 64 78 20  ry for next idx 
8420: 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20  at level iLevel 
8430: 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 20 3d  */.  int iNext =
8440: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8450: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
8460: 66 20 71 75 65 72 79 20 70 4e 65 78 74 49 64 78  f query pNextIdx
8470: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
8480: 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61  Langid>=0 );.  a
8490: 73 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78  ssert( p->nIndex
84a0: 3e 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  >=1 );..  /* Set
84b0: 20 76 61 72 69 61 62 6c 65 20 69 4e 65 78 74 20   variable iNext 
84c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 61 76 61 69  to the next avai
84d0: 6c 61 62 6c 65 20 73 65 67 64 69 72 20 69 6e 64  lable segdir ind
84e0: 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76  ex at level iLev
84f0: 65 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  el. */.  rc = ft
8500: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
8510: 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e  _NEXT_SEGMENT_IN
8520: 44 45 58 2c 20 26 70 4e 65 78 74 49 64 78 2c 20  DEX, &pNextIdx, 
8530: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
8540: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
8550: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
8560: 34 28 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  4(.        pNext
8570: 49 64 78 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  Idx, 1, getAbsol
8580: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
8590: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
85a0: 76 65 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  vel).    );.    
85b0: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
85c0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4e 65  sqlite3_step(pNe
85d0: 78 74 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20  xtIdx) ){.      
85e0: 69 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  iNext = sqlite3_
85f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e 65 78 74  column_int(pNext
8600: 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Idx, 0);.    }. 
8610: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8620: 72 65 73 65 74 28 70 4e 65 78 74 49 64 78 29 3b  reset(pNextIdx);
8630: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
8640: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8650: 20 2f 2a 20 49 66 20 69 4e 65 78 74 20 69 73 20   /* If iNext is 
8660: 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  FTS3_MERGE_COUNT
8670: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
8680: 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69  t level iLevel i
8690: 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  s already.    **
86a0: 20 66 75 6c 6c 2c 20 6d 65 72 67 65 20 61 6c 6c   full, merge all
86b0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
86c0: 65 6c 20 69 4c 65 76 65 6c 20 69 6e 74 6f 20 61  el iLevel into a
86d0: 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 31   single iLevel+1
86e0: 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20  .    ** segment 
86f0: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 28 6e 65  and allocate (ne
8700: 77 6c 79 20 66 72 65 65 64 29 20 69 6e 64 65 78  wly freed) index
8710: 20 30 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76   0 at level iLev
8720: 65 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  el. Otherwise,. 
8730: 20 20 20 2a 2a 20 69 66 20 69 4e 65 78 74 20 69     ** if iNext i
8740: 73 20 6c 65 73 73 20 74 68 61 6e 20 46 54 53 33  s less than FTS3
8750: 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20 61 6c  _MERGE_COUNT, al
8760: 6c 6f 63 61 74 65 20 69 6e 64 65 78 20 69 4e 65  locate index iNe
8770: 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  xt..    */.    i
8780: 66 28 20 69 4e 65 78 74 3e 3d 46 54 53 33 5f 4d  f( iNext>=FTS3_M
8790: 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20  ERGE_COUNT ){.  
87a0: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
87b0: 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 69 4c 61  mentMerge(p, iLa
87c0: 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c  ngid, iIndex, iL
87d0: 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 2a 70 69  evel);.      *pi
87e0: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Idx = 0;.    }el
87f0: 73 65 7b 0a 20 20 20 20 20 20 2a 70 69 49 64 78  se{.      *piIdx
8800: 20 3d 20 69 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   = iNext;.    }.
8810: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
8820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25  ;.}../*.** The %
8830: 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
8840: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 66  is declared as f
8850: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
8860: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 73  CREATE TABLE %_s
8870: 65 67 6d 65 6e 74 73 28 62 6c 6f 63 6b 69 64 20  egments(blockid 
8880: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8890: 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29  KEY, block BLOB)
88a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
88b0: 74 69 6f 6e 20 72 65 61 64 73 20 64 61 74 61 20  tion reads data 
88c0: 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 72 6f  from a single ro
88d0: 77 20 6f 66 20 74 68 65 20 25 5f 73 65 67 6d 65  w of the %_segme
88e0: 6e 74 73 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a  nts table. The.*
88f0: 2a 20 73 70 65 63 69 66 69 63 20 72 6f 77 20 69  * specific row i
8900: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
8910: 74 68 65 20 69 42 6c 6f 63 6b 69 64 20 70 61 72  the iBlockid par
8920: 61 6d 65 74 65 72 2e 20 49 66 20 70 61 42 6c 6f  ameter. If paBlo
8930: 62 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  b is not.** NULL
8940: 2c 20 74 68 65 6e 20 61 20 62 75 66 66 65 72 20  , then a buffer 
8950: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  is allocated usi
8960: 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ng sqlite3_mallo
8970: 63 28 29 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  c() and populate
8980: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 63 6f  d.** with the co
8990: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 6c  ntents of the bl
89a0: 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ob stored in the
89b0: 20 22 62 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20   "block" column 
89c0: 6f 66 20 74 68 65 20 0a 2a 2a 20 69 64 65 6e 74  of the .** ident
89d0: 69 66 69 65 64 20 74 61 62 6c 65 20 72 6f 77 20  ified table row 
89e0: 69 73 2e 20 57 68 65 74 68 65 72 20 6f 72 20 6e  is. Whether or n
89f0: 6f 74 20 70 61 42 6c 6f 62 20 69 73 20 4e 55 4c  ot paBlob is NUL
8a00: 4c 2c 20 2a 70 6e 42 6c 6f 62 20 69 73 20 73 65  L, *pnBlob is se
8a10: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 73 69 7a 65  t.** to the size
8a20: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 69 6e 20   of the blob in 
8a30: 62 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74  bytes before ret
8a40: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
8a50: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8a60: 2c 20 6f 72 20 74 68 65 20 74 61 62 6c 65 20 64  , or the table d
8a70: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
8a80: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 72 6f  the specified ro
8a90: 77 2c 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  w,.** an SQLite 
8aa0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
8ab0: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
8ac0: 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
8ad0: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
8ae0: 70 61 42 6c 6f 62 20 69 73 20 6e 6f 6e 2d 4e 55  paBlob is non-NU
8af0: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  LL, then it is t
8b00: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
8b10: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
8b20: 74 6f 0a 2a 2a 20 65 76 65 6e 74 75 61 6c 6c 79  to.** eventually
8b30: 20 66 72 65 65 20 74 68 65 20 72 65 74 75 72 6e   free the return
8b40: 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
8b50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
8b60: 61 79 20 6c 65 61 76 65 20 61 6e 20 6f 70 65 6e  ay leave an open
8b70: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 2a 20 68   sqlite3_blob* h
8b80: 61 6e 64 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20  andle in the.** 
8b90: 46 74 73 33 54 61 62 6c 65 2e 70 53 65 67 6d 65  Fts3Table.pSegme
8ba0: 6e 74 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68  nts variable. Th
8bb0: 69 73 20 68 61 6e 64 6c 65 20 69 73 20 72 65 75  is handle is reu
8bc0: 73 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  sed by subsequen
8bd0: 74 20 63 61 6c 6c 73 0a 2a 2a 20 74 6f 20 74 68  t calls.** to th
8be0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
8bf0: 20 68 61 6e 64 6c 65 20 6d 61 79 20 62 65 20 63   handle may be c
8c00: 6c 6f 73 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  losed by calling
8c10: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46   the.** sqlite3F
8c20: 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65  ts3SegmentsClose
8c30: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 75  () function. Reu
8c40: 73 69 6e 67 20 61 20 62 6c 6f 62 20 68 61 6e 64  sing a blob hand
8c50: 6c 65 20 69 73 20 61 20 68 61 6e 64 79 0a 2a 2a  le is a handy.**
8c60: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
8c70: 72 6f 76 65 6d 65 6e 74 2c 20 62 75 74 20 74 68  rovement, but th
8c80: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 73 68  e blob handle sh
8c90: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63  ould always be c
8ca0: 6c 6f 73 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  losed.** before 
8cb0: 63 6f 6e 74 72 6f 6c 20 69 73 20 72 65 74 75 72  control is retur
8cc0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
8cd0: 28 74 6f 20 70 72 65 76 65 6e 74 20 61 20 6c 6f  (to prevent a lo
8ce0: 63 6b 20 62 65 69 6e 67 20 68 65 6c 64 0a 2a 2a  ck being held.**
8cf0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
8d00: 20 66 69 6c 65 20 66 6f 72 20 6c 6f 6e 67 65 72   file for longer
8d10: 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 29   than necessary)
8d20: 2e 20 54 68 75 73 2c 20 61 6e 79 20 76 69 72 74  . Thus, any virt
8d30: 75 61 6c 20 74 61 62 6c 65 0a 2a 2a 20 6d 65 74  ual table.** met
8d40: 68 6f 64 20 28 78 46 69 6c 74 65 72 20 65 74 63  hod (xFilter etc
8d50: 2e 29 20 74 68 61 74 20 6d 61 79 20 64 69 72 65  .) that may dire
8d60: 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74  ctly or indirect
8d70: 6c 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ly call this fun
8d80: 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 61  ction.** must ca
8d90: 6c 6c 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  ll sqlite3Fts3Se
8da0: 67 6d 65 6e 74 73 43 6c 6f 73 65 28 29 20 62 65  gmentsClose() be
8db0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
8dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
8dd0: 73 33 52 65 61 64 42 6c 6f 63 6b 28 0a 20 20 46  s3ReadBlock(.  F
8de0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8e00: 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e  * FTS3 table han
8e10: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
8e20: 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 69 64 2c  _int64 iBlockid,
8e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 65           /* Acce
8e40: 73 73 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  ss the row with 
8e50: 62 6c 6f 63 6b 69 64 3d 24 69 42 6c 6f 63 6b 69  blockid=$iBlocki
8e60: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61  d */.  char **pa
8e70: 42 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20 20  Blob,           
8e80: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42         /* OUT: B
8e90: 6c 6f 62 20 64 61 74 61 20 69 6e 20 6d 61 6c 6c  lob data in mall
8ea0: 6f 63 27 64 20 62 75 66 66 65 72 20 2a 2f 0a 20  oc'd buffer */. 
8eb0: 20 69 6e 74 20 2a 70 6e 42 6c 6f 62 2c 20 20 20   int *pnBlob,   
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
8ee0: 20 62 6c 6f 62 20 64 61 74 61 20 2a 2f 0a 20 20   blob data */.  
8ef0: 69 6e 74 20 2a 70 6e 4c 6f 61 64 20 20 20 20 20  int *pnLoad     
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 2f 2a 20 4f 55 54 3a 20 42 79 74 65 73 20 61 63  /* OUT: Bytes ac
8f20: 74 75 61 6c 6c 79 20 6c 6f 61 64 65 64 20 2a 2f  tually loaded */
8f30: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8f60: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 70 6e  code */..  /* pn
8f70: 42 6c 6f 62 20 6d 75 73 74 20 62 65 20 6e 6f 6e  Blob must be non
8f80: 2d 4e 55 4c 4c 2e 20 70 61 42 6c 6f 62 20 6d 61  -NULL. paBlob ma
8f90: 79 20 62 65 20 4e 55 4c 4c 20 6f 72 20 6e 6f 6e  y be NULL or non
8fa0: 2d 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65  -NULL. */.  asse
8fb0: 72 74 28 20 70 6e 42 6c 6f 62 29 3b 0a 0a 20 20  rt( pnBlob);..  
8fc0: 69 66 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73  if( p->pSegments
8fd0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8fe0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
8ff0: 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69  (p->pSegments, i
9000: 42 6c 6f 63 6b 69 64 29 3b 0a 20 20 7d 65 6c 73  Blockid);.  }els
9010: 65 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 2d  e{.    if( 0==p-
9020: 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 29 7b  >zSegmentsTbl ){
9030: 0a 20 20 20 20 20 20 70 2d 3e 7a 53 65 67 6d 65  .      p->zSegme
9040: 6e 74 73 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ntsTbl = sqlite3
9050: 5f 6d 70 72 69 6e 74 66 28 22 25 73 5f 73 65 67  _mprintf("%s_seg
9060: 6d 65 6e 74 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  ments", p->zName
9070: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
9080: 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20  p->zSegmentsTbl 
9090: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
90a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
90b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
90c0: 6f 62 5f 6f 70 65 6e 28 0a 20 20 20 20 20 20 20  ob_open(.       
90d0: 70 2d 3e 64 62 2c 20 70 2d 3e 7a 44 62 2c 20 70  p->db, p->zDb, p
90e0: 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 2c 20  ->zSegmentsTbl, 
90f0: 22 62 6c 6f 63 6b 22 2c 20 69 42 6c 6f 63 6b 69  "block", iBlocki
9100: 64 2c 20 30 2c 20 26 70 2d 3e 70 53 65 67 6d 65  d, 0, &p->pSegme
9110: 6e 74 73 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  nts.    );.  }..
9120: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9130: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
9140: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
9150: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 53 65  lob_bytes(p->pSe
9160: 67 6d 65 6e 74 73 29 3b 0a 20 20 20 20 2a 70 6e  gments);.    *pn
9170: 42 6c 6f 62 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Blob = nByte;.  
9180: 20 20 69 66 28 20 70 61 42 6c 6f 62 20 29 7b 0a    if( paBlob ){.
9190: 20 20 20 20 20 20 63 68 61 72 20 2a 61 42 79 74        char *aByt
91a0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
91b0: 6f 63 28 6e 42 79 74 65 20 2b 20 46 54 53 33 5f  oc(nByte + FTS3_
91c0: 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20  NODE_PADDING);. 
91d0: 20 20 20 20 20 69 66 28 20 21 61 42 79 74 65 20       if( !aByte 
91e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
91f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9200: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9210: 20 20 20 69 66 28 20 70 6e 4c 6f 61 64 20 26 26     if( pnLoad &&
9220: 20 6e 42 79 74 65 3e 28 46 54 53 33 5f 4e 4f 44   nByte>(FTS3_NOD
9230: 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53 48 4f 4c  E_CHUNK_THRESHOL
9240: 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  D) ){.          
9250: 6e 42 79 74 65 20 3d 20 46 54 53 33 5f 4e 4f 44  nByte = FTS3_NOD
9260: 45 5f 43 48 55 4e 4b 53 49 5a 45 3b 0a 20 20 20  E_CHUNKSIZE;.   
9270: 20 20 20 20 20 20 20 2a 70 6e 4c 6f 61 64 20 3d         *pnLoad =
9280: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
9290: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
92a0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
92b0: 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 61  (p->pSegments, a
92c0: 42 79 74 65 2c 20 6e 42 79 74 65 2c 20 30 29 3b  Byte, nByte, 0);
92d0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
92e0: 26 61 42 79 74 65 5b 6e 42 79 74 65 5d 2c 20 30  &aByte[nByte], 0
92f0: 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  , FTS3_NODE_PADD
9300: 49 4e 47 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ING);.        if
9310: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
9330: 69 74 65 33 5f 66 72 65 65 28 61 42 79 74 65 29  ite3_free(aByte)
9340: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 42 79 74  ;.          aByt
9350: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
9360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
9370: 70 61 42 6c 6f 62 20 3d 20 61 42 79 74 65 3b 0a  paBlob = aByte;.
9380: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
9390: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
93a0: 20 43 6c 6f 73 65 20 74 68 65 20 62 6c 6f 62 20   Close the blob 
93b0: 68 61 6e 64 6c 65 20 61 74 20 70 2d 3e 70 53 65  handle at p->pSe
93c0: 67 6d 65 6e 74 73 2c 20 69 66 20 69 74 20 69 73  gments, if it is
93d0: 20 6f 70 65 6e 2e 20 53 65 65 20 63 6f 6d 6d 65   open. See comme
93e0: 6e 74 73 20 61 62 6f 76 65 0a 2a 2a 20 74 68 65  nts above.** the
93f0: 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
9400: 42 6c 6f 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  Block() function
9410: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
9420: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
9430: 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 46  3SegmentsClose(F
9440: 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
9450: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
9460: 73 65 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29  se(p->pSegments)
9470: 3b 0a 20 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73  ;.  p->pSegments
9480: 20 3d 20 30 3b 0a 7d 0a 20 20 20 20 0a 73 74 61   = 0;.}.    .sta
9490: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
94a0: 65 61 64 65 72 49 6e 63 72 52 65 61 64 28 46 74  eaderIncrRead(Ft
94b0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
94c0: 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 52 65  ader){.  int nRe
94d0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
94e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
94f0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
9500: 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ead */.  int rc;
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9530: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 52  rn code */..  nR
9540: 65 61 64 20 3d 20 4d 49 4e 28 70 52 65 61 64 65  ead = MIN(pReade
9550: 72 2d 3e 6e 4e 6f 64 65 20 2d 20 70 52 65 61 64  r->nNode - pRead
9560: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 2c 20 46  er->nPopulate, F
9570: 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49  TS3_NODE_CHUNKSI
9580: 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ZE);.  rc = sqli
9590: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20  te3_blob_read(. 
95a0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42       pReader->pB
95b0: 6c 6f 62 2c 20 0a 20 20 20 20 20 20 26 70 52 65  lob, .      &pRe
95c0: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
95d0: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c  der->nPopulate],
95e0: 0a 20 20 20 20 20 20 6e 52 65 61 64 2c 0a 20 20  .      nRead,.  
95f0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f      pReader->nPo
9600: 70 75 6c 61 74 65 0a 20 20 29 3b 0a 0a 20 20 69  pulate.  );..  i
9610: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9620: 20 29 7b 0a 20 20 20 20 70 52 65 61 64 65 72 2d   ){.    pReader-
9630: 3e 6e 50 6f 70 75 6c 61 74 65 20 2b 3d 20 6e 52  >nPopulate += nR
9640: 65 61 64 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ead;.    memset(
9650: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
9660: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
9670: 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44  te], 0, FTS3_NOD
9680: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  E_PADDING);.    
9690: 69 66 28 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f  if( pReader->nPo
96a0: 70 75 6c 61 74 65 3d 3d 70 52 65 61 64 65 72 2d  pulate==pReader-
96b0: 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  >nNode ){.      
96c0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
96d0: 73 65 28 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f  se(pReader->pBlo
96e0: 62 29 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65  b);.      pReade
96f0: 72 2d 3e 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20  r->pBlob = 0;.  
9700: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f      pReader->nPo
9710: 70 75 6c 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  pulate = 0;.    
9720: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
9730: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
9740: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65   fts3SegReaderRe
9750: 71 75 69 72 65 28 46 74 73 33 53 65 67 52 65 61  quire(Fts3SegRea
9760: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 20 63 68  der *pReader, ch
9770: 61 72 20 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 6e  ar *pFrom, int n
9780: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Byte){.  int rc 
9790: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
97a0: 73 73 65 72 74 28 20 21 70 52 65 61 64 65 72 2d  ssert( !pReader-
97b0: 3e 70 42 6c 6f 62 20 0a 20 20 20 20 20 20 20 7c  >pBlob .       |
97c0: 7c 20 28 70 46 72 6f 6d 3e 3d 70 52 65 61 64 65  | (pFrom>=pReade
97d0: 72 2d 3e 61 4e 6f 64 65 20 26 26 20 70 46 72 6f  r->aNode && pFro
97e0: 6d 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  m<&pReader->aNod
97f0: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  e[pReader->nNode
9800: 5d 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  ]).  );.  while(
9810: 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20   pReader->pBlob 
9820: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
9830: 20 0a 20 20 20 20 20 26 26 20 20 28 70 46 72 6f   .     &&  (pFro
9840: 6d 20 2d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f  m - pReader->aNo
9850: 64 65 20 2b 20 6e 42 79 74 65 29 3e 70 52 65 61  de + nByte)>pRea
9860: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20  der->nPopulate. 
9870: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
9880: 33 53 65 67 52 65 61 64 65 72 49 6e 63 72 52 65  3SegReaderIncrRe
9890: 61 64 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d  ad(pReader);.  }
98a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
98b0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 6e 20 46 74  ./*.** Set an Ft
98c0: 73 33 53 65 67 52 65 61 64 65 72 20 63 75 72 73  s3SegReader curs
98d0: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 45  or to point at E
98e0: 4f 46 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  OF..*/.static vo
98f0: 69 64 20 66 74 73 33 53 65 67 52 65 61 64 65 72  id fts3SegReader
9900: 53 65 74 45 6f 66 28 46 74 73 33 53 65 67 52 65  SetEof(Fts3SegRe
9910: 61 64 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 69  ader *pSeg){.  i
9920: 66 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65  f( !fts3SegReade
9930: 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 53 65 67  rIsRootOnly(pSeg
9940: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
9950: 5f 66 72 65 65 28 70 53 65 67 2d 3e 61 4e 6f 64  _free(pSeg->aNod
9960: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
9970: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 53 65 67 2d  blob_close(pSeg-
9980: 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 70 53 65  >pBlob);.    pSe
9990: 67 2d 3e 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20  g->pBlob = 0;.  
99a0: 7d 0a 20 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20  }.  pSeg->aNode 
99b0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  = 0;.}../*.** Mo
99c0: 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
99d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
99e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
99f0: 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69 6e  the next term in
9a00: 20 74 68 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e   the.** segment.
9a10: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
9a20: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
9a30: 75 72 6e 65 64 2e 20 49 66 20 74 68 65 72 65 20  urned. If there 
9a40: 69 73 20 6e 6f 20 6e 65 78 74 20 74 65 72 6d 2c  is no next term,
9a50: 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  .** SQLITE_DONE.
9a60: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
9a70: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
9a80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9a90: 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
9aa0: 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  t(.  Fts3Table *
9ab0: 70 2c 20 0a 20 20 46 74 73 33 53 65 67 52 65 61  p, .  Fts3SegRea
9ac0: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 0a 20 20  der *pReader,.  
9ad0: 69 6e 74 20 62 49 6e 63 72 0a 29 7b 0a 20 20 69  int bIncr.){.  i
9ae0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b00: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
9b10: 20 76 61 72 69 6f 75 73 20 73 75 62 2d 72 6f 75   various sub-rou
9b20: 74 69 6e 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  tines */.  char 
9b30: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
9b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
9b50: 72 73 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  rsor variable */
9b60: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9b90: 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20 70 72  bytes in term pr
9ba0: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  efix */.  int nS
9bb0: 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  uffix;          
9bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9bd0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
9be0: 74 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 0a  term suffix */..
9bf0: 20 20 69 66 28 20 21 70 52 65 61 64 65 72 2d 3e    if( !pReader->
9c00: 61 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  aDoclist ){.    
9c10: 70 4e 65 78 74 20 3d 20 70 52 65 61 64 65 72 2d  pNext = pReader-
9c20: 3e 61 4e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  >aNode;.  }else{
9c30: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 26 70 52  .    pNext = &pR
9c40: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b  eader->aDoclist[
9c50: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
9c60: 74 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  t];.  }..  if( !
9c70: 70 4e 65 78 74 20 7c 7c 20 70 4e 65 78 74 3e 3d  pNext || pNext>=
9c80: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
9c90: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20  pReader->nNode] 
9ca0: 29 7b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 33  ){..    if( fts3
9cb0: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
9cc0: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
9cd0: 20 20 20 20 20 46 74 73 33 48 61 73 68 45 6c 65       Fts3HashEle
9ce0: 6d 20 2a 70 45 6c 65 6d 20 3d 20 2a 28 70 52 65  m *pElem = *(pRe
9cf0: 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d  ader->ppNextElem
9d00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6c  );.      if( pEl
9d10: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
9d20: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20   pReader->aNode 
9d30: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
9d40: 7b 0a 20 20 20 20 20 20 20 20 50 65 6e 64 69 6e  {.        Pendin
9d50: 67 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 28  gList *pList = (
9d60: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74  PendingList *)ft
9d70: 73 33 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  s3HashData(pElem
9d80: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  );.        pRead
9d90: 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61  er->zTerm = (cha
9da0: 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65 79 28  r *)fts3HashKey(
9db0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  pElem);.        
9dc0: 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d  pReader->nTerm =
9dd0: 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65   fts3HashKeysize
9de0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20  (pElem);.       
9df0: 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20   pReader->nNode 
9e00: 3d 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c  = pReader->nDocl
9e10: 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 6e 44 61  ist = pList->nDa
9e20: 74 61 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  ta + 1;.        
9e30: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d  pReader->aNode =
9e40: 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69   pReader->aDocli
9e50: 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 44 61 74  st = pList->aDat
9e60: 61 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  a;.        pRead
9e70: 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 2b 2b  er->ppNextElem++
9e80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9e90: 28 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65  ( pReader->aNode
9ea0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ec0: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  OK;.    }..    f
9ed0: 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74 45  ts3SegReaderSetE
9ee0: 6f 66 28 70 52 65 61 64 65 72 29 3b 0a 0a 20 20  of(pReader);..  
9ef0: 20 20 2f 2a 20 49 66 20 69 43 75 72 72 65 6e 74    /* If iCurrent
9f00: 42 6c 6f 63 6b 3e 3d 69 4c 65 61 66 45 6e 64 42  Block>=iLeafEndB
9f10: 6c 6f 63 6b 2c 20 74 68 69 73 20 69 73 20 61 6e  lock, this is an
9f20: 20 45 4f 46 20 63 6f 6e 64 69 74 69 6f 6e 2e 20   EOF condition. 
9f30: 41 6c 6c 20 6c 65 61 66 20 0a 20 20 20 20 2a 2a  All leaf .    **
9f40: 20 62 6c 6f 63 6b 73 20 68 61 76 65 20 61 6c 72   blocks have alr
9f50: 65 61 64 79 20 62 65 65 6e 20 74 72 61 76 65 72  eady been traver
9f60: 73 65 64 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  sed.  */.    ass
9f70: 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e 69 43  ert( pReader->iC
9f80: 75 72 72 65 6e 74 42 6c 6f 63 6b 3c 3d 70 52 65  urrentBlock<=pRe
9f90: 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c  ader->iLeafEndBl
9fa0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
9fb0: 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74  Reader->iCurrent
9fc0: 42 6c 6f 63 6b 3e 3d 70 52 65 61 64 65 72 2d 3e  Block>=pReader->
9fd0: 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 29 7b  iLeafEndBlock ){
9fe0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9ff0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
a000: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a010: 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 0a 20  Fts3ReadBlock(. 
a020: 20 20 20 20 20 20 20 70 2c 20 2b 2b 70 52 65 61         p, ++pRea
a030: 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f  der->iCurrentBlo
a040: 63 6b 2c 20 26 70 52 65 61 64 65 72 2d 3e 61 4e  ck, &pReader->aN
a050: 6f 64 65 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e  ode, &pReader->n
a060: 4e 6f 64 65 2c 20 0a 20 20 20 20 20 20 20 20 28  Node, .        (
a070: 62 49 6e 63 72 20 3f 20 26 70 52 65 61 64 65 72  bIncr ? &pReader
a080: 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3a 20 30 29  ->nPopulate : 0)
a090: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
a0a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a0b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
a0c0: 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e  ssert( pReader->
a0d0: 70 42 6c 6f 62 3d 3d 30 20 29 3b 0a 20 20 20 20  pBlob==0 );.    
a0e0: 69 66 28 20 62 49 6e 63 72 20 26 26 20 70 52 65  if( bIncr && pRe
a0f0: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3c  ader->nPopulate<
a100: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29  pReader->nNode )
a110: 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d  {.      pReader-
a120: 3e 70 42 6c 6f 62 20 3d 20 70 2d 3e 70 53 65 67  >pBlob = p->pSeg
a130: 6d 65 6e 74 73 3b 0a 20 20 20 20 20 20 70 2d 3e  ments;.      p->
a140: 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 20  pSegments = 0;. 
a150: 20 20 20 7d 0a 20 20 20 20 70 4e 65 78 74 20 3d     }.    pNext =
a160: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b   pReader->aNode;
a170: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
a180: 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73  !fts3SegReaderIs
a190: 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29  Pending(pReader)
a1a0: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33   );..  rc = fts3
a1b0: 53 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65  SegReaderRequire
a1c0: 28 70 52 65 61 64 65 72 2c 20 70 4e 65 78 74 2c  (pReader, pNext,
a1d0: 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
a1e0: 2a 32 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  *2);.  if( rc!=S
a1f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
a200: 6e 20 72 63 3b 0a 20 20 0a 20 20 2f 2a 20 42 65  n rc;.  .  /* Be
a210: 63 61 75 73 65 20 6f 66 20 74 68 65 20 46 54 53  cause of the FTS
a220: 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 20 62  3_NODE_PADDING b
a230: 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 2c  ytes of padding,
a240: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
a250: 73 20 0a 20 20 2a 2a 20 73 61 66 65 20 28 6e 6f  s .  ** safe (no
a260: 20 72 69 73 6b 20 6f 66 20 6f 76 65 72 72 65 61   risk of overrea
a270: 64 29 20 65 76 65 6e 20 69 66 20 74 68 65 20 6e  d) even if the n
a280: 6f 64 65 20 64 61 74 61 20 69 73 20 63 6f 72 72  ode data is corr
a290: 75 70 74 65 64 2e 20 2a 2f 0a 20 20 70 4e 65 78  upted. */.  pNex
a2a0: 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  t += sqlite3Fts3
a2b0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78  GetVarint32(pNex
a2c0: 74 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20  t, &nPrefix);.  
a2d0: 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65 33  pNext += sqlite3
a2e0: 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  Fts3GetVarint32(
a2f0: 70 4e 65 78 74 2c 20 26 6e 53 75 66 66 69 78 29  pNext, &nSuffix)
a300: 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 3c  ;.  if( nPrefix<
a310: 30 20 7c 7c 20 6e 53 75 66 66 69 78 3c 3d 30 20  0 || nSuffix<=0 
a320: 0a 20 20 20 7c 7c 20 26 70 4e 65 78 74 5b 6e 53  .   || &pNext[nS
a330: 75 66 66 69 78 5d 3e 26 70 52 65 61 64 65 72 2d  uffix]>&pReader-
a340: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
a350: 6e 4e 6f 64 65 5d 20 0a 20 20 29 7b 0a 20 20 20  nNode] .  ){.   
a360: 20 72 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52   return FTS_CORR
a370: 55 50 54 5f 56 54 41 42 3b 0a 20 20 7d 0a 0a 20  UPT_VTAB;.  }.. 
a380: 20 69 66 28 20 6e 50 72 65 66 69 78 2b 6e 53 75   if( nPrefix+nSu
a390: 66 66 69 78 3e 70 52 65 61 64 65 72 2d 3e 6e 54  ffix>pReader->nT
a3a0: 65 72 6d 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ermAlloc ){.    
a3b0: 69 6e 74 20 6e 4e 65 77 20 3d 20 28 6e 50 72 65  int nNew = (nPre
a3c0: 66 69 78 2b 6e 53 75 66 66 69 78 29 2a 32 3b 0a  fix+nSuffix)*2;.
a3d0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d      char *zNew =
a3e0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
a3f0: 28 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 2c  (pReader->zTerm,
a400: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   nNew);.    if( 
a410: 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !zNew ){.      r
a420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a430: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  EM;.    }.    pR
a440: 65 61 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a  eader->zTerm = z
a450: 4e 65 77 3b 0a 20 20 20 20 70 52 65 61 64 65 72  New;.    pReader
a460: 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e  ->nTermAlloc = n
a470: 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  New;.  }..  rc =
a480: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65   fts3SegReaderRe
a490: 71 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70  quire(pReader, p
a4a0: 4e 65 78 74 2c 20 6e 53 75 66 66 69 78 2b 46 54  Next, nSuffix+FT
a4b0: 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a  S3_VARINT_MAX);.
a4c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a4d0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
a4e0: 0a 0a 20 20 6d 65 6d 63 70 79 28 26 70 52 65 61  ..  memcpy(&pRea
a4f0: 64 65 72 2d 3e 7a 54 65 72 6d 5b 6e 50 72 65 66  der->zTerm[nPref
a500: 69 78 5d 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66  ix], pNext, nSuf
a510: 66 69 78 29 3b 0a 20 20 70 52 65 61 64 65 72 2d  fix);.  pReader-
a520: 3e 6e 54 65 72 6d 20 3d 20 6e 50 72 65 66 69 78  >nTerm = nPrefix
a530: 2b 6e 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78  +nSuffix;.  pNex
a540: 74 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20  t += nSuffix;.  
a550: 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65 33  pNext += sqlite3
a560: 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  Fts3GetVarint32(
a570: 70 4e 65 78 74 2c 20 26 70 52 65 61 64 65 72 2d  pNext, &pReader-
a580: 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70 52  >nDoclist);.  pR
a590: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20  eader->aDoclist 
a5a0: 3d 20 70 4e 65 78 74 3b 0a 20 20 70 52 65 61 64  = pNext;.  pRead
a5b0: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
a5c0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  = 0;..  /* Check
a5d0: 20 74 68 61 74 20 74 68 65 20 64 6f 63 6c 69 73   that the doclis
a5e0: 74 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  t does not appea
a5f0: 72 20 74 6f 20 65 78 74 65 6e 64 20 70 61 73 74  r to extend past
a600: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
a610: 20 20 2a 2a 20 62 2d 74 72 65 65 20 6e 6f 64 65    ** b-tree node
a620: 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 66  . And that the f
a630: 69 6e 61 6c 20 62 79 74 65 20 6f 66 20 74 68 65  inal byte of the
a640: 20 64 6f 63 6c 69 73 74 20 69 73 20 30 78 30 30   doclist is 0x00
a650: 2e 20 49 66 20 65 69 74 68 65 72 20 0a 20 20 2a  . If either .  *
a660: 2a 20 6f 66 20 74 68 65 73 65 20 73 74 61 74 65  * of these state
a670: 6d 65 6e 74 73 20 69 73 20 75 6e 74 72 75 65 2c  ments is untrue,
a680: 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 73   then the data s
a690: 74 72 75 63 74 75 72 65 20 69 73 20 63 6f 72 72  tructure is corr
a6a0: 75 70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  upt..  */.  if( 
a6b0: 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69  &pReader->aDocli
a6c0: 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63  st[pReader->nDoc
a6d0: 6c 69 73 74 5d 3e 26 70 52 65 61 64 65 72 2d 3e  list]>&pReader->
a6e0: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
a6f0: 4e 6f 64 65 5d 20 0a 20 20 20 7c 7c 20 28 70 52  Node] .   || (pR
a700: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
a710: 3d 3d 30 20 26 26 20 70 52 65 61 64 65 72 2d 3e  ==0 && pReader->
a720: 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72  aDoclist[pReader
a730: 2d 3e 6e 44 6f 63 6c 69 73 74 2d 31 5d 29 0a 20  ->nDoclist-1]). 
a740: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46   ){.    return F
a750: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
a760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
a770: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a780: 2a 20 53 65 74 20 74 68 65 20 53 65 67 52 65 61  * Set the SegRea
a790: 64 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  der to point to 
a7a0: 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64 20  the first docid 
a7b0: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 61  in the doclist a
a7c0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
a7d0: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  h the current te
a7e0: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rm..*/.static in
a7f0: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 46  t fts3SegReaderF
a800: 69 72 73 74 44 6f 63 69 64 28 46 74 73 33 54 61  irstDocid(Fts3Ta
a810: 62 6c 65 20 2a 70 54 61 62 2c 20 46 74 73 33 53  ble *pTab, Fts3S
a820: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
a830: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
a840: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
a850: 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61 44 6f  rt( pReader->aDo
a860: 63 6c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72  clist );.  asser
a870: 74 28 20 21 70 52 65 61 64 65 72 2d 3e 70 4f 66  t( !pReader->pOf
a880: 66 73 65 74 4c 69 73 74 20 29 3b 0a 20 20 69 66  fsetList );.  if
a890: 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78  ( pTab->bDescIdx
a8a0: 20 26 26 20 66 74 73 33 53 65 67 52 65 61 64 65   && fts3SegReade
a8b0: 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64  rIsPending(pRead
a8c0: 65 72 29 20 29 7b 0a 20 20 20 20 75 38 20 62 45  er) ){.    u8 bE
a8d0: 6f 66 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61  of = 0;.    pRea
a8e0: 64 65 72 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b  der->iDocid = 0;
a8f0: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4f  .    pReader->nO
a900: 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20  ffsetList = 0;. 
a910: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f     sqlite3Fts3Do
a920: 63 6c 69 73 74 50 72 65 76 28 30 2c 0a 20 20 20  clistPrev(0,.   
a930: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 44       pReader->aD
a940: 6f 63 6c 69 73 74 2c 20 70 52 65 61 64 65 72 2d  oclist, pReader-
a950: 3e 6e 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61  >nDoclist, &pRea
a960: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
a970: 2c 20 0a 20 20 20 20 20 20 20 20 26 70 52 65 61  , .        &pRea
a980: 64 65 72 2d 3e 69 44 6f 63 69 64 2c 20 26 70 52  der->iDocid, &pR
a990: 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69  eader->nOffsetLi
a9a0: 73 74 2c 20 26 62 45 6f 66 0a 20 20 20 20 29 3b  st, &bEof.    );
a9b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
a9c0: 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
a9d0: 52 65 71 75 69 72 65 28 70 52 65 61 64 65 72 2c  Require(pReader,
a9e0: 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69   pReader->aDocli
a9f0: 73 74 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  st, FTS3_VARINT_
aa00: 4d 41 58 29 3b 0a 20 20 20 20 69 66 28 20 72 63  MAX);.    if( rc
aa10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
aa20: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
aa30: 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
aa40: 74 28 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c  t(pReader->aDocl
aa50: 69 73 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 69  ist, &pReader->i
aa60: 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 70 52  Docid);.      pR
aa70: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
aa80: 73 74 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61  st = &pReader->a
aa90: 44 6f 63 6c 69 73 74 5b 6e 5d 3b 0a 20 20 20 20  Doclist[n];.    
aaa0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
aab0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  c;.}../*.** Adva
aac0: 6e 63 65 20 74 68 65 20 53 65 67 52 65 61 64 65  nce the SegReade
aad0: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
aae0: 65 20 6e 65 78 74 20 64 6f 63 69 64 20 69 6e 20  e next docid in 
aaf0: 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 61  the doclist.** a
ab00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
ab10: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e  he current term.
ab20: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 61 72 67 75 6d  .** .** If argum
ab30: 65 6e 74 73 20 70 70 4f 66 66 73 65 74 4c 69 73  ents ppOffsetLis
ab40: 74 20 61 6e 64 20 70 6e 4f 66 66 73 65 74 4c 69  t and pnOffsetLi
ab50: 73 74 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c  st are not NULL,
ab60: 20 74 68 65 6e 20 0a 2a 2a 20 2a 70 70 4f 66 66   then .** *ppOff
ab70: 73 65 74 4c 69 73 74 20 69 73 20 73 65 74 20 74  setList is set t
ab80: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
ab90: 69 72 73 74 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73  irst column-offs
aba0: 65 74 20 6c 69 73 74 0a 2a 2a 20 69 6e 20 74 68  et list.** in th
abb0: 65 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79 20  e doclist entry 
abc0: 28 69 2e 65 2e 20 69 6d 6d 65 64 69 61 74 65 6c  (i.e. immediatel
abd0: 79 20 70 61 73 74 20 74 68 65 20 64 6f 63 69 64  y past the docid
abe0: 20 76 61 72 69 6e 74 29 2e 0a 2a 2a 20 2a 70 6e   varint)..** *pn
abf0: 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20 73 65  OffsetList is se
ac00: 74 20 74 6f 20 74 68 65 20 6c 65 6e 67 74 68 20  t to the length 
ac10: 6f 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  of the set of co
ac20: 6c 75 6d 6e 2d 6f 66 66 73 65 74 0a 2a 2a 20 6c  lumn-offset.** l
ac30: 69 73 74 73 2c 20 6e 6f 74 20 69 6e 63 6c 75 64  ists, not includ
ac40: 69 6e 67 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ing the nul-term
ac50: 69 6e 61 74 6f 72 20 62 79 74 65 2e 20 46 6f 72  inator byte. For
ac60: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2f 0a 73 74 61   example:.*/.sta
ac70: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
ac80: 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 0a  eaderNextDocid(.
ac90: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61    Fts3Table *pTa
aca0: 62 2c 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  b,.  Fts3SegRead
acb0: 65 72 20 2a 70 52 65 61 64 65 72 2c 20 20 20 20  er *pReader,    
acc0: 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20 74       /* Reader t
acd0: 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78  o advance to nex
ace0: 74 20 64 6f 63 69 64 20 2a 2f 0a 20 20 63 68 61  t docid */.  cha
acf0: 72 20 2a 2a 70 70 4f 66 66 73 65 74 4c 69 73 74  r **ppOffsetList
ad00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ad10: 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
ad20: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
ad30: 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  -list */.  int *
ad40: 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 20 20 20  pnOffsetList    
ad50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
ad60: 54 3a 20 4c 65 6e 67 74 68 20 6f 66 20 2a 70 70  T: Length of *pp
ad70: 4f 66 66 73 65 74 4c 69 73 74 20 69 6e 20 62 79  OffsetList in by
ad80: 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
ad90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ada0: 20 20 63 68 61 72 20 2a 70 20 3d 20 70 52 65 61    char *p = pRea
adb0: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
adc0: 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a  ;.  char c = 0;.
add0: 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
ade0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65  .  if( pTab->bDe
adf0: 73 63 49 64 78 20 26 26 20 66 74 73 33 53 65 67  scIdx && fts3Seg
ae00: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
ae10: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
ae20: 2f 2a 20 41 20 70 65 6e 64 69 6e 67 2d 74 65 72  /* A pending-ter
ae30: 6d 73 20 73 65 67 2d 72 65 61 64 65 72 20 66 6f  ms seg-reader fo
ae40: 72 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65 20  r an FTS4 table 
ae50: 74 68 61 74 20 75 73 65 73 20 6f 72 64 65 72 3d  that uses order=
ae60: 64 65 73 63 2e 0a 20 20 20 20 2a 2a 20 50 65 6e  desc..    ** Pen
ae70: 64 69 6e 67 2d 74 65 72 6d 73 20 64 6f 63 6c 69  ding-terms docli
ae80: 73 74 73 20 61 72 65 20 61 6c 77 61 79 73 20 62  sts are always b
ae90: 75 69 6c 74 20 75 70 20 69 6e 20 61 73 63 65 6e  uilt up in ascen
aea0: 64 69 6e 67 20 6f 72 64 65 72 2c 20 73 6f 0a 20  ding order, so. 
aeb0: 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f     ** we have to
aec0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
aed0: 20 74 68 65 6d 20 62 61 63 6b 77 61 72 64 73 20   them backwards 
aee0: 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 75 38 20  here. */.    u8 
aef0: 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 69 66  bEof = 0;.    if
af00: 28 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20 29  ( ppOffsetList )
af10: 7b 0a 20 20 20 20 20 20 2a 70 70 4f 66 66 73 65  {.      *ppOffse
af20: 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72 2d  tList = pReader-
af30: 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20  >pOffsetList;.  
af40: 20 20 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73      *pnOffsetLis
af50: 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 6e 4f 66  t = pReader->nOf
af60: 66 73 65 74 4c 69 73 74 20 2d 20 31 3b 0a 20 20  fsetList - 1;.  
af70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
af80: 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 30  ts3DoclistPrev(0
af90: 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ,.        pReade
afa0: 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52 65  r->aDoclist, pRe
afb0: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20  ader->nDoclist, 
afc0: 26 70 2c 20 26 70 52 65 61 64 65 72 2d 3e 69 44  &p, &pReader->iD
afd0: 6f 63 69 64 2c 0a 20 20 20 20 20 20 20 20 26 70  ocid,.        &p
afe0: 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c  Reader->nOffsetL
aff0: 69 73 74 2c 20 26 62 45 6f 66 0a 20 20 20 20 29  ist, &bEof.    )
b000: 3b 0a 20 20 20 20 69 66 28 20 62 45 6f 66 20 29  ;.    if( bEof )
b010: 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d  {.      pReader-
b020: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30  >pOffsetList = 0
b030: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b040: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66     pReader->pOff
b050: 73 65 74 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20  setList = p;.   
b060: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b070: 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 52  char *pEnd = &pR
b080: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b  eader->aDoclist[
b090: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
b0a0: 74 5d 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 69 6e  t];..    /* Poin
b0b0: 74 65 72 20 70 20 63 75 72 72 65 6e 74 6c 79 20  ter p currently 
b0c0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 66 69  points at the fi
b0d0: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6e 20 6f  rst byte of an o
b0e0: 66 66 73 65 74 20 6c 69 73 74 2e 20 54 68 65 0a  ffset list. The.
b0f0: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
b100: 20 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73 20   block advances 
b110: 69 74 20 74 6f 20 70 6f 69 6e 74 20 6f 6e 65 20  it to point one 
b120: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
b130: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  d of.    ** the 
b140: 73 61 6d 65 20 6f 66 66 73 65 74 20 6c 69 73 74  same offset list
b150: 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  . */.    while( 
b160: 31 20 29 7b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  1 ){.  .      /*
b170: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
b180: 69 6e 65 20 6f 66 20 63 6f 64 65 20 28 61 6e 64  ine of code (and
b190: 20 74 68 65 20 22 70 2b 2b 22 20 62 65 6c 6f 77   the "p++" below
b1a0: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
b1b0: 70 29 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e  p) is.      ** n
b1c0: 6f 72 6d 61 6c 6c 79 20 61 6c 6c 20 74 68 61 74  ormally all that
b1d0: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
b1e0: 6d 6f 76 65 20 70 6f 69 6e 74 65 72 20 70 20 74  move pointer p t
b1f0: 6f 20 74 68 65 20 64 65 73 69 72 65 64 20 0a 20  o the desired . 
b200: 20 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e       ** position
b210: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
b220: 69 73 20 69 66 20 74 68 69 73 20 6e 6f 64 65 20  is if this node 
b230: 69 73 20 62 65 69 6e 67 20 6c 6f 61 64 65 64 20  is being loaded 
b240: 66 72 6f 6d 20 64 69 73 6b 0a 20 20 20 20 20 20  from disk.      
b250: 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79  ** incrementally
b260: 20 61 6e 64 20 70 6f 69 6e 74 65 72 20 22 70 22   and pointer "p"
b270: 20 6e 6f 77 20 70 6f 69 6e 74 73 20 74 6f 20 74   now points to t
b280: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
b290: 73 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 68  ssed.      ** th
b2a0: 65 20 70 6f 70 75 6c 61 74 65 64 20 70 61 72 74  e populated part
b2b0: 20 6f 66 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f   of pReader->aNo
b2c0: 64 65 5b 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  de[]..      */. 
b2d0: 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 20 7c       while( *p |
b2e0: 20 63 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20   c ) c = *p++ & 
b2f0: 30 78 38 30 3b 0a 20 20 20 20 20 20 61 73 73 65  0x80;.      asse
b300: 72 74 28 20 2a 70 3d 3d 30 20 29 3b 0a 20 20 0a  rt( *p==0 );.  .
b310: 20 20 20 20 20 20 69 66 28 20 70 52 65 61 64 65        if( pReade
b320: 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 7c 7c 20 70  r->pBlob==0 || p
b330: 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65  <&pReader->aNode
b340: 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c  [pReader->nPopul
b350: 61 74 65 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  ate] ) break;.  
b360: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
b370: 52 65 61 64 65 72 49 6e 63 72 52 65 61 64 28 70  ReaderIncrRead(p
b380: 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69  Reader);.      i
b390: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b3a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b3b0: 20 20 7d 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 0a    }.    p++;.  .
b3c0: 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
b3d0: 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
b3e0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
b3f0: 73 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72  s with a pointer
b400: 20 74 6f 20 61 6e 64 20 74 68 65 0a 20 20 20 20   to and the.    
b410: 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  ** size of the p
b420: 72 65 76 69 6f 75 73 20 6f 66 66 73 65 74 2d 6c  revious offset-l
b430: 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ist..    */.    
b440: 69 66 28 20 70 70 4f 66 66 73 65 74 4c 69 73 74  if( ppOffsetList
b450: 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 66 66   ){.      *ppOff
b460: 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65  setList = pReade
b470: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a  r->pOffsetList;.
b480: 20 20 20 20 20 20 2a 70 6e 4f 66 66 73 65 74 4c        *pnOffsetL
b490: 69 73 74 20 3d 20 28 69 6e 74 29 28 70 20 2d 20  ist = (int)(p - 
b4a0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
b4b0: 4c 69 73 74 20 2d 20 31 29 3b 0a 20 20 20 20 7d  List - 1);.    }
b4c0: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 3c 70  ..    while( p<p
b4d0: 45 6e 64 20 26 26 20 2a 70 3d 3d 30 20 29 20 70  End && *p==0 ) p
b4e0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  ++;.  .    /* If
b4f0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
b500: 72 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  re entries in th
b510: 65 20 64 6f 63 6c 69 73 74 2c 20 73 65 74 20 70  e doclist, set p
b520: 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 0a 20 20  OffsetList to.  
b530: 20 20 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68 65 72    ** NULL. Other
b540: 77 69 73 65 2c 20 73 65 74 20 46 74 73 33 53 65  wise, set Fts3Se
b550: 67 52 65 61 64 65 72 2e 69 44 6f 63 69 64 20 74  gReader.iDocid t
b560: 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64  o the next docid
b570: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 46 74 73 33   and.    ** Fts3
b580: 53 65 67 52 65 61 64 65 72 2e 70 4f 66 66 73 65  SegReader.pOffse
b590: 74 4c 69 73 74 20 74 6f 20 70 6f 69 6e 74 20 74  tList to point t
b5a0: 6f 20 74 68 65 20 6e 65 78 74 20 6f 66 66 73 65  o the next offse
b5b0: 74 20 6c 69 73 74 20 62 65 66 6f 72 65 0a 20 20  t list before.  
b5c0: 20 20 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a    ** returning..
b5d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b5e0: 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  >=pEnd ){.      
b5f0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
b600: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  List = 0;.    }e
b610: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
b620: 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71  fts3SegReaderReq
b630: 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 2c  uire(pReader, p,
b640: 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
b650: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
b660: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
b680: 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  t64 iDelta;.    
b690: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66      pReader->pOf
b6a0: 66 73 65 74 4c 69 73 74 20 3d 20 70 20 2b 20 73  fsetList = p + s
b6b0: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
b6c0: 69 6e 74 28 70 2c 20 26 69 44 65 6c 74 61 29 3b  int(p, &iDelta);
b6d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
b6e0: 62 2d 3e 62 44 65 73 63 49 64 78 20 29 7b 0a 20  b->bDescIdx ){. 
b6f0: 20 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72           pReader
b700: 2d 3e 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c  ->iDocid -= iDel
b710: 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ta;.        }els
b720: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  e{.          pRe
b730: 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2b 3d 20  ader->iDocid += 
b740: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
b750: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b760: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
b770: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69 6e 74  LITE_OK;.}...int
b780: 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 4f   sqlite3Fts3MsrO
b790: 76 66 6c 28 0a 20 20 46 74 73 33 43 75 72 73 6f  vfl(.  Fts3Curso
b7a0: 72 20 2a 70 43 73 72 2c 20 0a 20 20 46 74 73 33  r *pCsr, .  Fts3
b7b0: 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
b7c0: 70 4d 73 72 2c 0a 20 20 69 6e 74 20 2a 70 6e 4f  pMsr,.  int *pnO
b7d0: 76 66 6c 0a 29 7b 0a 20 20 46 74 73 33 54 61 62  vfl.){.  Fts3Tab
b7e0: 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62  le *p = (Fts3Tab
b7f0: 6c 65 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70  le*)pCsr->base.p
b800: 56 74 61 62 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  Vtab;.  int nOvf
b810: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b  l = 0;.  int ii;
b820: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b830: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 70 67 73  TE_OK;.  int pgs
b840: 7a 20 3d 20 70 2d 3e 6e 50 67 73 7a 3b 0a 0a 20  z = p->nPgsz;.. 
b850: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 48 61 73   assert( p->bHas
b860: 53 74 61 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Stat );.  assert
b870: 28 20 70 67 73 7a 3e 30 20 29 3b 0a 0a 20 20 66  ( pgsz>0 );..  f
b880: 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
b890: 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 4d 73  ITE_OK && ii<pMs
b8a0: 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 69 2b  r->nSegment; ii+
b8b0: 2b 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52  +){.    Fts3SegR
b8c0: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 20 3d  eader *pReader =
b8d0: 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pMsr->apSegment
b8e0: 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 21 66  [ii];.    if( !f
b8f0: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
b900: 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 0a  nding(pReader) .
b910: 20 20 20 20 20 26 26 20 21 66 74 73 33 53 65 67       && !fts3Seg
b920: 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79  ReaderIsRootOnly
b930: 28 70 52 65 61 64 65 72 29 20 0a 20 20 20 20 29  (pReader) .    )
b940: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b950: 69 6e 74 36 34 20 6a 6a 3b 0a 20 20 20 20 20 20  int64 jj;.      
b960: 66 6f 72 28 6a 6a 3d 70 52 65 61 64 65 72 2d 3e  for(jj=pReader->
b970: 69 53 74 61 72 74 42 6c 6f 63 6b 3b 20 6a 6a 3c  iStartBlock; jj<
b980: 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45  =pReader->iLeafE
b990: 6e 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b 29 7b 0a  ndBlock; jj++){.
b9a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
b9b0: 62 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  b;.        rc = 
b9c0: 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42  sqlite3Fts3ReadB
b9d0: 6c 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30 2c 20 26  lock(p, jj, 0, &
b9e0: 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20 20 20 20  nBlob, 0);.     
b9f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ba00: 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
ba10: 20 20 20 20 20 20 69 66 28 20 28 6e 42 6c 6f 62        if( (nBlob
ba20: 2b 33 35 29 3e 70 67 73 7a 20 29 7b 0a 20 20 20  +35)>pgsz ){.   
ba30: 20 20 20 20 20 20 20 6e 4f 76 66 6c 20 2b 3d 20         nOvfl += 
ba40: 28 6e 42 6c 6f 62 20 2b 20 33 34 29 2f 70 67 73  (nBlob + 34)/pgs
ba50: 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  z;.        }.   
ba60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ba70: 20 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f 76 66 6c   *pnOvfl = nOvfl
ba80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ba90: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
baa0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
bab0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
bac0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
bad0: 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f   as the .** seco
bae0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
baf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
bb00: 53 65 67 52 65 61 64 65 72 46 72 65 65 28 46 74  SegReaderFree(Ft
bb10: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
bb20: 61 64 65 72 29 7b 0a 20 20 69 66 28 20 70 52 65  ader){.  if( pRe
bb30: 61 64 65 72 20 26 26 20 21 66 74 73 33 53 65 67  ader && !fts3Seg
bb40: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
bb50: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
bb60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65  sqlite3_free(pRe
bb70: 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20  ader->zTerm);.  
bb80: 20 20 69 66 28 20 21 66 74 73 33 53 65 67 52 65    if( !fts3SegRe
bb90: 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70  aderIsRootOnly(p
bba0: 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20  Reader) ){.     
bbb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
bbc0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20  eader->aNode);. 
bbd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f       sqlite3_blo
bbe0: 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 2d  b_close(pReader-
bbf0: 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 7d 0a 20  >pBlob);.    }. 
bc00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
bc10: 65 28 70 52 65 61 64 65 72 29 3b 0a 7d 0a 0a 2f  e(pReader);.}../
bc20: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
bc30: 6e 65 77 20 53 65 67 52 65 61 64 65 72 20 6f 62  new SegReader ob
bc40: 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ject..*/.int sql
bc50: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
bc60: 72 4e 65 77 28 0a 20 20 69 6e 74 20 69 41 67 65  rNew(.  int iAge
bc70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bc80: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
bc90: 6e 74 20 22 61 67 65 22 2e 20 2a 2f 0a 20 20 69  nt "age". */.  i
bca0: 6e 74 20 62 4c 6f 6f 6b 75 70 2c 20 20 20 20 20  nt bLookup,     
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bcc0: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 6c 6f 6f  * True for a loo
bcd0: 6b 75 70 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71  kup only */.  sq
bce0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61  lite3_int64 iSta
bcf0: 72 74 4c 65 61 66 2c 20 20 20 20 20 20 20 2f 2a  rtLeaf,       /*
bd00: 20 46 69 72 73 74 20 6c 65 61 66 20 74 6f 20 74   First leaf to t
bd10: 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c  raverse */.  sql
bd20: 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 4c  ite3_int64 iEndL
bd30: 65 61 66 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  eaf,         /* 
bd40: 46 69 6e 61 6c 20 6c 65 61 66 20 74 6f 20 74 72  Final leaf to tr
bd50: 61 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69  averse */.  sqli
bd60: 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c  te3_int64 iEndBl
bd70: 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  ock,        /* F
bd80: 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f 66 20 73 65  inal block of se
bd90: 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  gment */.  const
bda0: 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20   char *zRoot,   
bdb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
bdc0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
bdd0: 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  root node */.  i
bde0: 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 20 20 20  nt nRoot,       
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be00: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
be10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74   containing root
be20: 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 53   node */.  Fts3S
be30: 65 67 52 65 61 64 65 72 20 2a 2a 70 70 52 65 61  egReader **ppRea
be40: 64 65 72 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  der        /* OU
be50: 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20 46 74 73  T: Allocated Fts
be60: 33 53 65 67 52 65 61 64 65 72 20 2a 2f 0a 29 7b  3SegReader */.){
be70: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
be80: 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20 20 20   *pReader;      
be90: 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
bea0: 63 61 74 65 64 20 53 65 67 52 65 61 64 65 72 20  cated SegReader 
beb0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
bec0: 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  nExtra = 0;     
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
bee0: 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
bef0: 20 73 65 67 6d 65 6e 74 20 72 6f 6f 74 20 6e 6f   segment root no
bf00: 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
bf10: 20 69 53 74 61 72 74 4c 65 61 66 3c 3d 69 45 6e   iStartLeaf<=iEn
bf20: 64 4c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 69  dLeaf );.  if( i
bf30: 53 74 61 72 74 4c 65 61 66 3d 3d 30 20 29 7b 0a  StartLeaf==0 ){.
bf40: 20 20 20 20 6e 45 78 74 72 61 20 3d 20 6e 52 6f      nExtra = nRo
bf50: 6f 74 20 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50  ot + FTS3_NODE_P
bf60: 41 44 44 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 70  ADDING;.  }..  p
bf70: 52 65 61 64 65 72 20 3d 20 28 46 74 73 33 53 65  Reader = (Fts3Se
bf80: 67 52 65 61 64 65 72 20 2a 29 73 71 6c 69 74 65  gReader *)sqlite
bf90: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
bfa0: 46 74 73 33 53 65 67 52 65 61 64 65 72 29 20 2b  Fts3SegReader) +
bfb0: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
bfc0: 21 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  !pReader ){.    
bfd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bfe0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
bff0: 74 28 70 52 65 61 64 65 72 2c 20 30 2c 20 73 69  t(pReader, 0, si
c000: 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64  zeof(Fts3SegRead
c010: 65 72 29 29 3b 0a 20 20 70 52 65 61 64 65 72 2d  er));.  pReader-
c020: 3e 69 49 64 78 20 3d 20 69 41 67 65 3b 0a 20 20  >iIdx = iAge;.  
c030: 70 52 65 61 64 65 72 2d 3e 62 4c 6f 6f 6b 75 70  pReader->bLookup
c040: 20 3d 20 62 4c 6f 6f 6b 75 70 3b 0a 20 20 70 52   = bLookup;.  pR
c050: 65 61 64 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f  eader->iStartBlo
c060: 63 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66 3b  ck = iStartLeaf;
c070: 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 4c 65 61  .  pReader->iLea
c080: 66 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e 64  fEndBlock = iEnd
c090: 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65 72 2d  Leaf;.  pReader-
c0a0: 3e 69 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e  >iEndBlock = iEn
c0b0: 64 42 6c 6f 63 6b 3b 0a 0a 20 20 69 66 28 20 6e  dBlock;..  if( n
c0c0: 45 78 74 72 61 20 29 7b 0a 20 20 20 20 2f 2a 20  Extra ){.    /* 
c0d0: 54 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65  The entire segme
c0e0: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
c0f0: 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a  the root node. *
c100: 2f 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61  /.    pReader->a
c110: 4e 6f 64 65 20 3d 20 28 63 68 61 72 20 2a 29 26  Node = (char *)&
c120: 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20  pReader[1];.    
c130: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d  pReader->nNode =
c140: 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 6d 65 6d 63   nRoot;.    memc
c150: 70 79 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  py(pReader->aNod
c160: 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29  e, zRoot, nRoot)
c170: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 52  ;.    memset(&pR
c180: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 6e 52 6f  eader->aNode[nRo
c190: 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44  ot], 0, FTS3_NOD
c1a0: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 65  E_PADDING);.  }e
c1b0: 6c 73 65 7b 0a 20 20 20 20 70 52 65 61 64 65 72  lse{.    pReader
c1c0: 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 20  ->iCurrentBlock 
c1d0: 3d 20 69 53 74 61 72 74 4c 65 61 66 2d 31 3b 0a  = iStartLeaf-1;.
c1e0: 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72 20    }.  *ppReader 
c1f0: 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65 74  = pReader;.  ret
c200: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c210: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
c220: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  a comparison fun
c230: 63 74 69 6f 6e 20 75 73 65 64 20 61 73 20 61 20  ction used as a 
c240: 71 73 6f 72 74 28 29 20 63 61 6c 6c 62 61 63 6b  qsort() callback
c250: 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 0a 2a 2a   when sorting.**
c260: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 65 6e   an array of pen
c270: 64 69 6e 67 20 74 65 72 6d 73 20 62 79 20 74 65  ding terms by te
c280: 72 6d 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  rm. This occurs 
c290: 61 73 20 70 61 72 74 20 6f 66 20 66 6c 75 73 68  as part of flush
c2a0: 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
c2b0: 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69  nts of the pendi
c2c0: 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61  ng-terms hash ta
c2d0: 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ble to the datab
c2e0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
c2f0: 6e 74 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c  nt fts3CompareEl
c300: 65 6d 42 79 54 65 72 6d 28 63 6f 6e 73 74 20 76  emByTerm(const v
c310: 6f 69 64 20 2a 6c 68 73 2c 20 63 6f 6e 73 74 20  oid *lhs, const 
c320: 76 6f 69 64 20 2a 72 68 73 29 7b 0a 20 20 63 68  void *rhs){.  ch
c330: 61 72 20 2a 7a 31 20 3d 20 66 74 73 33 48 61 73  ar *z1 = fts3Has
c340: 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68 45  hKey(*(Fts3HashE
c350: 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 63  lem **)lhs);.  c
c360: 68 61 72 20 2a 7a 32 20 3d 20 66 74 73 33 48 61  har *z2 = fts3Ha
c370: 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68  shKey(*(Fts3Hash
c380: 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 20 20  Elem **)rhs);.  
c390: 69 6e 74 20 6e 31 20 3d 20 66 74 73 33 48 61 73  int n1 = fts3Has
c3a0: 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33 48  hKeysize(*(Fts3H
c3b0: 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b  ashElem **)lhs);
c3c0: 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66 74 73 33  .  int n2 = fts3
c3d0: 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74  HashKeysize(*(Ft
c3e0: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68  s3HashElem **)rh
c3f0: 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20 3d 20 28  s);..  int n = (
c400: 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29  n1<n2 ? n1 : n2)
c410: 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63  ;.  int c = memc
c420: 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a 20  mp(z1, z2, n);. 
c430: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
c440: 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20   c = n1 - n2;.  
c450: 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  }.  return c;.}.
c460: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c470: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
c480: 61 6c 6c 6f 63 61 74 65 20 61 6e 20 46 74 73 33  allocate an Fts3
c490: 53 65 67 52 65 61 64 65 72 20 74 68 61 74 20 69  SegReader that i
c4a0: 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 0a  terates through.
c4b0: 2a 2a 20 61 20 73 75 62 73 65 74 20 6f 66 20 74  ** a subset of t
c4c0: 68 65 20 74 65 72 6d 73 20 73 74 6f 72 65 64 20  he terms stored 
c4d0: 69 6e 20 74 68 65 20 46 74 73 33 54 61 62 6c 65  in the Fts3Table
c4e0: 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 61 72  .pendingTerms ar
c4f0: 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ray..**.** If th
c500: 65 20 69 73 50 72 65 66 69 78 49 74 65 72 20 70  e isPrefixIter p
c510: 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f  arameter is zero
c520: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
c530: 6e 65 64 20 53 65 67 52 65 61 64 65 72 20 69 74  ned SegReader it
c540: 65 72 61 74 65 73 0a 2a 2a 20 74 68 72 6f 75 67  erates.** throug
c550: 68 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74  h each term in t
c560: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
c570: 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69 66 20 69   table. Or, if i
c580: 73 50 72 65 66 69 78 49 74 65 72 20 69 73 0a 2a  sPrefixIter is.*
c590: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69  * non-zero, it i
c5a0: 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
c5b0: 65 61 63 68 20 74 65 72 6d 20 61 6e 64 20 69 74  each term and it
c5c0: 73 20 70 72 65 66 69 78 65 73 2e 20 46 6f 72 20  s prefixes. For 
c5d0: 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74  example, if.** t
c5e0: 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73  he pending terms
c5f0: 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74   hash table cont
c600: 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22  ains the terms "
c610: 73 71 6c 69 74 65 22 2c 20 22 6d 79 73 71 6c 22  sqlite", "mysql"
c620: 20 61 6e 64 0a 2a 2a 20 22 66 69 72 65 62 69 72   and.** "firebir
c630: 64 22 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  d", then the ite
c640: 72 61 74 6f 72 20 76 69 73 69 74 73 20 74 68 65  rator visits the
c650: 20 66 6f 6c 6c 6f 77 69 6e 67 20 27 74 65 72 6d   following 'term
c660: 73 27 20 28 69 6e 20 74 68 65 20 6f 72 64 65 72  s' (in the order
c670: 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a 2a 2a 0a 2a  .** shown):.**.*
c680: 2a 20 20 20 66 20 66 69 20 66 69 72 20 66 69 72  *   f fi fir fir
c690: 65 20 66 69 72 65 62 20 66 69 72 65 62 69 20 66  e fireb firebi f
c6a0: 69 72 65 62 69 72 20 66 69 72 65 62 69 72 64 0a  irebir firebird.
c6b0: 2a 2a 20 20 20 6d 20 6d 79 20 6d 79 73 20 6d 79  **   m my mys my
c6c0: 73 71 20 6d 79 73 71 6c 0a 2a 2a 20 20 20 73 20  sq mysql.**   s 
c6d0: 73 71 20 73 71 6c 20 73 71 6c 69 20 73 71 6c 69  sq sql sqli sqli
c6e0: 74 20 73 71 6c 69 74 65 0a 2a 2a 0a 2a 2a 20 57  t sqlite.**.** W
c6f0: 68 65 72 65 61 73 20 69 66 20 69 73 50 72 65 66  hereas if isPref
c700: 69 78 49 74 65 72 20 69 73 20 7a 65 72 6f 2c 20  ixIter is zero, 
c710: 74 68 65 20 74 65 72 6d 73 20 76 69 73 69 74 65  the terms visite
c720: 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 66  d are:.**.**   f
c730: 69 72 65 62 69 72 64 20 6d 79 73 71 6c 20 73 71  irebird mysql sq
c740: 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lite.*/.int sqli
c750: 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
c760: 50 65 6e 64 69 6e 67 28 0a 20 20 46 74 73 33 54  Pending(.  Fts3T
c770: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
c780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
c790: 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
c7a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  le */.  int iInd
c7b0: 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
c7c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c7d0: 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a   for p->aIndex *
c7e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
c7f0: 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
c800: 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
c810: 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 69  earch for */.  i
c820: 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20  nt nTerm,       
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c840: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
c850: 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20   zTerm */.  int 
c860: 62 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 20  bPrefix,        
c870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c880: 72 75 65 20 66 6f 72 20 61 20 70 72 65 66 69 78  rue for a prefix
c890: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46   iterator */.  F
c8a0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70  ts3SegReader **p
c8b0: 70 52 65 61 64 65 72 20 20 20 20 20 20 20 20 2f  pReader        /
c8c0: 2a 20 4f 55 54 3a 20 53 65 67 52 65 61 64 65 72  * OUT: SegReader
c8d0: 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d 74 65 72   for pending-ter
c8e0: 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 53  ms */.){.  Fts3S
c8f0: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
c900: 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 74  r = 0;     /* Ft
c910: 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65  s3SegReader obje
c920: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
c930: 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a    Fts3HashElem *
c940: 70 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pE;             
c950: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
c960: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46 74 73 33  riable */.  Fts3
c970: 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d  HashElem **aElem
c980: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
c990: 72 72 61 79 20 6f 66 20 74 65 72 6d 20 68 61 73  rray of term has
c9a0: 68 20 65 6e 74 72 69 65 73 20 74 6f 20 73 63 61  h entries to sca
c9b0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c 65 6d  n */.  int nElem
c9c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c9d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
c9e0: 66 20 61 72 72 61 79 20 61 74 20 61 45 6c 65 6d  f array at aElem
c9f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
ca00: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
ca10: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ca20: 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 48 61  Code */.  Fts3Ha
ca30: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48  sh *pHash;..  pH
ca40: 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e 64 65 78  ash = &p->aIndex
ca50: 5b 69 49 6e 64 65 78 5d 2e 68 50 65 6e 64 69 6e  [iIndex].hPendin
ca60: 67 3b 0a 20 20 69 66 28 20 62 50 72 65 66 69 78  g;.  if( bPrefix
ca70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c   ){.    int nAll
ca80: 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  oc = 0;         
ca90: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
caa0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 72 72 61 79   allocated array
cab0: 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 0a 20 20   at aElem */..  
cac0: 20 20 66 6f 72 28 70 45 3d 66 74 73 33 48 61 73    for(pE=fts3Has
cad0: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
cae0: 45 3b 20 70 45 3d 66 74 73 33 48 61 73 68 4e 65  E; pE=fts3HashNe
caf0: 78 74 28 70 45 29 29 7b 0a 20 20 20 20 20 20 63  xt(pE)){.      c
cb00: 68 61 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68 61  har *zKey = (cha
cb10: 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65 79 28  r *)fts3HashKey(
cb20: 70 45 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  pE);.      int n
cb30: 4b 65 79 20 3d 20 66 74 73 33 48 61 73 68 4b 65  Key = fts3HashKe
cb40: 79 73 69 7a 65 28 70 45 29 3b 0a 20 20 20 20 20  ysize(pE);.     
cb50: 20 69 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c 7c   if( nTerm==0 ||
cb60: 20 28 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26 26   (nKey>=nTerm &&
cb70: 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79 2c   0==memcmp(zKey,
cb80: 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 20   zTerm, nTerm)) 
cb90: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
cba0: 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a  Elem==nAlloc ){.
cbb0: 20 20 20 20 20 20 20 20 20 20 46 74 73 33 48 61            Fts3Ha
cbc0: 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32 3b  shElem **aElem2;
cbd0: 0a 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f  .          nAllo
cbe0: 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20  c += 16;.       
cbf0: 20 20 20 61 45 6c 65 6d 32 20 3d 20 28 46 74 73     aElem2 = (Fts
cc00: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71 6c  3HashElem **)sql
cc10: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 61 45 6c 65              aEle
cc30: 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  m, nAlloc*sizeof
cc40: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29  (Fts3HashElem *)
cc50: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
cc60: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 45 6c          if( !aEl
cc70: 65 6d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  em2 ){.         
cc80: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
cc90: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
cca0: 20 20 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20 20    nElem = 0;.   
ccb0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ccc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ccd0: 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 61 45        aElem = aE
cce0: 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lem2;.        }.
ccf0: 0a 20 20 20 20 20 20 20 20 61 45 6c 65 6d 5b 6e  .        aElem[n
cd00: 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20 20  Elem++] = pE;.  
cd10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
cd20: 20 2f 2a 20 49 66 20 6d 6f 72 65 20 74 68 61 6e   /* If more than
cd30: 20 6f 6e 65 20 74 65 72 6d 20 6d 61 74 63 68 65   one term matche
cd40: 73 20 74 68 65 20 70 72 65 66 69 78 2c 20 73 6f  s the prefix, so
cd50: 72 74 20 74 68 65 20 46 74 73 33 48 61 73 68 45  rt the Fts3HashE
cd60: 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f 62 6a 65 63  lem.    ** objec
cd70: 74 73 20 69 6e 20 74 65 72 6d 20 6f 72 64 65 72  ts in term order
cd80: 20 75 73 69 6e 67 20 71 73 6f 72 74 28 29 2e 20   using qsort(). 
cd90: 54 68 69 73 20 75 73 65 73 20 74 68 65 20 73 61  This uses the sa
cda0: 6d 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  me comparison.  
cdb0: 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61 73    ** callback as
cdc0: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 66 6c   is used when fl
cdd0: 75 73 68 69 6e 67 20 74 65 72 6d 73 20 74 6f 20  ushing terms to 
cde0: 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
cdf0: 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20 29 7b 0a   if( nElem>1 ){.
ce00: 20 20 20 20 20 20 71 73 6f 72 74 28 61 45 6c 65        qsort(aEle
ce10: 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f 66  m, nElem, sizeof
ce20: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29  (Fts3HashElem *)
ce30: 2c 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65  , fts3CompareEle
ce40: 6d 42 79 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  mByTerm);.    }.
ce50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
ce60: 20 54 68 65 20 71 75 65 72 79 20 69 73 20 61 20   The query is a 
ce70: 73 69 6d 70 6c 65 20 74 65 72 6d 20 6c 6f 6f 6b  simple term look
ce80: 75 70 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  up that matches 
ce90: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74 65 72 6d  at most one term
cea0: 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 69   in.    ** the i
ceb0: 6e 64 65 78 2e 20 41 6c 6c 20 74 68 61 74 20 69  ndex. All that i
cec0: 73 20 72 65 71 75 69 72 65 64 20 69 73 20 61 20  s required is a 
ced0: 73 74 72 61 69 67 68 74 20 68 61 73 68 2d 6c 6f  straight hash-lo
cee0: 6f 6b 75 70 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  okup. .    **.  
cef0: 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
cf00: 20 73 74 61 63 6b 20 61 64 64 72 65 73 73 20 6f   stack address o
cf10: 66 20 70 45 20 6d 61 79 20 62 65 20 61 63 63 65  f pE may be acce
cf20: 73 73 65 64 20 76 69 61 20 74 68 65 20 61 45 6c  ssed via the aEl
cf30: 65 6d 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a  em pointer.    *
cf40: 2a 20 62 65 6c 6f 77 2c 20 74 68 65 20 22 46 74  * below, the "Ft
cf50: 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 22 20  s3HashElem *pE" 
cf60: 6d 75 73 74 20 62 65 20 64 65 63 6c 61 72 65 64  must be declared
cf70: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 76   so that it is v
cf80: 61 6c 69 64 0a 20 20 20 20 2a 2a 20 77 69 74 68  alid.    ** with
cf90: 69 6e 20 74 68 69 73 20 65 6e 74 69 72 65 20 66  in this entire f
cfa0: 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20 6a 75 73  unction, not jus
cfb0: 74 20 74 68 69 73 20 22 65 6c 73 65 7b 2e 2e 2e  t this "else{...
cfc0: 7d 22 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  }" block..    */
cfd0: 0a 20 20 20 20 70 45 20 3d 20 66 74 73 33 48 61  .    pE = fts3Ha
cfe0: 73 68 46 69 6e 64 45 6c 65 6d 28 70 48 61 73 68  shFindElem(pHash
cff0: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
d000: 0a 20 20 20 20 69 66 28 20 70 45 20 29 7b 0a 20  .    if( pE ){. 
d010: 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 26 70 45       aElem = &pE
d020: 3b 0a 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20  ;.      nElem = 
d030: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
d040: 69 66 28 20 6e 45 6c 65 6d 3e 30 20 29 7b 0a 20  if( nElem>0 ){. 
d050: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
d060: 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61  izeof(Fts3SegRea
d070: 64 65 72 29 20 2b 20 28 6e 45 6c 65 6d 2b 31 29  der) + (nElem+1)
d080: 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68  *sizeof(Fts3Hash
d090: 45 6c 65 6d 20 2a 29 3b 0a 20 20 20 20 70 52 65  Elem *);.    pRe
d0a0: 61 64 65 72 20 3d 20 28 46 74 73 33 53 65 67 52  ader = (Fts3SegR
d0b0: 65 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33 5f  eader *)sqlite3_
d0c0: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
d0d0: 20 20 20 69 66 28 20 21 70 52 65 61 64 65 72 20     if( !pReader 
d0e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
d0f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
d100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
d110: 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c 20  set(pReader, 0, 
d120: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 52  nByte);.      pR
d130: 65 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 30 78  eader->iIdx = 0x
d140: 37 46 46 46 46 46 46 46 3b 0a 20 20 20 20 20 20  7FFFFFFF;.      
d150: 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45  pReader->ppNextE
d160: 6c 65 6d 20 3d 20 28 46 74 73 33 48 61 73 68 45  lem = (Fts3HashE
d170: 6c 65 6d 20 2a 2a 29 26 70 52 65 61 64 65 72 5b  lem **)&pReader[
d180: 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  1];.      memcpy
d190: 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74  (pReader->ppNext
d1a0: 45 6c 65 6d 2c 20 61 45 6c 65 6d 2c 20 6e 45 6c  Elem, aElem, nEl
d1b0: 65 6d 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61  em*sizeof(Fts3Ha
d1c0: 73 68 45 6c 65 6d 20 2a 29 29 3b 0a 20 20 20 20  shElem *));.    
d1d0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50 72  }.  }..  if( bPr
d1e0: 65 66 69 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  efix ){.    sqli
d1f0: 74 65 33 5f 66 72 65 65 28 61 45 6c 65 6d 29 3b  te3_free(aElem);
d200: 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72  .  }.  *ppReader
d210: 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65   = pReader;.  re
d220: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d230: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 65 6e  * Compare the en
d240: 74 72 69 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tries pointed to
d250: 20 62 79 20 74 77 6f 20 46 74 73 33 53 65 67 52   by two Fts3SegR
d260: 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65 73  eader structures
d270: 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  . .** Comparison
d280: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
d290: 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 69  **.**   1) EOF i
d2a0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
d2b0: 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20  ot EOF..**.**   
d2c0: 32 29 20 54 68 65 20 63 75 72 72 65 6e 74 20 74  2) The current t
d2d0: 65 72 6d 73 20 28 69 66 20 61 6e 79 29 20 61 72  erms (if any) ar
d2e0: 65 20 63 6f 6d 70 61 72 65 64 20 75 73 69 6e 67  e compared using
d2f0: 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e   memcmp(). If on
d300: 65 0a 2a 2a 20 20 20 20 20 20 74 65 72 6d 20 69  e.**      term i
d310: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e  s a prefix of an
d320: 6f 74 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67 65  other, the longe
d330: 72 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69 64  r term is consid
d340: 65 72 65 64 20 74 68 65 0a 2a 2a 20 20 20 20 20  ered the.**     
d350: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20   larger..**.**  
d360: 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20 61   3) By segment a
d370: 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 67  ge. An older seg
d380: 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72  ment is consider
d390: 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74  ed larger..*/.st
d3a0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
d3b0: 52 65 61 64 65 72 43 6d 70 28 46 74 73 33 53 65  ReaderCmp(Fts3Se
d3c0: 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46  gReader *pLhs, F
d3d0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
d3e0: 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  hs){.  int rc;. 
d3f0: 20 69 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65   if( pLhs->aNode
d400: 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20   && pRhs->aNode 
d410: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
d420: 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20 70   pLhs->nTerm - p
d430: 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  Rhs->nTerm;.    
d440: 69 66 28 20 72 63 32 3c 30 20 29 7b 0a 20 20 20  if( rc2<0 ){.   
d450: 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70     rc = memcmp(p
d460: 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73  Lhs->zTerm, pRhs
d470: 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e 6e  ->zTerm, pLhs->n
d480: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Term);.    }else
d490: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d  {.      rc = mem
d4a0: 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c  cmp(pLhs->zTerm,
d4b0: 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52   pRhs->zTerm, pR
d4c0: 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  hs->nTerm);.    
d4d0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20  }.    if( rc==0 
d4e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
d4f0: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  2;.    }.  }else
d500: 7b 0a 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73  {.    rc = (pLhs
d510: 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28 70  ->aNode==0) - (p
d520: 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b 0a  Rhs->aNode==0);.
d530: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20    }.  if( rc==0 
d540: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 68 73  ){.    rc = pRhs
d550: 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69  ->iIdx - pLhs->i
d560: 49 64 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Idx;.  }.  asser
d570: 74 28 20 72 63 21 3d 30 20 29 3b 0a 20 20 72 65  t( rc!=0 );.  re
d580: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d590: 2a 20 41 20 64 69 66 66 65 72 65 6e 74 20 63 6f  * A different co
d5a0: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
d5b0: 6e 20 66 6f 72 20 53 65 67 52 65 61 64 65 72 20  n for SegReader 
d5c0: 73 74 72 75 63 74 75 72 65 73 2e 20 49 6e 20 74  structures. In t
d5d0: 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20  his.** version, 
d5e0: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
d5f0: 61 74 20 65 61 63 68 20 53 65 67 52 65 61 64 65  at each SegReade
d600: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  r points to an e
d610: 6e 74 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f 63  ntry in.** a doc
d620: 6c 69 73 74 20 66 6f 72 20 69 64 65 6e 74 69 63  list for identic
d630: 61 6c 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61 72  al terms. Compar
d640: 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 73 20  ison is made as 
d650: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
d660: 20 31 29 20 45 4f 46 20 28 65 6e 64 20 6f 66 20   1) EOF (end of 
d670: 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 69 73 20  doclist in this 
d680: 63 61 73 65 29 20 69 73 20 67 72 65 61 74 65 72  case) is greater
d690: 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a   than not EOF..*
d6a0: 2a 0a 2a 2a 20 20 20 32 29 20 42 79 20 63 75 72  *.**   2) By cur
d6b0: 72 65 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a 2a  rent docid..**.*
d6c0: 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e  *   3) By segmen
d6d0: 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20  t age. An older 
d6e0: 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69  segment is consi
d6f0: 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f  dered larger..*/
d700: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
d710: 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
d720: 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64 65  Cmp(Fts3SegReade
d730: 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67  r *pLhs, Fts3Seg
d740: 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20  Reader *pRhs){. 
d750: 20 69 6e 74 20 72 63 20 3d 20 28 70 4c 68 73 2d   int rc = (pLhs-
d760: 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29  >pOffsetList==0)
d770: 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c  -(pRhs->pOffsetL
d780: 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72  ist==0);.  if( r
d790: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
d7a0: 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52  pLhs->iDocid==pR
d7b0: 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20  hs->iDocid ){.  
d7c0: 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69      rc = pRhs->i
d7d0: 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78  Idx - pLhs->iIdx
d7e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d7f0: 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69     rc = (pLhs->i
d800: 44 6f 63 69 64 20 3e 20 70 52 68 73 2d 3e 69 44  Docid > pRhs->iD
d810: 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a  ocid) ? 1 : -1;.
d820: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
d830: 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20  rt( pLhs->aNode 
d840: 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29  && pRhs->aNode )
d850: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d860: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
d870: 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
d880: 43 6d 70 52 65 76 28 46 74 73 33 53 65 67 52 65  CmpRev(Fts3SegRe
d890: 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33  ader *pLhs, Fts3
d8a0: 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73 29  SegReader *pRhs)
d8b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28 70 4c  {.  int rc = (pL
d8c0: 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d  hs->pOffsetList=
d8d0: 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73  =0)-(pRhs->pOffs
d8e0: 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66  etList==0);.  if
d8f0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
d900: 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d  f( pLhs->iDocid=
d910: 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b  =pRhs->iDocid ){
d920: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52 68 73  .      rc = pRhs
d930: 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69  ->iIdx - pLhs->i
d940: 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Idx;.    }else{.
d950: 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73        rc = (pLhs
d960: 2d 3e 69 44 6f 63 69 64 20 3c 20 70 52 68 73 2d  ->iDocid < pRhs-
d970: 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d  >iDocid) ? 1 : -
d980: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  1;.    }.  }.  a
d990: 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f  ssert( pLhs->aNo
d9a0: 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64  de && pRhs->aNod
d9b0: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  e );.  return rc
d9c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
d9d0: 72 65 20 74 68 65 20 74 65 72 6d 20 74 68 61 74  re the term that
d9e0: 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61 64   the Fts3SegRead
d9f0: 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
da00: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
da10: 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 73  gument.** points
da20: 20 74 6f 20 77 69 74 68 20 74 68 65 20 74 65 72   to with the ter
da30: 6d 20 73 70 65 63 69 66 69 65 64 20 62 79 20 61  m specified by a
da40: 72 67 75 6d 65 6e 74 73 20 7a 54 65 72 6d 20 61  rguments zTerm a
da50: 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a 2a 0a 2a 2a  nd nTerm. .**.**
da60: 20 49 66 20 74 68 65 20 70 53 65 67 20 69 74 65   If the pSeg ite
da70: 72 61 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  rator is already
da80: 20 61 74 20 45 4f 46 2c 20 72 65 74 75 72 6e 20   at EOF, return 
da90: 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  0. Otherwise, re
daa0: 74 75 72 6e 0a 2a 2a 20 2d 76 65 20 69 66 20 74  turn.** -ve if t
dab0: 68 65 20 70 53 65 67 20 74 65 72 6d 20 69 73 20  he pSeg term is 
dac0: 6c 65 73 73 20 74 68 61 6e 20 7a 54 65 72 6d 2f  less than zTerm/
dad0: 6e 54 65 72 6d 2c 20 30 20 69 66 20 74 68 65 20  nTerm, 0 if the 
dae0: 74 77 6f 20 74 65 72 6d 73 20 61 72 65 0a 2a 2a  two terms are.**
daf0: 20 65 71 75 61 6c 2c 20 6f 72 20 2b 76 65 20 69   equal, or +ve i
db00: 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d 20  f the pSeg term 
db10: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
db20: 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2f 0a  zTerm/nTerm..*/.
db30: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
db40: 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70 28  egReaderTermCmp(
db50: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
db60: 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20   *pSeg,         
db70: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 72 65     /* Segment re
db80: 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ader object */. 
db90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
dba0: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
dbb0: 20 2f 2a 20 54 65 72 6d 20 74 6f 20 63 6f 6d 70   /* Term to comp
dbc0: 61 72 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  are to */.  int 
dbd0: 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  nTerm           
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dbf0: 69 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 72  ize of term zTer
dc00: 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  m in bytes */.){
dc10: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a  .  int res = 0;.
dc20: 20 20 69 66 28 20 70 53 65 67 2d 3e 61 4e 6f 64    if( pSeg->aNod
dc30: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 65  e ){.    if( pSe
dc40: 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65 72 6d 20 29  g->nTerm>nTerm )
dc50: 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65  {.      res = me
dc60: 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d  mcmp(pSeg->zTerm
dc70: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
dc80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dc90: 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70    res = memcmp(p
dca0: 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72  Seg->zTerm, zTer
dcb0: 6d 2c 20 70 53 65 67 2d 3e 6e 54 65 72 6d 29 3b  m, pSeg->nTerm);
dcc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
dcd0: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
dce0: 65 73 20 3d 20 70 53 65 67 2d 3e 6e 54 65 72 6d  es = pSeg->nTerm
dcf0: 2d 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20  -nTerm;.    }.  
dd00: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
dd10: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
dd20: 74 20 61 70 53 65 67 6d 65 6e 74 20 69 73 20 61  t apSegment is a
dd30: 6e 20 61 72 72 61 79 20 6f 66 20 6e 53 65 67 6d  n array of nSegm
dd40: 65 6e 74 20 65 6c 65 6d 65 6e 74 73 2e 20 49 74  ent elements. It
dd50: 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74 0a 2a   is known that.*
dd60: 2a 20 74 68 65 20 66 69 6e 61 6c 20 28 6e 53 65  * the final (nSe
dd70: 67 6d 65 6e 74 2d 6e 53 75 73 70 65 63 74 29 20  gment-nSuspect) 
dd80: 6d 65 6d 62 65 72 73 20 61 72 65 20 61 6c 72 65  members are alre
dd90: 61 64 79 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  ady in sorted or
dda0: 64 65 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e  der.** (accordin
ddb0: 67 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  g to the compari
ddc0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f  son function pro
ddd0: 76 69 64 65 64 29 2e 20 54 68 69 73 20 66 75 6e  vided). This fun
dde0: 63 74 69 6f 6e 20 73 68 75 66 66 6c 65 73 0a 2a  ction shuffles.*
ddf0: 2a 20 74 68 65 20 61 72 72 61 79 20 61 72 6f 75  * the array arou
de00: 6e 64 20 75 6e 74 69 6c 20 61 6c 6c 20 65 6e 74  nd until all ent
de10: 72 69 65 73 20 61 72 65 20 69 6e 20 73 6f 72 74  ries are in sort
de20: 65 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ed order..*/.sta
de30: 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67  tic void fts3Seg
de40: 52 65 61 64 65 72 53 6f 72 74 28 0a 20 20 46 74  ReaderSort(.  Ft
de50: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70  s3SegReader **ap
de60: 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20  Segment,        
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de80: 41 72 72 61 79 20 74 6f 20 73 6f 72 74 20 65 6e  Array to sort en
de90: 74 72 69 65 73 20 6f 66 20 2a 2f 0a 20 20 69 6e  tries of */.  in
dea0: 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  t nSegment,     
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ded0: 53 69 7a 65 20 6f 66 20 61 70 53 65 67 6d 65 6e  Size of apSegmen
dee0: 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  t array */.  int
def0: 20 6e 53 75 73 70 65 63 74 2c 20 20 20 20 20 20   nSuspect,      
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
df20: 6e 73 6f 72 74 65 64 20 65 6e 74 72 79 20 63 6f  nsorted entry co
df30: 75 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  unt */.  int (*x
df40: 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64  Cmp)(Fts3SegRead
df50: 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61  er *, Fts3SegRea
df60: 64 65 72 20 2a 29 20 20 2f 2a 20 43 6f 6d 70 61  der *)  /* Compa
df70: 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
df80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
dfb0: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
dfc0: 20 20 61 73 73 65 72 74 28 20 6e 53 75 73 70 65    assert( nSuspe
dfd0: 63 74 3c 3d 6e 53 65 67 6d 65 6e 74 20 29 3b 0a  ct<=nSegment );.
dfe0: 0a 20 20 69 66 28 20 6e 53 75 73 70 65 63 74 3d  .  if( nSuspect=
dff0: 3d 6e 53 65 67 6d 65 6e 74 20 29 20 6e 53 75 73  =nSegment ) nSus
e000: 70 65 63 74 2d 2d 3b 0a 20 20 66 6f 72 28 69 3d  pect--;.  for(i=
e010: 6e 53 75 73 70 65 63 74 2d 31 3b 20 69 3e 3d 30  nSuspect-1; i>=0
e020: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
e030: 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  j;.    for(j=i; 
e040: 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d 31 29 3b 20  j<(nSegment-1); 
e050: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 33  j++){.      Fts3
e060: 53 65 67 52 65 61 64 65 72 20 2a 70 54 6d 70 3b  SegReader *pTmp;
e070: 0a 20 20 20 20 20 20 69 66 28 20 78 43 6d 70 28  .      if( xCmp(
e080: 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 61 70  apSegment[j], ap
e090: 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 29 3c 30 20  Segment[j+1])<0 
e0a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
e0b0: 54 6d 70 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  Tmp = apSegment[
e0c0: 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 61 70 53 65  j+1];.      apSe
e0d0: 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d 20 61 70 53  gment[j+1] = apS
e0e0: 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20  egment[j];.     
e0f0: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 20 3d 20   apSegment[j] = 
e100: 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pTmp;.    }.  }.
e110: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
e120: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
e130: 74 68 65 20 6c 69 73 74 20 72 65 61 6c 6c 79 20  the list really 
e140: 69 73 20 73 6f 72 74 65 64 20 6e 6f 77 2e 20 2a  is sorted now. *
e150: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28  /.  for(i=0; i<(
e160: 6e 53 75 73 70 65 63 74 2d 31 29 3b 20 69 2b 2b  nSuspect-1); i++
e170: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78  ){.    assert( x
e180: 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 69 5d  Cmp(apSegment[i]
e190: 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 2b 31 5d  , apSegment[i+1]
e1a0: 29 3c 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  )<0 );.  }.#endi
e1b0: 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65  f.}../* .** Inse
e1c0: 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f  rt a record into
e1d0: 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
e1e0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
e1f0: 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 53 65   int fts3WriteSe
e200: 67 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61 62  gment(.  Fts3Tab
e210: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
e220: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
e230: 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
e240: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
e250: 74 36 34 20 69 42 6c 6f 63 6b 2c 20 20 20 20 20  t64 iBlock,     
e260: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69        /* Block i
e270: 64 20 66 6f 72 20 6e 65 77 20 62 6c 6f 63 6b 20  d for new block 
e280: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c 20 20 20  */.  char *z,   
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
e2b0: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
e2c0: 6e 69 6e 67 20 62 6c 6f 63 6b 20 64 61 74 61 20  ning block data 
e2d0: 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20  */.  int n      
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
e300: 62 75 66 66 65 72 20 7a 20 69 6e 20 62 79 74 65  buffer z in byte
e310: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
e320: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
e330: 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71   int rc = fts3Sq
e340: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53  lStmt(p, SQL_INS
e350: 45 52 54 5f 53 45 47 4d 45 4e 54 53 2c 20 26 70  ERT_SEGMENTS, &p
e360: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
e370: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e380: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
e390: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
e3a0: 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73  , iBlock);.    s
e3b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
e3c0: 28 70 53 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e 2c  (pStmt, 2, z, n,
e3d0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
e3e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
e3f0: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63  p(pStmt);.    rc
e400: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
e410: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
e420: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
e430: 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 72 65 63  .** Insert a rec
e440: 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 73  ord into the %_s
e450: 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a  egdir table..*/.
e460: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 57  static int fts3W
e470: 72 69 74 65 53 65 67 64 69 72 28 0a 20 20 46 74  riteSegdir(.  Ft
e480: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e4a0: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
e4b0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
e4c0: 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
e4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
e4e0: 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
e4f0: 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69  field */.  int i
e500: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
e510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
e520: 6c 75 65 20 66 6f 72 20 22 69 64 78 22 20 66 69  lue for "idx" fi
e530: 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
e540: 5f 69 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f  _int64 iStartBlo
e550: 63 6b 2c 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ck,      /* Valu
e560: 65 20 66 6f 72 20 22 73 74 61 72 74 5f 62 6c 6f  e for "start_blo
e570: 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73  ck" field */.  s
e580: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
e590: 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 2f  afEndBlock,    /
e5a0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 61  * Value for "lea
e5b0: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  ves_end_block" f
e5c0: 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ield */.  sqlite
e5d0: 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63  3_int64 iEndBloc
e5e0: 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  k,        /* Val
e5f0: 75 65 20 66 6f 72 20 22 65 6e 64 5f 62 6c 6f 63  ue for "end_bloc
e600: 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 63 68  k" field */.  ch
e610: 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20  ar *zRoot,      
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e630: 20 42 6c 6f 62 20 76 61 6c 75 65 20 66 6f 72 20   Blob value for 
e640: 22 72 6f 6f 74 22 20 66 69 65 6c 64 20 2a 2f 0a  "root" field */.
e650: 20 20 69 6e 74 20 6e 52 6f 6f 74 20 20 20 20 20    int nRoot     
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
e680: 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 7a  ytes in buffer z
e690: 52 6f 6f 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  Root */.){.  sql
e6a0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
e6b0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
e6c0: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
e6d0: 49 4e 53 45 52 54 5f 53 45 47 44 49 52 2c 20 26  INSERT_SEGDIR, &
e6e0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
e6f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e700: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
e710: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
e720: 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71   iLevel);.    sq
e730: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
e740: 53 74 6d 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a  Stmt, 2, iIdx);.
e750: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
e760: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 2c  _int64(pStmt, 3,
e770: 20 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20   iStartBlock);. 
e780: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
e790: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 34 2c 20  int64(pStmt, 4, 
e7a0: 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 29 3b 0a  iLeafEndBlock);.
e7b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
e7c0: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 35 2c  _int64(pStmt, 5,
e7d0: 20 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20   iEndBlock);.   
e7e0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
e7f0: 6f 62 28 70 53 74 6d 74 2c 20 36 2c 20 7a 52 6f  ob(pStmt, 6, zRo
e800: 6f 74 2c 20 6e 52 6f 6f 74 2c 20 53 51 4c 49 54  ot, nRoot, SQLIT
e810: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
e820: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
e830: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
e840: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
e850: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e860: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
e870: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
e880: 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
e890: 78 20 28 69 66 20 61 6e 79 29 20 73 68 61 72 65  x (if any) share
e8a0: 64 20 62 79 20 7a 50 72 65 76 20 61 6e 64 0a 2a  d by zPrev and.*
e8b0: 2a 20 7a 4e 65 78 74 2c 20 69 6e 20 62 79 74 65  * zNext, in byte
e8c0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
e8d0: 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 50 72 65  .**.**   fts3Pre
e8e0: 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 63  fixCompress("abc
e8f0: 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22 2c 20  ", 3, "abcdef", 
e900: 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20  6)   // returns 
e910: 33 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69  3.**   fts3Prefi
e920: 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58 22 2c  xCompress("abX",
e930: 20 33 2c 20 22 61 62 63 64 65 66 22 2c 20 36 29   3, "abcdef", 6)
e940: 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 32 0a     // returns 2.
e950: 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69 78 43  **   fts3PrefixC
e960: 6f 6d 70 72 65 73 73 28 22 61 62 58 22 2c 20 33  ompress("abX", 3
e970: 2c 20 22 58 62 63 64 65 66 22 2c 20 36 29 20 20  , "Xbcdef", 6)  
e980: 20 2f 2f 20 72 65 74 75 72 6e 73 20 30 0a 2a 2f   // returns 0.*/
e990: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
e9a0: 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a  PrefixCompress(.
e9b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
e9c0: 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
e9d0: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
e9e0: 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20  aining previous 
e9f0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  term */.  int nP
ea00: 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
ea10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ea20: 65 20 6f 66 20 62 75 66 66 65 72 20 7a 50 72 65  e of buffer zPre
ea30: 76 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  v in bytes */.  
ea40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 78  const char *zNex
ea50: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
ea60: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
ea70: 6e 69 6e 67 20 6e 65 78 74 20 74 65 72 6d 20 2a  ning next term *
ea80: 2f 0a 20 20 69 6e 74 20 6e 4e 65 78 74 20 20 20  /.  int nNext   
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
eab0: 75 66 66 65 72 20 7a 4e 65 78 74 20 69 6e 20 62  uffer zNext in b
eac0: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
ead0: 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   n;.  UNUSED_PAR
eae0: 41 4d 45 54 45 52 28 6e 4e 65 78 74 29 3b 0a 20  AMETER(nNext);. 
eaf0: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 50 72 65   for(n=0; n<nPre
eb00: 76 20 26 26 20 7a 50 72 65 76 5b 6e 5d 3d 3d 7a  v && zPrev[n]==z
eb10: 4e 65 78 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20  Next[n]; n++);. 
eb20: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
eb30: 0a 2a 2a 20 41 64 64 20 74 65 72 6d 20 7a 54 65  .** Add term zTe
eb40: 72 6d 20 74 6f 20 74 68 65 20 53 65 67 6d 65 6e  rm to the Segmen
eb50: 74 4e 6f 64 65 2e 20 49 74 20 69 73 20 67 75 61  tNode. It is gua
eb60: 72 61 6e 74 65 65 64 20 74 68 61 74 20 7a 54 65  ranteed that zTe
eb70: 72 6d 20 69 73 20 6c 61 72 67 65 72 0a 2a 2a 20  rm is larger.** 
eb80: 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 6d 65  (according to me
eb90: 6d 63 6d 70 29 20 74 68 61 6e 20 74 68 65 20 70  mcmp) than the p
eba0: 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 0a 2a 2f  revious term..*/
ebb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
ebc0: 4e 6f 64 65 41 64 64 54 65 72 6d 28 0a 20 20 46  NodeAddTerm(.  F
ebd0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ebf0: 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
ec00: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d  handle */.  Segm
ec10: 65 6e 74 4e 6f 64 65 20 2a 2a 70 70 54 72 65 65  entNode **ppTree
ec20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
ec30: 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74 4e 6f  N/OUT: SegmentNo
ec40: 64 65 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20  de handle */ .  
ec50: 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20  int isCopyTerm, 
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 2f 2a 20 54 72 75 65 20 69 66 20 7a 54 65 72 6d  /* True if zTerm
ec80: 2f 6e 54 65 72 6d 20 69 73 20 74 72 61 6e 73 69  /nTerm is transi
ec90: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
eca0: 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
ecb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
ecc0: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
ecd0: 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f  ntaining term */
ece0: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20  .  int nTerm    
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
ed10: 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  rm in bytes */.)
ed20: 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  {.  SegmentNode 
ed30: 2a 70 54 72 65 65 20 3d 20 2a 70 70 54 72 65 65  *pTree = *ppTree
ed40: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 53 65  ;.  int rc;.  Se
ed50: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 4e 65 77 3b  gmentNode *pNew;
ed60: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79  ..  /* First try
ed70: 20 74 6f 20 61 70 70 65 6e 64 20 74 68 65 20 74   to append the t
ed80: 65 72 6d 20 74 6f 20 74 68 65 20 63 75 72 72 65  erm to the curre
ed90: 6e 74 20 6e 6f 64 65 2e 20 52 65 74 75 72 6e 20  nt node. Return 
eda0: 65 61 72 6c 79 20 69 66 20 0a 20 20 2a 2a 20 74  early if .  ** t
edb0: 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2e  his is possible.
edc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 72 65  .  */.  if( pTre
edd0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 61  e ){.    int nDa
ede0: 74 61 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74  ta = pTree->nDat
edf0: 61 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  a;     /* Curren
ee00: 74 20 73 69 7a 65 20 6f 66 20 6e 6f 64 65 20 69  t size of node i
ee10: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
ee20: 6e 74 20 6e 52 65 71 20 3d 20 6e 44 61 74 61 3b  nt nReq = nData;
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee40: 52 65 71 75 69 72 65 64 20 73 70 61 63 65 20 61  Required space a
ee50: 66 74 65 72 20 61 64 64 69 6e 67 20 7a 54 65 72  fter adding zTer
ee60: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 72  m */.    int nPr
ee70: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
ee80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ee90: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 72 65   of bytes of pre
eea0: 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  fix compression 
eeb0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75 66 66  */.    int nSuff
eec0: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
eed0: 20 20 20 20 20 2f 2a 20 53 75 66 66 69 78 20 6c       /* Suffix l
eee0: 65 6e 67 74 68 20 2a 2f 0a 0a 20 20 20 20 6e 50  ength */..    nP
eef0: 72 65 66 69 78 20 3d 20 66 74 73 33 50 72 65 66  refix = fts3Pref
ef00: 69 78 43 6f 6d 70 72 65 73 73 28 70 54 72 65 65  ixCompress(pTree
ef10: 2d 3e 7a 54 65 72 6d 2c 20 70 54 72 65 65 2d 3e  ->zTerm, pTree->
ef20: 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  nTerm, zTerm, nT
ef30: 65 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66 66 69  erm);.    nSuffi
ef40: 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69  x = nTerm-nPrefi
ef50: 78 3b 0a 0a 20 20 20 20 6e 52 65 71 20 2b 3d 20  x;..    nReq += 
ef60: 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
ef70: 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 2b 73 71  tLen(nPrefix)+sq
ef80: 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
ef90: 65 6e 28 6e 53 75 66 66 69 78 29 2b 6e 53 75 66  en(nSuffix)+nSuf
efa0: 66 69 78 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  fix;.    if( nRe
efb0: 71 3c 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20  q<=p->nNodeSize 
efc0: 7c 7c 20 21 70 54 72 65 65 2d 3e 7a 54 65 72 6d  || !pTree->zTerm
efd0: 20 29 7b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e   ){..      if( n
efe0: 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  Req>p->nNodeSize
eff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
f000: 6e 20 75 6e 75 73 75 61 6c 20 63 61 73 65 3a 20  n unusual case: 
f010: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
f020: 74 20 74 65 72 6d 20 74 6f 20 62 65 20 61 64 64  t term to be add
f030: 65 64 20 74 6f 20 74 68 65 20 6e 6f 64 65 0a 20  ed to the node. 
f040: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68         ** and th
f050: 65 20 73 74 61 74 69 63 20 6e 6f 64 65 20 62 75  e static node bu
f060: 66 66 65 72 20 28 70 2d 3e 6e 4e 6f 64 65 53 69  ffer (p->nNodeSi
f070: 7a 65 20 62 79 74 65 73 29 20 69 73 20 6e 6f 74  ze bytes) is not
f080: 20 6c 61 72 67 65 0a 20 20 20 20 20 20 20 20 2a   large.        *
f090: 2a 20 65 6e 6f 75 67 68 2e 20 55 73 65 20 61 20  * enough. Use a 
f0a0: 73 65 70 61 72 61 74 65 6c 79 20 6d 61 6c 6c 6f  separately mallo
f0b0: 63 65 64 20 62 75 66 66 65 72 20 69 6e 73 74 65  ced buffer inste
f0c0: 61 64 20 54 68 69 73 20 77 61 73 74 65 73 0a 20  ad This wastes. 
f0d0: 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6e 4e 6f         ** p->nNo
f0e0: 64 65 53 69 7a 65 20 62 79 74 65 73 2c 20 62 75  deSize bytes, bu
f0f0: 74 20 73 69 6e 63 65 20 74 68 69 73 20 73 63 65  t since this sce
f100: 6e 61 72 69 6f 20 6f 6e 6c 79 20 63 6f 6d 65 73  nario only comes
f110: 20 61 62 6f 75 74 20 77 68 65 6e 0a 20 20 20 20   about when.    
f120: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
f130: 61 73 65 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20  ase contain two 
f140: 74 65 72 6d 73 20 74 68 61 74 20 73 68 61 72 65  terms that share
f150: 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6c 6d   a prefix of alm
f160: 6f 73 74 20 32 4b 42 2c 20 0a 20 20 20 20 20 20  ost 2KB, .      
f170: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74    ** this is not
f180: 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20   expected to be 
f190: 61 20 73 65 72 69 6f 75 73 20 70 72 6f 62 6c 65  a serious proble
f1a0: 6d 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  m. .        */. 
f1b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f1c0: 54 72 65 65 2d 3e 61 44 61 74 61 3d 3d 28 63 68  Tree->aData==(ch
f1d0: 61 72 20 2a 29 26 70 54 72 65 65 5b 31 5d 20 29  ar *)&pTree[1] )
f1e0: 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d  ;.        pTree-
f1f0: 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a  >aData = (char *
f200: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
f210: 6e 52 65 71 29 3b 0a 20 20 20 20 20 20 20 20 69  nReq);.        i
f220: 66 28 20 21 70 54 72 65 65 2d 3e 61 44 61 74 61  f( !pTree->aData
f230: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
f240: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f250: 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
f260: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
f270: 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a  pTree->zTerm ){.
f280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
f290: 20 69 73 20 6e 6f 20 70 72 65 66 69 78 2d 6c 65   is no prefix-le
f2a0: 6e 67 74 68 20 66 69 65 6c 64 20 66 6f 72 20 66  ngth field for f
f2b0: 69 72 73 74 20 74 65 72 6d 20 69 6e 20 61 20 6e  irst term in a n
f2c0: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  ode */.        n
f2d0: 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46  Data += sqlite3F
f2e0: 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54  ts3PutVarint(&pT
f2f0: 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ree->aData[nData
f300: 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 20  ], nPrefix);.   
f310: 20 20 20 7d 0a 0a 20 20 20 20 20 20 6e 44 61 74     }..      nDat
f320: 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
f330: 50 75 74 56 61 72 69 6e 74 28 26 70 54 72 65 65  PutVarint(&pTree
f340: 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
f350: 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20  nSuffix);.      
f360: 6d 65 6d 63 70 79 28 26 70 54 72 65 65 2d 3e 61  memcpy(&pTree->a
f370: 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54  Data[nData], &zT
f380: 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53  erm[nPrefix], nS
f390: 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 70 54  uffix);.      pT
f3a0: 72 65 65 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61  ree->nData = nDa
f3b0: 74 61 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20  ta + nSuffix;.  
f3c0: 20 20 20 20 70 54 72 65 65 2d 3e 6e 45 6e 74 72      pTree->nEntr
f3d0: 79 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  y++;..      if( 
f3e0: 69 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20  isCopyTerm ){.  
f3f0: 20 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d        if( pTree-
f400: 3e 6e 4d 61 6c 6c 6f 63 3c 6e 54 65 72 6d 20 29  >nMalloc<nTerm )
f410: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
f420: 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *zNew = sqlite3
f430: 5f 72 65 61 6c 6c 6f 63 28 70 54 72 65 65 2d 3e  _realloc(pTree->
f440: 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32  zMalloc, nTerm*2
f450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
f460: 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !zNew ){.      
f470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f480: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
f490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f4a0: 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 20   pTree->nMalloc 
f4b0: 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20  = nTerm*2;.     
f4c0: 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c       pTree->zMal
f4d0: 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  loc = zNew;.    
f4e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
f4f0: 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 70 54 72  ree->zTerm = pTr
f500: 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20  ee->zMalloc;.   
f510: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 72 65       memcpy(pTre
f520: 65 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  e->zTerm, zTerm,
f530: 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   nTerm);.       
f540: 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20   pTree->nTerm = 
f550: 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  nTerm;.      }el
f560: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72 65  se{.        pTre
f570: 65 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72  e->zTerm = (char
f580: 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20   *)zTerm;.      
f590: 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d    pTree->nTerm =
f5a0: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   nTerm;.      }.
f5b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f5c0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
f5d0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
f5e0: 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65 72 65  ol flows to here
f5f0: 2c 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  , it was not pos
f600: 73 69 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  sible to append 
f610: 7a 54 65 72 6d 20 74 6f 20 74 68 65 0a 20 20 2a  zTerm to the.  *
f620: 2a 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20  * current node. 
f630: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6e 6f 64  Create a new nod
f640: 65 20 28 61 20 72 69 67 68 74 2d 73 69 62 6c 69  e (a right-sibli
f650: 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ng of the curren
f660: 74 20 6e 6f 64 65 29 2e 0a 20 20 2a 2a 20 49 66  t node)..  ** If
f670: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
f680: 73 74 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74  st node in the t
f690: 72 65 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73  ree, the term is
f6a0: 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 20 20   added to it..  
f6b0: 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  **.  ** Otherwis
f6c0: 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  e, the term is n
f6d0: 6f 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ot added to the 
f6e0: 6e 65 77 20 6e 6f 64 65 2c 20 69 74 20 69 73 20  new node, it is 
f6f0: 6c 65 66 74 20 65 6d 70 74 79 20 66 6f 72 0a 20  left empty for. 
f700: 20 2a 2a 20 6e 6f 77 2e 20 49 6e 73 74 65 61 64   ** now. Instead
f710: 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 69 6e  , the term is in
f720: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
f730: 70 61 72 65 6e 74 20 6f 66 20 70 54 72 65 65 2e  parent of pTree.
f740: 20 49 66 20 70 54 72 65 65 20 0a 20 20 2a 2a 20   If pTree .  ** 
f750: 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 2c 20 6f  has no parent, o
f760: 6e 65 20 69 73 20 63 72 65 61 74 65 64 20 68 65  ne is created he
f770: 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65 77 20  re..  */.  pNew 
f780: 3d 20 28 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a  = (SegmentNode *
f790: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
f7a0: 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f  sizeof(SegmentNo
f7b0: 64 65 29 20 2b 20 70 2d 3e 6e 4e 6f 64 65 53 69  de) + p->nNodeSi
f7c0: 7a 65 29 3b 0a 20 20 69 66 28 20 21 70 4e 65 77  ze);.  if( !pNew
f7d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f7e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
f7f0: 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
f800: 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e  0, sizeof(Segmen
f810: 74 4e 6f 64 65 29 29 3b 0a 20 20 70 4e 65 77 2d  tNode));.  pNew-
f820: 3e 6e 44 61 74 61 20 3d 20 31 20 2b 20 46 54 53  >nData = 1 + FTS
f830: 33 5f 56 41 52 49 4e 54 5f 4d 41 58 3b 0a 20 20  3_VARINT_MAX;.  
f840: 70 4e 65 77 2d 3e 61 44 61 74 61 20 3d 20 28 63  pNew->aData = (c
f850: 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  har *)&pNew[1];.
f860: 0a 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a  .  if( pTree ){.
f870: 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20      SegmentNode 
f880: 2a 70 50 61 72 65 6e 74 20 3d 20 70 54 72 65 65  *pParent = pTree
f890: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 72  ->pParent;.    r
f8a0: 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54  c = fts3NodeAddT
f8b0: 65 72 6d 28 70 2c 20 26 70 50 61 72 65 6e 74 2c  erm(p, &pParent,
f8c0: 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65   isCopyTerm, zTe
f8d0: 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
f8e0: 69 66 28 20 70 54 72 65 65 2d 3e 70 50 61 72 65  if( pTree->pPare
f8f0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nt==0 ){.      p
f900: 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Tree->pParent = 
f910: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d 0a 20  pParent;.    }. 
f920: 20 20 20 70 54 72 65 65 2d 3e 70 52 69 67 68 74     pTree->pRight
f930: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
f940: 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70  w->pLeftmost = p
f950: 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b  Tree->pLeftmost;
f960: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 65  .    pNew->pPare
f970: 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  nt = pParent;.  
f980: 20 20 70 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f 63 20    pNew->zMalloc 
f990: 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63  = pTree->zMalloc
f9a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4d 61 6c  ;.    pNew->nMal
f9b0: 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 6e 4d 61  loc = pTree->nMa
f9c0: 6c 6c 6f 63 3b 0a 20 20 20 20 70 54 72 65 65 2d  lloc;.    pTree-
f9d0: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
f9e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
f9f0: 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 4e 65  >pLeftmost = pNe
fa00: 77 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  w;.    rc = fts3
fa10: 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26  NodeAddTerm(p, &
fa20: 70 4e 65 77 2c 20 69 73 43 6f 70 79 54 65 72 6d  pNew, isCopyTerm
fa30: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
fa40: 20 0a 20 20 7d 0a 0a 20 20 2a 70 70 54 72 65 65   .  }..  *ppTree
fa50: 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
fa60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  n rc;.}../*.** H
fa70: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
fa80: 6f 72 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65  or fts3NodeWrite
fa90: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
faa0: 74 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68  t fts3TreeFinish
fab0: 4e 6f 64 65 28 0a 20 20 53 65 67 6d 65 6e 74 4e  Node(.  SegmentN
fac0: 6f 64 65 20 2a 70 54 72 65 65 2c 20 0a 20 20 69  ode *pTree, .  i
fad0: 6e 74 20 69 48 65 69 67 68 74 2c 20 0a 20 20 73  nt iHeight, .  s
fae0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
faf0: 66 74 43 68 69 6c 64 0a 29 7b 0a 20 20 69 6e 74  ftChild.){.  int
fb00: 20 6e 53 74 61 72 74 3b 0a 20 20 61 73 73 65 72   nStart;.  asser
fb10: 74 28 20 69 48 65 69 67 68 74 3e 3d 31 20 26 26  t( iHeight>=1 &&
fb20: 20 69 48 65 69 67 68 74 3c 31 32 38 20 29 3b 0a   iHeight<128 );.
fb30: 20 20 6e 53 74 61 72 74 20 3d 20 46 54 53 33 5f    nStart = FTS3_
fb40: 56 41 52 49 4e 54 5f 4d 41 58 20 2d 20 73 71 6c  VARINT_MAX - sql
fb50: 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
fb60: 6e 28 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20  n(iLeftChild);. 
fb70: 20 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53   pTree->aData[nS
fb80: 74 61 72 74 5d 20 3d 20 28 63 68 61 72 29 69 48  tart] = (char)iH
fb90: 65 69 67 68 74 3b 0a 20 20 73 71 6c 69 74 65 33  eight;.  sqlite3
fba0: 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
fbb0: 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61  Tree->aData[nSta
fbc0: 72 74 2b 31 5d 2c 20 69 4c 65 66 74 43 68 69 6c  rt+1], iLeftChil
fbd0: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 53 74  d);.  return nSt
fbe0: 61 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  art;.}../*.** Wr
fbf0: 69 74 65 20 74 68 65 20 62 75 66 66 65 72 20 66  ite the buffer f
fc00: 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6e  or the segment n
fc10: 6f 64 65 20 70 54 72 65 65 20 61 6e 64 20 61 6c  ode pTree and al
fc20: 6c 20 6f 66 20 69 74 73 20 70 65 65 72 73 20 74  l of its peers t
fc30: 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
fc40: 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 74 68 69  e. Then call thi
fc50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 63 75 72  s function recur
fc60: 73 69 76 65 6c 79 20 74 6f 20 77 72 69 74 65 20  sively to write 
fc70: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 0a 2a  the parent of .*
fc80: 2a 20 70 54 72 65 65 20 61 6e 64 20 69 74 73 20  * pTree and its 
fc90: 70 65 65 72 73 20 74 6f 20 74 68 65 20 64 61 74  peers to the dat
fca0: 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78  abase. .**.** Ex
fcb0: 63 65 70 74 2c 20 69 66 20 70 54 72 65 65 20 69  cept, if pTree i
fcc0: 73 20 61 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 64  s a root node, d
fcd0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74  o not write it t
fce0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
fcf0: 49 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 65 74 20  Instead,.** set 
fd00: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
fd10: 20 2a 70 61 52 6f 6f 74 20 61 6e 64 20 2a 70 6e   *paRoot and *pn
fd20: 52 6f 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20  Root to contain 
fd30: 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a  the root node..*
fd40: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
fd50: 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
fd60: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75   returned and ou
fd70: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
fd80: 69 4c 61 73 74 20 69 73 0a 2a 2a 20 73 65 74 20  iLast is.** set 
fd90: 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 62  to the largest b
fda0: 6c 6f 63 6b 69 64 20 77 72 69 74 74 65 6e 20 74  lockid written t
fdb0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
fdc0: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a 2a 2a  or zero if no.**
fdd0: 20 62 6c 6f 63 6b 73 20 77 65 72 65 20 77 72 69   blocks were wri
fde0: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 62 29 2e  tten to the db).
fdf0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
fe00: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
fe10: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
fe20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fe30: 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20  fts3NodeWrite(. 
fe40: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
fe70: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65  e handle */.  Se
fe80: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65  gmentNode *pTree
fe90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
fea0: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e   SegmentNode han
feb0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65  dle */.  int iHe
fec0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
fed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67           /* Heig
fee0: 68 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20  ht of this node 
fef0: 69 6e 20 74 72 65 65 20 2a 2f 0a 20 20 73 71 6c  in tree */.  sql
ff00: 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66  ite3_int64 iLeaf
ff10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ff20: 42 6c 6f 63 6b 20 69 64 20 6f 66 20 66 69 72 73  Block id of firs
ff30: 74 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 20  t leaf node */. 
ff40: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
ff50: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
ff60: 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20   /* Block id of 
ff70: 6e 65 78 74 20 66 72 65 65 20 73 6c 6f 74 20 69  next free slot i
ff80: 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  n %_segments */.
ff90: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
ffa0: 2a 70 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20  *piLast,        
ffb0: 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20    /* OUT: Block 
ffc0: 69 64 20 6f 66 20 6c 61 73 74 20 65 6e 74 72 79  id of last entry
ffd0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63 68   written */.  ch
ffe0: 61 72 20 2a 2a 70 61 52 6f 6f 74 2c 20 20 20 20  ar **paRoot,    
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10000 20 4f 55 54 3a 20 44 61 74 61 20 66 6f 72 20 72   OUT: Data for r
10010 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  oot node */.  in
10020 74 20 2a 70 6e 52 6f 6f 74 20 20 20 20 20 20 20  t *pnRoot       
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10040 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 72 6f   OUT: Size of ro
10050 6f 74 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73  ot node in bytes
10060 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
10070 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10080 69 66 28 20 21 70 54 72 65 65 2d 3e 70 50 61 72  if( !pTree->pPar
10090 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f  ent ){.    /* Ro
100a0 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 74  ot node of the t
100b0 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
100c0 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54 72 65  nStart = fts3Tre
100d0 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 54 72 65  eFinishNode(pTre
100e0 65 2c 20 69 48 65 69 67 68 74 2c 20 69 4c 65 61  e, iHeight, iLea
100f0 66 29 3b 0a 20 20 20 20 2a 70 69 4c 61 73 74 20  f);.    *piLast 
10100 3d 20 69 46 72 65 65 2d 31 3b 0a 20 20 20 20 2a  = iFree-1;.    *
10110 70 6e 52 6f 6f 74 20 3d 20 70 54 72 65 65 2d 3e  pnRoot = pTree->
10120 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a  nData - nStart;.
10130 20 20 20 20 2a 70 61 52 6f 6f 74 20 3d 20 26 70      *paRoot = &p
10140 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61  Tree->aData[nSta
10150 72 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rt];.  }else{.  
10160 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
10170 49 74 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  Iter;.    sqlite
10180 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 46 72 65  3_int64 iNextFre
10190 65 20 3d 20 69 46 72 65 65 3b 0a 20 20 20 20 73  e = iFree;.    s
101a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65  qlite3_int64 iNe
101b0 78 74 4c 65 61 66 20 3d 20 69 4c 65 61 66 3b 0a  xtLeaf = iLeaf;.
101c0 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 54      for(pIter=pT
101d0 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 20  ree->pLeftmost; 
101e0 70 49 74 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  pIter && rc==SQL
101f0 49 54 45 5f 4f 4b 3b 20 70 49 74 65 72 3d 70 49  ITE_OK; pIter=pI
10200 74 65 72 2d 3e 70 52 69 67 68 74 29 7b 0a 20 20  ter->pRight){.  
10210 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74 20 3d      int nStart =
10220 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e   fts3TreeFinishN
10230 6f 64 65 28 70 49 74 65 72 2c 20 69 48 65 69 67  ode(pIter, iHeig
10240 68 74 2c 20 69 4e 65 78 74 4c 65 61 66 29 3b 0a  ht, iNextLeaf);.
10250 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
10260 20 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 20   = pIter->nData 
10270 2d 20 6e 53 74 61 72 74 3b 0a 20 20 0a 20 20 20  - nStart;.  .   
10280 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74     rc = fts3Writ
10290 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 78  eSegment(p, iNex
102a0 74 46 72 65 65 2c 20 26 70 49 74 65 72 2d 3e 61  tFree, &pIter->a
102b0 44 61 74 61 5b 6e 53 74 61 72 74 5d 2c 20 6e 57  Data[nStart], nW
102c0 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 4e 65  rite);.      iNe
102d0 78 74 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20  xtFree++;.      
102e0 69 4e 65 78 74 4c 65 61 66 20 2b 3d 20 28 70 49  iNextLeaf += (pI
102f0 74 65 72 2d 3e 6e 45 6e 74 72 79 2b 31 29 3b 0a  ter->nEntry+1);.
10300 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
10310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10320 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4e 65       assert( iNe
10330 78 74 4c 65 61 66 3d 3d 69 46 72 65 65 20 29 3b  xtLeaf==iFree );
10340 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
10350 4e 6f 64 65 57 72 69 74 65 28 0a 20 20 20 20 20  NodeWrite(.     
10360 20 20 20 20 20 70 2c 20 70 54 72 65 65 2d 3e 70       p, pTree->p
10370 50 61 72 65 6e 74 2c 20 69 48 65 69 67 68 74 2b  Parent, iHeight+
10380 31 2c 20 69 46 72 65 65 2c 20 69 4e 65 78 74 46  1, iFree, iNextF
10390 72 65 65 2c 20 70 69 4c 61 73 74 2c 20 70 61 52  ree, piLast, paR
103a0 6f 6f 74 2c 20 70 6e 52 6f 6f 74 0a 20 20 20 20  oot, pnRoot.    
103b0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
103c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
103d0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
103e0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
103f0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
10400 68 20 74 68 65 20 74 72 65 65 20 70 54 72 65 65  h the tree pTree
10410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10420 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28 53 65   fts3NodeFree(Se
10430 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65  gmentNode *pTree
10440 29 7b 0a 20 20 69 66 28 20 70 54 72 65 65 20 29  ){.  if( pTree )
10450 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64  {.    SegmentNod
10460 65 20 2a 70 20 3d 20 70 54 72 65 65 2d 3e 70 4c  e *p = pTree->pL
10470 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 66 74 73  eftmost;.    fts
10480 33 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70 50 61  3NodeFree(p->pPa
10490 72 65 6e 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  rent);.    while
104a0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 53 65 67  ( p ){.      Seg
104b0 6d 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67 68 74  mentNode *pRight
104c0 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
104d0 20 20 20 20 69 66 28 20 70 2d 3e 61 44 61 74 61      if( p->aData
104e0 21 3d 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 20  !=(char *)&p[1] 
104f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10500 65 33 5f 66 72 65 65 28 70 2d 3e 61 44 61 74 61  e3_free(p->aData
10510 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10520 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 3d   assert( pRight=
10530 3d 30 20 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  =0 || p->zMalloc
10540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
10550 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 4d 61  ite3_free(p->zMa
10560 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 73 71 6c  lloc);.      sql
10570 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
10580 20 20 20 20 70 20 3d 20 70 52 69 67 68 74 3b 0a      p = pRight;.
10590 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
105a0 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f  ** Add a term to
105b0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69   the segment bei
105c0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
105d0 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69  y the SegmentWri
105e0 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 2a 70  ter object.** *p
105f0 70 57 72 69 74 65 72 2e 20 57 68 65 6e 20 61 64  pWriter. When ad
10600 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 74  ding the first t
10610 65 72 6d 20 74 6f 20 61 20 73 65 67 6d 65 6e 74  erm to a segment
10620 2c 20 2a 70 70 57 72 69 74 65 72 20 73 68 6f 75  , *ppWriter shou
10630 6c 64 0a 2a 2a 20 62 65 20 70 61 73 73 65 64 20  ld.** be passed 
10640 4e 55 4c 4c 2e 20 54 68 69 73 20 66 75 6e 63 74  NULL. This funct
10650 69 6f 6e 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74  ion will allocat
10660 65 20 61 20 6e 65 77 20 53 65 67 6d 65 6e 74 57  e a new SegmentW
10670 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  riter object.** 
10680 61 6e 64 20 72 65 74 75 72 6e 20 69 74 20 76 69  and return it vi
10690 61 20 74 68 65 20 69 6e 70 75 74 2f 6f 75 74 70  a the input/outp
106a0 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70 57  ut variable *ppW
106b0 72 69 74 65 72 20 69 6e 20 74 68 69 73 20 63 61  riter in this ca
106c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  se..**.** If suc
106d0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
106e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
106f0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
10700 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
10710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
10720 74 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28  ts3SegWriterAdd(
10730 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10750 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
10760 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
10770 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a  SegmentWriter **
10780 70 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  ppWriter,       
10790 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65  /* IN/OUT: Segme
107a0 6e 74 57 72 69 74 65 72 20 68 61 6e 64 6c 65 20  ntWriter handle 
107b0 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f 70 79  */ .  int isCopy
107c0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
107d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
107e0 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20 6d 75   buffer zTerm mu
107f0 73 74 20 62 65 20 63 6f 70 69 65 64 20 2a 2f 0a  st be copied */.
10800 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
10810 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
10820 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
10830 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
10840 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  g term */.  int 
10850 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
10860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10870 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62  ize of term in b
10880 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ytes */.  const 
10890 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20  char *aDoclist, 
108a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
108b0 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
108c0 6f 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c 69 73  ontaining doclis
108d0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c  t */.  int nDocl
108e0 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
108f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10900 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74  f doclist in byt
10910 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  es */.){.  int n
10920 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
10930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10940 7a 65 20 6f 66 20 74 65 72 6d 20 70 72 65 66 69  ze of term prefi
10950 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  x in bytes */.  
10960 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
10990 73 75 66 66 69 78 20 69 6e 20 62 79 74 65 73 20  suffix in bytes 
109a0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 71 3b 20 20  */.  int nReq;  
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
109d0 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
109e0 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 2a 2f   on leaf page */
109f0 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20  .  int nData;.  
10a00 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70  SegmentWriter *p
10a10 57 72 69 74 65 72 20 3d 20 2a 70 70 57 72 69 74  Writer = *ppWrit
10a20 65 72 3b 0a 0a 20 20 69 66 28 20 21 70 57 72 69  er;..  if( !pWri
10a30 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
10a40 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  c;.    sqlite3_s
10a50 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20  tmt *pStmt;..   
10a60 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
10a70 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 73   SegmentWriter s
10a80 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
10a90 70 57 72 69 74 65 72 20 3d 20 28 53 65 67 6d 65  pWriter = (Segme
10aa0 6e 74 57 72 69 74 65 72 20 2a 29 73 71 6c 69 74  ntWriter *)sqlit
10ab0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
10ac0 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29  (SegmentWriter))
10ad0 3b 0a 20 20 20 20 69 66 28 20 21 70 57 72 69 74  ;.    if( !pWrit
10ae0 65 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  er ) return SQLI
10af0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
10b00 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c  mset(pWriter, 0,
10b10 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57   sizeof(SegmentW
10b20 72 69 74 65 72 29 29 3b 0a 20 20 20 20 2a 70 70  riter));.    *pp
10b30 57 72 69 74 65 72 20 3d 20 70 57 72 69 74 65 72  Writer = pWriter
10b40 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
10b50 74 65 20 61 20 62 75 66 66 65 72 20 69 6e 20 77  te a buffer in w
10b60 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61  hich to accumula
10b70 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 70  te data */.    p
10b80 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20  Writer->aData = 
10b90 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
10ba0 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 4e 6f 64 65 53  malloc(p->nNodeS
10bb0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
10bc0 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20 29 20  Writer->aData ) 
10bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10be0 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 65 72  MEM;.    pWriter
10bf0 2d 3e 6e 53 69 7a 65 20 3d 20 70 2d 3e 6e 4e 6f  ->nSize = p->nNo
10c00 64 65 53 69 7a 65 3b 0a 0a 20 20 20 20 2f 2a 20  deSize;..    /* 
10c10 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 66 72  Find the next fr
10c20 65 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20 74 68  ee blockid in th
10c30 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
10c40 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
10c50 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
10c60 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f  L_NEXT_SEGMENTS_
10c70 49 44 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  ID, &pStmt, 0);.
10c80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10c90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
10ca0 63 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  c;.    if( SQLIT
10cb0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
10cc0 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
10cd0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 72      pWriter->iFr
10ce0 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ee = sqlite3_col
10cf0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
10d00 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74   0);.      pWrit
10d10 65 72 2d 3e 69 46 69 72 73 74 20 3d 20 70 57 72  er->iFirst = pWr
10d20 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20  iter->iFree;.   
10d30 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
10d40 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
10d50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10d60 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
10d70 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61 74 61   rc;.  }.  nData
10d80 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74   = pWriter->nDat
10d90 61 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d 20  a;..  nPrefix = 
10da0 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
10db0 73 73 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  ss(pWriter->zTer
10dc0 6d 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72  m, pWriter->nTer
10dd0 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
10de0 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54  ;.  nSuffix = nT
10df0 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20  erm-nPrefix;..  
10e00 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
10e10 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72 65  w many bytes are
10e20 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
10e30 73 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  s new entry */. 
10e40 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46   nReq = sqlite3F
10e50 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72  ts3VarintLen(nPr
10e60 65 66 69 78 29 20 2b 20 20 20 20 2f 2a 20 76 61  efix) +    /* va
10e70 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rint containing 
10e80 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20  prefix size */. 
10e90 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61     sqlite3Fts3Va
10ea0 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29  rintLen(nSuffix)
10eb0 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61   +         /* va
10ec0 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rint containing 
10ed0 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20  suffix size */. 
10ee0 20 20 20 6e 53 75 66 66 69 78 20 2b 20 20 20 20     nSuffix +    
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
10f10 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20  rm suffix */.   
10f20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
10f30 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20  ntLen(nDoclist) 
10f40 2b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  +        /* Size
10f50 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   of doclist */. 
10f60 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20     nDoclist;    
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
10f90 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 0a 20  clist data */.. 
10fa0 20 69 66 28 20 6e 44 61 74 61 3e 30 20 26 26 20   if( nData>0 && 
10fb0 6e 44 61 74 61 2b 6e 52 65 71 3e 70 2d 3e 6e 4e  nData+nReq>p->nN
10fc0 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  odeSize ){.    i
10fd0 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 54  nt rc;..    /* T
10fe0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
10ff0 6e 6f 64 65 20 69 73 20 66 75 6c 6c 2e 20 57 72  node is full. Wr
11000 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
11010 65 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20  e database. */. 
11020 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74     rc = fts3Writ
11030 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69  eSegment(p, pWri
11040 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57  ter->iFree++, pW
11050 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e 44  riter->aData, nD
11060 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ata);.    if( rc
11070 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
11080 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f 2a  turn rc;..    /*
11090 20 41 64 64 20 74 68 65 20 63 75 72 72 65 6e 74   Add the current
110a0 20 74 65 72 6d 20 74 6f 20 74 68 65 20 69 6e 74   term to the int
110b0 65 72 69 6f 72 20 6e 6f 64 65 20 74 72 65 65 2e  erior node tree.
110c0 20 54 68 65 20 74 65 72 6d 20 61 64 64 65 64 20   The term added 
110d0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  to.    ** the in
110e0 74 65 72 69 6f 72 20 74 72 65 65 20 6d 75 73 74  terior tree must
110f0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
11100 20 20 61 29 20 62 65 20 67 72 65 61 74 65 72 20    a) be greater 
11110 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
11120 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61   term on the lea
11130 66 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74  f node just writ
11140 74 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ten.    **      
11150 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
11160 28 73 74 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65  (still available
11170 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 7a 54 65   in pWriter->zTe
11180 72 6d 29 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 0a  rm), and.    **.
11190 20 20 20 20 2a 2a 20 20 20 62 29 20 62 65 20 6c      **   b) be l
111a0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
111b0 6c 20 74 6f 20 74 68 65 20 74 65 72 6d 20 61 62  l to the term ab
111c0 6f 75 74 20 74 6f 20 62 65 20 61 64 64 65 64 20  out to be added 
111d0 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
111e0 2a 20 20 20 20 20 20 6c 65 61 66 20 6e 6f 64 65  *      leaf node
111f0 20 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a   (zTerm/nTerm)..
11200 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
11210 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
11220 20 6d 75 73 74 20 62 65 20 74 68 65 20 70 72 65   must be the pre
11230 66 69 78 20 6f 66 20 7a 54 65 72 6d 20 31 20 62  fix of zTerm 1 b
11240 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a  yte longer than.
11250 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 6d 6f      ** the commo
11260 6e 20 70 72 65 66 69 78 20 28 69 66 20 61 6e 79  n prefix (if any
11270 29 20 6f 66 20 7a 54 65 72 6d 20 61 6e 64 20 70  ) of zTerm and p
11280 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2e 0a 20  Writer->zTerm.. 
11290 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
112a0 28 20 6e 50 72 65 66 69 78 3c 6e 54 65 72 6d 20  ( nPrefix<nTerm 
112b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  );.    rc = fts3
112c0 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26  NodeAddTerm(p, &
112d0 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 2c 20  pWriter->pTree, 
112e0 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72  isCopyTerm, zTer
112f0 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b 0a 20  m, nPrefix+1);. 
11300 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11310 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
11320 3b 0a 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  ;..    nData = 0
11330 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e  ;.    pWriter->n
11340 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 6e  Term = 0;..    n
11350 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20  Prefix = 0;.    
11360 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b  nSuffix = nTerm;
11370 0a 20 20 20 20 6e 52 65 71 20 3d 20 31 20 2b 20  .    nReq = 1 + 
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
113a0 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
113b0 67 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f  g prefix size */
113c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
113d0 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 54 65 72  s3VarintLen(nTer
113e0 6d 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  m) +         /* 
113f0 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
11400 67 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f  g suffix size */
11410 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 2b 20 20  .      nTerm +  
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11440 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20  Term suffix */. 
11450 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33       sqlite3Fts3
11460 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69  VarintLen(nDocli
11470 73 74 29 20 2b 20 20 20 20 20 20 2f 2a 20 53 69  st) +      /* Si
11480 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f  ze of doclist */
11490 0a 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b  .      nDoclist;
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114c0 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a  Doclist data */.
114d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
114e0 20 62 75 66 66 65 72 20 63 75 72 72 65 6e 74 6c   buffer currentl
114f0 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 73 20 74  y allocated is t
11500 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 69  oo small for thi
11510 73 20 65 6e 74 72 79 2c 20 72 65 61 6c 6c 6f 63  s entry, realloc
11520 0a 20 20 2a 2a 20 74 68 65 20 62 75 66 66 65 72  .  ** the buffer
11530 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 61 72 67   to make it larg
11540 65 20 65 6e 6f 75 67 68 2e 0a 20 20 2a 2f 0a 20  e enough..  */. 
11550 20 69 66 28 20 6e 52 65 71 3e 70 57 72 69 74 65   if( nReq>pWrite
11560 72 2d 3e 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20  r->nSize ){.    
11570 63 68 61 72 20 2a 61 4e 65 77 20 3d 20 73 71 6c  char *aNew = sql
11580 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72  ite3_realloc(pWr
11590 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e 52 65  iter->aData, nRe
115a0 71 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65  q);.    if( !aNe
115b0 77 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  w ) return SQLIT
115c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72  E_NOMEM;.    pWr
115d0 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 4e  iter->aData = aN
115e0 65 77 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  ew;.    pWriter-
115f0 3e 6e 53 69 7a 65 20 3d 20 6e 52 65 71 3b 0a 20  >nSize = nReq;. 
11600 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61   }.  assert( nDa
11610 74 61 2b 6e 52 65 71 3c 3d 70 57 72 69 74 65 72  ta+nReq<=pWriter
11620 2d 3e 6e 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a  ->nSize );..  /*
11630 20 41 70 70 65 6e 64 20 74 68 65 20 70 72 65 66   Append the pref
11640 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 74 65  ix-compressed te
11650 72 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74 20 74  rm and doclist t
11660 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 2a 2f  o the buffer. */
11670 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69  .  nData += sqli
11680 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
11690 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  (&pWriter->aData
116a0 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66 69 78  [nData], nPrefix
116b0 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71  );.  nData += sq
116c0 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
116d0 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61  nt(&pWriter->aDa
116e0 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66  ta[nData], nSuff
116f0 69 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  ix);.  memcpy(&p
11700 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
11710 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72  ata], &zTerm[nPr
11720 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b  efix], nSuffix);
11730 0a 20 20 6e 44 61 74 61 20 2b 3d 20 6e 53 75 66  .  nData += nSuf
11740 66 69 78 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20  fix;.  nData += 
11750 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
11760 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61  rint(&pWriter->a
11770 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 44 6f  Data[nData], nDo
11780 63 6c 69 73 74 29 3b 0a 20 20 6d 65 6d 63 70 79  clist);.  memcpy
11790 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  (&pWriter->aData
117a0 5b 6e 44 61 74 61 5d 2c 20 61 44 6f 63 6c 69 73  [nData], aDoclis
117b0 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
117c0 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 20 3d  pWriter->nData =
117d0 20 6e 44 61 74 61 20 2b 20 6e 44 6f 63 6c 69 73   nData + nDoclis
117e0 74 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68  t;..  /* Save th
117f0 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 73  e current term s
11800 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
11810 20 75 73 65 64 20 74 6f 20 70 72 65 66 69 78 2d   used to prefix-
11820 63 6f 6d 70 72 65 73 73 20 74 68 65 20 6e 65 78  compress the nex
11830 74 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  t..  ** If the i
11840 73 43 6f 70 79 54 65 72 6d 20 70 61 72 61 6d 65  sCopyTerm parame
11850 74 65 72 20 69 73 20 74 72 75 65 2c 20 74 68 65  ter is true, the
11860 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
11870 6e 74 65 64 20 74 6f 20 62 79 0a 20 20 2a 2a 20  nted to by.  ** 
11880 7a 54 65 72 6d 20 69 73 20 74 72 61 6e 73 69 65  zTerm is transie
11890 6e 74 2c 20 73 6f 20 74 61 6b 65 20 61 20 63 6f  nt, so take a co
118a0 70 79 20 6f 66 20 74 68 65 20 74 65 72 6d 20 64  py of the term d
118b0 61 74 61 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ata. Otherwise, 
118c0 6a 75 73 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20  just.  ** store 
118d0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f  a copy of the po
118e0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  inter..  */.  if
118f0 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a  ( isCopyTerm ){.
11900 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3e 70 57      if( nTerm>pW
11910 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 29  riter->nMalloc )
11920 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
11930 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
11940 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 7a 4d  lloc(pWriter->zM
11950 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b  alloc, nTerm*2);
11960 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77  .      if( !zNew
11970 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
11980 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
11990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
119a0 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20  Writer->nMalloc 
119b0 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20  = nTerm*2;.     
119c0 20 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f   pWriter->zMallo
119d0 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20  c = zNew;.      
119e0 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d  pWriter->zTerm =
119f0 20 7a 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20   zNew;.    }.   
11a00 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
11a10 2d 3e 7a 54 65 72 6d 3d 3d 70 57 72 69 74 65 72  ->zTerm==pWriter
11a20 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20 20  ->zMalloc );.   
11a30 20 6d 65 6d 63 70 79 28 70 57 72 69 74 65 72 2d   memcpy(pWriter-
11a40 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e  >zTerm, zTerm, n
11a50 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Term);.  }else{.
11a60 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54 65      pWriter->zTe
11a70 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65  rm = (char *)zTe
11a80 72 6d 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65  rm;.  }.  pWrite
11a90 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d  r->nTerm = nTerm
11aa0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
11ab0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11ac0 46 6c 75 73 68 20 61 6c 6c 20 64 61 74 61 20 61  Flush all data a
11ad0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
11ae0 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  he SegmentWriter
11af0 20 6f 62 6a 65 63 74 20 70 57 72 69 74 65 72 20   object pWriter 
11b00 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
11b10 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
11b20 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  n must be called
11b30 20 61 66 74 65 72 20 61 6c 6c 20 74 65 72 6d 73   after all terms
11b40 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
11b50 0a 2a 2a 20 74 6f 20 74 68 65 20 73 65 67 6d 65  .** to the segme
11b60 6e 74 20 75 73 69 6e 67 20 66 74 73 33 53 65 67  nt using fts3Seg
11b70 57 72 69 74 65 72 41 64 64 28 29 2e 20 49 66 20  WriterAdd(). If 
11b80 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
11b90 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75  TE_OK is.** retu
11ba0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
11bb0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
11bc0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
11bd0 20 69 6e 74 20 66 74 73 33 53 65 67 57 72 69 74   int fts3SegWrit
11be0 65 72 46 6c 75 73 68 28 0a 20 20 46 74 73 33 54  erFlush(.  Fts3T
11bf0 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
11c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
11c10 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
11c20 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57  le */.  SegmentW
11c30 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
11c40 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
11c50 6e 74 57 72 69 74 65 72 20 74 6f 20 66 6c 75 73  ntWriter to flus
11c60 68 20 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20  h to the db */. 
11c70 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c90 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 27 6c   /* Value for 'l
11ca0 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel' column of 
11cb0 25 5f 73 65 67 64 69 72 20 2a 2f 0a 20 20 69 6e  %_segdir */.  in
11cc0 74 20 69 49 64 78 20 20 20 20 20 20 20 20 20 20  t iIdx          
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ce0 20 56 61 6c 75 65 20 66 6f 72 20 27 69 64 78 27   Value for 'idx'
11cf0 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67   column of %_seg
11d00 64 69 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  dir */.){.  int 
11d10 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11d30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
11d40 69 66 28 20 70 57 72 69 74 65 72 2d 3e 70 54 72  if( pWriter->pTr
11d50 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
11d60 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 20 3d 20  3_int64 iLast = 
11d70 30 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65  0;      /* Large
11d80 73 74 20 62 6c 6f 63 6b 20 69 64 20 77 72 69 74  st block id writ
11d90 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
11da0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
11db0 6e 74 36 34 20 69 4c 61 73 74 4c 65 61 66 3b 20  nt64 iLastLeaf; 
11dc0 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
11dd0 6c 65 61 66 20 62 6c 6f 63 6b 20 69 64 20 77 72  leaf block id wr
11de0 69 74 74 65 6e 20 74 6f 20 64 62 20 2a 2f 0a 20  itten to db */. 
11df0 20 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d     char *zRoot =
11e00 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20   NULL;          
11e10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
11e20 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
11e30 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
11e40 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 30 3b    int nRoot = 0;
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
11e70 72 20 7a 52 6f 6f 74 20 2a 2f 0a 0a 20 20 20 20  r zRoot */..    
11e80 69 4c 61 73 74 4c 65 61 66 20 3d 20 70 57 72 69  iLastLeaf = pWri
11e90 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20  ter->iFree;.    
11ea0 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
11eb0 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65 72  gment(p, pWriter
11ec0 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72 69 74  ->iFree++, pWrit
11ed0 65 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69 74  er->aData, pWrit
11ee0 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20  er->nData);.    
11ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11f00 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
11f10 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 70 2c  fts3NodeWrite(p,
11f20 20 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 2c   pWriter->pTree,
11f30 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 70 57   1,.          pW
11f40 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c 20 70  riter->iFirst, p
11f50 57 72 69 74 65 72 2d 3e 69 46 72 65 65 2c 20 26  Writer->iFree, &
11f60 69 4c 61 73 74 2c 20 26 7a 52 6f 6f 74 2c 20 26  iLast, &zRoot, &
11f70 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nRoot);.    }.  
11f80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11f90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
11fa0 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69  = fts3WriteSegdi
11fb0 72 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20  r(.          p, 
11fc0 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 70 57  iLevel, iIdx, pW
11fd0 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c 20 69  riter->iFirst, i
11fe0 4c 61 73 74 4c 65 61 66 2c 20 69 4c 61 73 74 2c  LastLeaf, iLast,
11ff0 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a   zRoot, nRoot);.
12000 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
12010 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
12020 20 74 72 65 65 20 66 69 74 73 20 6f 6e 20 74 68   tree fits on th
12030 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 57 72 69  e root node. Wri
12040 74 65 20 69 74 20 74 6f 20 74 68 65 20 73 65 67  te it to the seg
12050 64 69 72 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  dir table. */.  
12060 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
12070 53 65 67 64 69 72 28 0a 20 20 20 20 20 20 20 20  Segdir(.        
12080 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c  p, iLevel, iIdx,
12090 20 30 2c 20 30 2c 20 30 2c 20 70 57 72 69 74 65   0, 0, 0, pWrite
120a0 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69 74 65  r->aData, pWrite
120b0 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20  r->nData);.  }. 
120c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
120d0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
120e0 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
120f0 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65  the SegmentWrite
12100 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
12110 61 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  as the .** first
12120 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
12130 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65  atic void fts3Se
12140 67 57 72 69 74 65 72 46 72 65 65 28 53 65 67 6d  gWriterFree(Segm
12150 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74  entWriter *pWrit
12160 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74  er){.  if( pWrit
12170 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
12180 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e  3_free(pWriter->
12190 61 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  aData);.    sqli
121a0 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
121b0 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
121c0 66 74 73 33 4e 6f 64 65 46 72 65 65 28 70 57 72  fts3NodeFree(pWr
121d0 69 74 65 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20  iter->pTree);.  
121e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
121f0 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  Writer);.  }.}..
12200 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
12210 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 70 56  value in the apV
12220 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73  al[] array is as
12230 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
12240 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20   an integer..** 
12250 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 65  This function te
12260 73 74 73 20 69 66 20 74 68 65 72 65 20 65 78 69  sts if there exi
12270 73 74 20 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73  st any documents
12280 20 77 69 74 68 20 64 6f 63 69 64 20 76 61 6c 75   with docid valu
12290 65 73 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 64  es that.** are d
122a0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
122b0 61 74 20 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e  at integer. i.e.
122c0 20 69 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   if deleting the
122d0 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64   document with d
122e0 6f 63 69 64 0a 2a 2a 20 70 52 6f 77 69 64 20 77  ocid.** pRowid w
122f0 6f 75 6c 64 20 6d 65 61 6e 20 74 68 65 20 46 54  ould mean the FT
12300 53 33 20 74 61 62 6c 65 20 77 65 72 65 20 65 6d  S3 table were em
12310 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  pty..**.** If su
12320 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d  ccessful, *pisEm
12330 70 74 79 20 69 73 20 73 65 74 20 74 6f 20 74 72  pty is set to tr
12340 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
12350 69 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20  is empty except 
12360 66 6f 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20  for.** document 
12370 70 52 6f 77 69 64 2c 20 6f 72 20 66 61 6c 73 65  pRowid, or false
12380 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20   otherwise, and 
12390 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
123a0 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20  urned. If an.** 
123b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
123c0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
123d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
123e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
123f0 73 33 49 73 45 6d 70 74 79 28 46 74 73 33 54 61  s3IsEmpty(Fts3Ta
12400 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ble *p, sqlite3_
12410 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 69  value *pRowid, i
12420 6e 74 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20  nt *pisEmpty){. 
12430 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12440 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
12450 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e    if( p->zConten
12460 74 54 62 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tTbl ){.    /* I
12470 66 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74  f using the cont
12480 65 6e 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20  ent=xxx option, 
12490 61 73 73 75 6d 65 20 74 68 65 20 74 61 62 6c 65  assume the table
124a0 20 69 73 20 6e 65 76 65 72 20 65 6d 70 74 79 20   is never empty 
124b0 2a 2f 0a 20 20 20 20 2a 70 69 73 45 6d 70 74 79  */.    *pisEmpty
124c0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 0;.    rc = S
124d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
124e0 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  e{.    rc = fts3
124f0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49  SqlStmt(p, SQL_I
12500 53 5f 45 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c  S_EMPTY, &pStmt,
12510 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69   &pRowid);.    i
12520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12530 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
12540 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
12550 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
12560 0a 20 20 20 20 20 20 20 20 2a 70 69 73 45 6d 70  .        *pisEmp
12570 74 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ty = sqlite3_col
12580 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
12590 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
125a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
125b0 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
125c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
125d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
125e0 2a 70 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c 61  *pnMax to the la
125f0 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65  rgest segment le
12600 76 65 6c 20 69 6e 20 74 68 65 20 64 61 74 61 62  vel in the datab
12610 61 73 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ase for the inde
12620 78 0a 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a 0a  x.** iIndex..**.
12630 2a 2a 20 53 65 67 6d 65 6e 74 20 6c 65 76 65 6c  ** Segment level
12640 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
12650 74 68 65 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75  the 'level' colu
12660 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64  mn of the %_segd
12670 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ir table..**.** 
12680 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
12690 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
126a0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
126b0 6f 72 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a  or code if not..
126c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
126d0 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65  s3SegmentMaxLeve
126e0 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  l(.  Fts3Table *
126f0 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69  p, .  int iLangi
12700 64 2c 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  d,.  int iIndex,
12710 20 0a 20 20 69 6e 74 20 2a 70 6e 4d 61 78 0a 29   .  int *pnMax.)
12720 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
12730 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
12740 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e  c;.  assert( iIn
12750 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78  dex>=0 && iIndex
12760 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20  <p->nIndex );.. 
12770 20 2f 2a 20 53 65 74 20 70 53 74 6d 74 20 74 6f   /* Set pStmt to
12780 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 76 65   the compiled ve
12790 72 73 69 6f 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20  rsion of:.  **. 
127a0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
127b0 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e  (level) FROM %Q.
127c0 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
127d0 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20  E level BETWEEN 
127e0 3f 20 41 4e 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a  ? AND ?.  **.  *
127f0 2a 20 28 31 30 32 34 20 69 73 20 61 63 74 75 61  * (1024 is actua
12800 6c 6c 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66  lly the value of
12810 20 6d 61 63 72 6f 20 46 54 53 33 5f 53 45 47 44   macro FTS3_SEGD
12820 49 52 5f 50 52 45 46 49 58 4c 45 56 45 4c 5f 53  IR_PREFIXLEVEL_S
12830 54 52 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  TR)..  */.  rc =
12840 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
12850 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49  SQL_SELECT_SEGDI
12860 52 5f 4d 41 58 5f 4c 45 56 45 4c 2c 20 26 70 53  R_MAX_LEVEL, &pS
12870 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
12880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
12890 65 74 75 72 6e 20 72 63 3b 0a 20 20 73 71 6c 69  eturn rc;.  sqli
128a0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
128b0 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75  mt, 1, getAbsolu
128c0 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
128d0 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b  id, iIndex, 0));
128e0 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
128f0 69 6e 74 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20  int(pStmt, 2, . 
12900 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65       getAbsolute
12910 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
12920 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53  , iIndex, FTS3_S
12930 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31  EGDIR_MAXLEVEL-1
12940 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ).  );.  if( SQL
12950 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
12960 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
12970 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71 6c      *pnMax = sql
12980 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
12990 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pStmt, 0);.  }. 
129a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
129b0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a  reset(pStmt);.}.
129c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
129d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 66 74  tion is used aft
129e0 65 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74 69  er merging multi
129f0 70 6c 65 20 73 65 67 6d 65 6e 74 73 20 69 6e 74  ple segments int
12a00 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65  o a single large
12a10 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 64  .** segment to d
12a20 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c 20 6e  elete the old, n
12a30 6f 77 20 72 65 64 75 6e 64 61 6e 74 2c 20 73 65  ow redundant, se
12a40 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 53  gment b-trees. S
12a50 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a 20  pecifically,.** 
12a60 69 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29 20  it:.** .**   1) 
12a70 44 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65  Deletes all %_se
12a80 67 6d 65 6e 74 73 20 65 6e 74 72 69 65 73 20 66  gments entries f
12a90 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20  or the segments 
12aa0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12ab0 0a 2a 2a 20 20 20 20 20 20 65 61 63 68 20 6f 66  .**      each of
12ac0 20 74 68 65 20 53 65 67 52 65 61 64 65 72 20 6f   the SegReader o
12ad0 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 61 72  bjects in the ar
12ae0 72 61 79 20 70 61 73 73 65 64 20 61 73 20 74 68  ray passed as th
12af0 65 20 74 68 69 72 64 20 0a 2a 2a 20 20 20 20 20  e third .**     
12b00 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a 2a   argument, and.*
12b10 2a 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65 74 65  *.**   2) delete
12b20 73 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 20 65  s all %_segdir e
12b30 6e 74 72 69 65 73 20 77 69 74 68 20 6c 65 76 65  ntries with leve
12b40 6c 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c 6c  l iLevel, or all
12b50 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20 20   %_segdir.**    
12b60 20 20 65 6e 74 72 69 65 73 20 72 65 67 61 72 64    entries regard
12b70 6c 65 73 73 20 6f 66 20 6c 65 76 65 6c 20 69 66  less of level if
12b80 20 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a 0a   (iLevel<0)..**.
12b90 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
12ba0 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
12bb0 65 73 73 66 75 6c 2c 20 6f 74 68 65 72 77 69 73  essful, otherwis
12bc0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
12bd0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
12be0 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65  c int fts3Delete
12bf0 53 65 67 64 69 72 28 0a 20 20 46 74 73 33 54 61  Segdir(.  Fts3Ta
12c00 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
12c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
12c20 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
12c30 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  e */.  int iLang
12c40 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
12c50 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61         /* Langua
12c60 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ge id */.  int i
12c70 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
12c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12c90 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65  dex for p->aInde
12ca0 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  x */.  int iLeve
12cb0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
12cc0 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
12cd0 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72  of %_segdir entr
12ce0 69 65 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ies to delete */
12cf0 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
12d00 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20   **apSegment,   
12d10 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 53     /* Array of S
12d20 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73  egReader objects
12d30 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 65   */.  int nReade
12d40 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
12d50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12d60 20 61 72 72 61 79 20 61 70 53 65 67 6d 65 6e 74   array apSegment
12d70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
12da0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
12db0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12dd0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
12de0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
12df0 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20 20 20  tmt *pDelete;   
12e00 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
12e10 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74  atement to delet
12e20 65 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 72 63 20  e rows */..  rc 
12e30 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
12e40 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d   SQL_DELETE_SEGM
12e50 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70 44 65  ENTS_RANGE, &pDe
12e60 6c 65 74 65 2c 20 30 29 3b 0a 20 20 66 6f 72 28  lete, 0);.  for(
12e70 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
12e80 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64 65 72 3b  OK && i<nReader;
12e90 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53   i++){.    Fts3S
12ea0 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 6d 65  egReader *pSegme
12eb0 6e 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69  nt = apSegment[i
12ec0 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 6d  ];.    if( pSegm
12ed0 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b  ent->iStartBlock
12ee0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12ef0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65  3_bind_int64(pDe
12f00 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 6d 65 6e  lete, 1, pSegmen
12f10 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b  t->iStartBlock);
12f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
12f30 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74  ind_int64(pDelet
12f40 65 2c 20 32 2c 20 70 53 65 67 6d 65 6e 74 2d 3e  e, 2, pSegment->
12f50 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  iEndBlock);.    
12f60 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
12f70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 72  Delete);.      r
12f80 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
12f90 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20  t(pDelete);.    
12fa0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  }.  }.  if( rc!=
12fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
12fd0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65  .  assert( iLeve
12fe0 6c 3e 3d 30 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d  l>=0 || iLevel==
12ff0 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41  FTS3_SEGCURSOR_A
13000 4c 4c 20 29 3b 0a 20 20 69 66 28 20 69 4c 65 76  LL );.  if( iLev
13010 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
13020 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 63  OR_ALL ){.    rc
13030 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
13040 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47  , SQL_DELETE_SEG
13050 44 49 52 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c  DIR_RANGE, &pDel
13060 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ete, 0);.    if(
13070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13080 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
13090 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65  bind_int(pDelete
130a0 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65  , 1, getAbsolute
130b0 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
130c0 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20  , iIndex, 0));. 
130d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
130e0 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c 20 32  d_int(pDelete, 2
130f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  , .          get
13100 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
13110 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
13120 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  , FTS3_SEGDIR_MA
13130 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20 20 20 20  XLEVEL-1).      
13140 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
13150 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
13160 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45  qlStmt(p, SQL_DE
13170 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45  LETE_SEGDIR_LEVE
13180 4c 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b  L, &pDelete, 0);
13190 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
131a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
131b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
131c0 28 70 44 65 6c 65 74 65 2c 20 31 2c 20 67 65 74  (pDelete, 1, get
131d0 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
131e0 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
131f0 2c 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 7d  ,iLevel));.    }
13200 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
13210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13220 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44   sqlite3_step(pD
13230 65 6c 65 74 65 29 3b 0a 20 20 20 20 72 63 20 3d  elete);.    rc =
13240 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
13250 44 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20  Delete);.  }..  
13260 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13270 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
13280 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13290 2c 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74  , buffer *ppList
132a0 20 28 73 69 7a 65 20 2a 70 6e 4c 69 73 74 20 62   (size *pnList b
132b0 79 74 65 73 29 20 63 6f 6e 74 61 69 6e 73 20 0a  ytes) contains .
132c0 2a 2a 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69  ** a position li
132d0 73 74 20 74 68 61 74 20 6d 61 79 20 28 6f 72 20  st that may (or 
132e0 6d 61 79 20 6e 6f 74 29 20 66 65 61 74 75 72 65  may not) feature
132f0 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e   multiple column
13300 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  s. This.** funct
13310 69 6f 6e 20 61 64 6a 75 73 74 73 20 74 68 65 20  ion adjusts the 
13320 70 6f 69 6e 74 65 72 20 2a 70 70 4c 69 73 74 20  pointer *ppList 
13330 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 20 2a  and the length *
13340 70 6e 4c 69 73 74 20 73 6f 20 74 68 61 74 20 74  pnList so that t
13350 68 65 79 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20  hey.** identify 
13360 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 68  the subset of th
13370 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
13380 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
13390 20 74 6f 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e   to column iCol.
133a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
133b0 61 72 65 20 6e 6f 20 65 6e 74 72 69 65 73 20 69  are no entries i
133c0 6e 20 74 68 65 20 69 6e 70 75 74 20 70 6f 73 69  n the input posi
133d0 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 63 6f  tion list for co
133e0 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 0a  lumn iCol, then.
133f0 2a 2a 20 2a 70 6e 4c 69 73 74 20 69 73 20 73 65  ** *pnList is se
13400 74 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72 65  t to zero before
13410 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
13420 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 43  tatic void fts3C
13430 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20 20 69  olumnFilter(.  i
13440 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13460 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c 74  * Column to filt
13470 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  er on */.  char 
13480 2a 2a 70 70 4c 69 73 74 2c 20 20 20 20 20 20 20  **ppList,       
13490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
134a0 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f  /OUT: Pointer to
134b0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
134c0 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74 20  /.  int *pnList 
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134e0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
134f0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 2a 70  ize of buffer *p
13500 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  pList in bytes *
13510 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 4c 69  /.){.  char *pLi
13520 73 74 20 3d 20 2a 70 70 4c 69 73 74 3b 0a 20 20  st = *ppList;.  
13530 69 6e 74 20 6e 4c 69 73 74 20 3d 20 2a 70 6e 4c  int nList = *pnL
13540 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e  ist;.  char *pEn
13550 64 20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74  d = &pList[nList
13560 5d 3b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  ];.  int iCurren
13570 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 70  t = 0;.  char *p
13580 20 3d 20 70 4c 69 73 74 3b 0a 0a 20 20 61 73 73   = pList;..  ass
13590 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
135a0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
135b0 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 20 20    char c = 0;.  
135c0 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20    while( p<pEnd 
135d0 26 26 20 28 63 20 7c 20 2a 70 29 26 30 78 46 45  && (c | *p)&0xFE
135e0 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78   ) c = *p++ & 0x
135f0 38 30 3b 0a 20 20 0a 20 20 20 20 69 66 28 20 69  80;.  .    if( i
13600 43 6f 6c 3d 3d 69 43 75 72 72 65 6e 74 20 29 7b  Col==iCurrent ){
13610 0a 20 20 20 20 20 20 6e 4c 69 73 74 20 3d 20 28  .      nList = (
13620 69 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b  int)(p - pList);
13630 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13640 20 20 7d 0a 0a 20 20 20 20 6e 4c 69 73 74 20 2d    }..    nList -
13650 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69 73  = (int)(p - pLis
13660 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
13670 70 3b 0a 20 20 20 20 69 66 28 20 6e 4c 69 73 74  p;.    if( nList
13680 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
13690 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ak;.    }.    p 
136a0 3d 20 26 70 4c 69 73 74 5b 31 5d 3b 0a 20 20 20  = &pList[1];.   
136b0 20 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   p += sqlite3Fts
136c0 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20  3GetVarint32(p, 
136d0 26 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  &iCurrent);.  }.
136e0 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20 70 4c 69  .  *ppList = pLi
136f0 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74 20 3d 20  st;.  *pnList = 
13700 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nList;.}../*.** 
13710 43 61 63 68 65 20 64 61 74 61 20 69 6e 20 74 68  Cache data in th
13720 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  e Fts3MultiSegRe
13730 61 64 65 72 2e 61 42 75 66 66 65 72 5b 5d 20 62  ader.aBuffer[] b
13740 75 66 66 65 72 20 28 6f 76 65 72 77 72 69 74 69  uffer (overwriti
13750 6e 67 20 61 6e 79 0a 2a 2a 20 65 78 69 73 74 69  ng any.** existi
13760 6e 67 20 64 61 74 61 29 2e 20 47 72 6f 77 20 74  ng data). Grow t
13770 68 65 20 62 75 66 66 65 72 20 69 66 20 72 65 71  he buffer if req
13780 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
13790 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
137a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
137b0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f  herwise, if an O
137c0 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
137d0 75 6e 74 65 72 65 64 0a 2a 2a 20 74 72 79 69 6e  untered.** tryin
137e0 67 20 74 6f 20 72 65 73 69 7a 65 20 74 68 65 20  g to resize the 
137f0 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 20 53  buffer, return S
13800 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
13810 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4d  static int fts3M
13820 73 72 42 75 66 66 65 72 44 61 74 61 28 0a 20 20  srBufferData(.  
13830 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
13840 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20 20  er *pMsr,       
13850 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74  /* Multi-segment
13860 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20 2a  -reader handle *
13870 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74 2c  /.  char *pList,
13880 0a 20 20 69 6e 74 20 6e 4c 69 73 74 0a 29 7b 0a  .  int nList.){.
13890 20 20 69 66 28 20 6e 4c 69 73 74 3e 70 4d 73 72    if( nList>pMsr
138a0 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20 20 20  ->nBuffer ){.   
138b0 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a 20 20 20   char *pNew;.   
138c0 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d   pMsr->nBuffer =
138d0 20 6e 4c 69 73 74 2a 32 3b 0a 20 20 20 20 70 4e   nList*2;.    pN
138e0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
138f0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4d 73  ite3_realloc(pMs
13900 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 4d 73 72  r->aBuffer, pMsr
13910 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20 20 20 20  ->nBuffer);.    
13920 69 66 28 20 21 70 4e 65 77 20 29 20 72 65 74 75  if( !pNew ) retu
13930 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13940 0a 20 20 20 20 70 4d 73 72 2d 3e 61 42 75 66 66  .    pMsr->aBuff
13950 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a  er = pNew;.  }..
13960 20 20 6d 65 6d 63 70 79 28 70 4d 73 72 2d 3e 61    memcpy(pMsr->a
13970 42 75 66 66 65 72 2c 20 70 4c 69 73 74 2c 20 6e  Buffer, pList, n
13980 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
13990 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
139a0 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72  t sqlite3Fts3Msr
139b0 49 6e 63 72 4e 65 78 74 28 0a 20 20 46 74 73 33  IncrNext(.  Fts3
139c0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
139d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
139e0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
139f0 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
13a00 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 4d 73  tiSegReader *pMs
13a10 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74  r,       /* Mult
13a20 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72  i-segment-reader
13a30 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
13a40 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f  ite3_int64 *piDo
13a50 63 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  cid,         /* 
13a60 4f 55 54 3a 20 44 6f 63 69 64 20 76 61 6c 75 65  OUT: Docid value
13a70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 50   */.  char **paP
13a80 6f 73 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20  oslist,         
13a90 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
13aa0 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f  inter to positio
13ab0 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n list */.  int 
13ac0 2a 70 6e 50 6f 73 6c 69 73 74 20 20 20 20 20 20  *pnPoslist      
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13ae0 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69  UT: Size of posi
13af0 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62 79 74  tion list in byt
13b00 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  es */.){.  int n
13b10 4d 65 72 67 65 20 3d 20 70 4d 73 72 2d 3e 6e 41  Merge = pMsr->nA
13b20 64 76 61 6e 63 65 3b 0a 20 20 46 74 73 33 53 65  dvance;.  Fts3Se
13b30 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d  gReader **apSegm
13b40 65 6e 74 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65  ent = pMsr->apSe
13b50 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78  gment;.  int (*x
13b60 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64  Cmp)(Fts3SegRead
13b70 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61  er *, Fts3SegRea
13b80 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70  der *) = (.    p
13b90 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73  ->bDescIdx ? fts
13ba0 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
13bb0 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65  tCmpRev : fts3Se
13bc0 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
13bd0 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 6e 4d  p.  );..  if( nM
13be0 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  erge==0 ){.    *
13bf0 70 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20  paPoslist = 0;. 
13c00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13c10 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  _OK;.  }..  whil
13c20 65 28 20 31 20 29 7b 0a 20 20 20 20 46 74 73 33  e( 1 ){.    Fts3
13c30 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 3b  SegReader *pSeg;
13c40 0a 20 20 20 20 70 53 65 67 20 3d 20 70 4d 73 72  .    pSeg = pMsr
13c50 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 30 5d 3b 0a  ->apSegment[0];.
13c60 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
13c70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 20 29 7b  OffsetList==0 ){
13c80 0a 20 20 20 20 20 20 2a 70 61 50 6f 73 6c 69 73  .      *paPoslis
13c90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  t = 0;.      bre
13ca0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
13cb0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
13cc0 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 3b 0a     char *pList;.
13cd0 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
13ce0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
13cf0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
13d00 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67  4 iDocid = apSeg
13d10 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b  ment[0]->iDocid;
13d20 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ..      rc = fts
13d30 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f  3SegReaderNextDo
13d40 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74  cid(p, apSegment
13d50 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  [0], &pList, &nL
13d60 69 73 74 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20  ist);.      j = 
13d70 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
13d80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
13d90 20 20 20 20 20 20 20 26 26 20 6a 3c 6e 4d 65 72         && j<nMer
13da0 67 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  ge.        && ap
13db0 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66  Segment[j]->pOff
13dc0 73 65 74 4c 69 73 74 0a 20 20 20 20 20 20 20 20  setList.        
13dd0 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
13de0 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a  >iDocid==iDocid.
13df0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13e00 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
13e10 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20  derNextDocid(p, 
13e20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c  apSegment[j], 0,
13e30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b   0);.        j++
13e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13e50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13e60 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
13e70 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
13e80 65 72 53 6f 72 74 28 70 4d 73 72 2d 3e 61 70 53  erSort(pMsr->apS
13e90 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20  egment, nMerge, 
13ea0 6a 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 20 20 20  j, xCmp);..     
13eb0 20 69 66 28 20 70 4d 73 72 2d 3e 69 43 6f 6c 46   if( pMsr->iColF
13ec0 69 6c 74 65 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ilter>=0 ){.    
13ed0 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69      fts3ColumnFi
13ee0 6c 74 65 72 28 70 4d 73 72 2d 3e 69 43 6f 6c 46  lter(pMsr->iColF
13ef0 69 6c 74 65 72 2c 20 26 70 4c 69 73 74 2c 20 26  ilter, &pList, &
13f00 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  nList);.      }.
13f10 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73 74  .      if( nList
13f20 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  >0 ){.        if
13f30 28 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  ( fts3SegReaderI
13f40 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65  sPending(apSegme
13f50 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  nt[0]) ){.      
13f60 20 20 20 20 72 63 20 3d 20 66 74 73 33 4d 73 72      rc = fts3Msr
13f70 42 75 66 66 65 72 44 61 74 61 28 70 4d 73 72 2c  BufferData(pMsr,
13f80 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2b 31 29   pList, nList+1)
13f90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
13fa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
13fb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13fc0 20 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20       *paPoslist 
13fd0 3d 20 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 3b  = pMsr->aBuffer;
13fe0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
13ff0 74 28 20 28 70 4d 73 72 2d 3e 61 42 75 66 66 65  t( (pMsr->aBuffe
14000 72 5b 6e 4c 69 73 74 5d 20 26 20 30 78 46 45 29  r[nList] & 0xFE)
14010 3d 3d 30 78 30 30 20 29 3b 0a 20 20 20 20 20 20  ==0x00 );.      
14020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14030 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20     *paPoslist = 
14040 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  pList;.        }
14050 0a 20 20 20 20 20 20 20 20 2a 70 69 44 6f 63 69  .        *piDoci
14060 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20  d = iDocid;.    
14070 20 20 20 20 2a 70 6e 50 6f 73 6c 69 73 74 20 3d      *pnPoslist =
14080 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   nList;.        
14090 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
140a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
140b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
140c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
140d0 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 0a  SegReaderStart(.
140e0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14100 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
14110 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  le handle */.  F
14120 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
14130 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f  r *pCsr,       /
14140 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
14150 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
14160 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
14170 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 65 61       /* Term sea
14180 72 63 68 65 64 20 66 6f 72 20 28 6f 72 20 4e 55  rched for (or NU
14190 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  LL) */.  int nTe
141a0 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
141b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
141c0 74 68 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  th of zTerm in b
141d0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
141e0 20 69 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d   i;.  int nSeg =
141f0 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b   pCsr->nSegment;
14200 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 74  ..  /* If the Ft
14210 73 33 53 65 67 46 69 6c 74 65 72 20 64 65 66 69  s3SegFilter defi
14220 6e 65 73 20 61 20 73 70 65 63 69 66 69 63 20 74  nes a specific t
14230 65 72 6d 20 28 6f 72 20 74 65 72 6d 20 70 72 65  erm (or term pre
14240 66 69 78 29 20 74 6f 20 73 65 61 72 63 68 20 0a  fix) to search .
14250 20 20 2a 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61    ** for, then a
14260 64 76 61 6e 63 65 20 65 61 63 68 20 73 65 67 6d  dvance each segm
14270 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e 74  ent iterator unt
14280 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
14290 61 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65  a term of.  ** e
142a0 71 75 61 6c 20 6f 72 20 67 72 65 61 74 65 72 20  qual or greater 
142b0 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65 20 73  value than the s
142c0 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20 54  pecified term. T
142d0 68 69 73 20 70 72 65 76 65 6e 74 73 20 6d 61 6e  his prevents man
142e0 79 0a 20 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61  y.  ** unnecessa
142f0 72 79 20 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70  ry merge/sort op
14300 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  erations for the
14310 20 63 61 73 65 20 77 68 65 72 65 20 73 69 6e 67   case where sing
14320 6c 65 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20  le segment.  ** 
14330 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65  b-tree leaf node
14340 73 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74  s contain more t
14350 68 61 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20  han one term..  
14360 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 43  */.  for(i=0; pC
14370 73 72 2d 3e 62 52 65 73 74 61 72 74 3d 3d 30 20  sr->bRestart==0 
14380 26 26 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d  && i<pCsr->nSegm
14390 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ent; i++){.    i
143a0 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20  nt res = 0;.    
143b0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
143c0 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65  Seg = pCsr->apSe
143d0 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f  gment[i];.    do
143e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20   {.      int rc 
143f0 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  = fts3SegReaderN
14400 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
14410 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
14420 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
14430 6e 20 72 63 3b 0a 20 20 20 20 7d 77 68 69 6c 65  n rc;.    }while
14440 28 20 7a 54 65 72 6d 20 26 26 20 28 72 65 73 20  ( zTerm && (res 
14450 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 54  = fts3SegReaderT
14460 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65  ermCmp(pSeg, zTe
14470 72 6d 2c 20 6e 54 65 72 6d 29 29 3c 30 20 29 3b  rm, nTerm))<0 );
14480 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ..    if( pSeg->
14490 62 4c 6f 6f 6b 75 70 20 26 26 20 72 65 73 21 3d  bLookup && res!=
144a0 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 53  0 ){.      fts3S
144b0 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 70  egReaderSetEof(p
144c0 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Seg);.    }.  }.
144d0 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
144e0 6f 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d  ort(pCsr->apSegm
144f0 65 6e 74 2c 20 6e 53 65 67 2c 20 6e 53 65 67 2c  ent, nSeg, nSeg,
14500 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d   fts3SegReaderCm
14510 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  p);..  return SQ
14520 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20  LITE_OK;.}..int 
14530 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
14540 61 64 65 72 53 74 61 72 74 28 0a 20 20 46 74 73  aderStart(.  Fts
14550 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14570 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
14580 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75  ndle */.  Fts3Mu
14590 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43  ltiSegReader *pC
145a0 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72  sr,       /* Cur
145b0 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
145c0 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70  Fts3SegFilter *p
145d0 46 69 6c 74 65 72 20 20 20 20 20 20 20 20 20 20  Filter          
145e0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
145f0 6f 6e 20 72 61 6e 67 65 20 6f 66 20 69 74 65 72  on range of iter
14600 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 70 43  ation */.){.  pC
14610 73 72 2d 3e 70 46 69 6c 74 65 72 20 3d 20 70 46  sr->pFilter = pF
14620 69 6c 74 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  ilter;.  return 
14630 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  fts3SegReaderSta
14640 72 74 28 70 2c 20 70 43 73 72 2c 20 70 46 69 6c  rt(p, pCsr, pFil
14650 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c  ter->zTerm, pFil
14660 74 65 72 2d 3e 6e 54 65 72 6d 29 3b 0a 7d 0a 0a  ter->nTerm);.}..
14670 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
14680 73 72 49 6e 63 72 53 74 61 72 74 28 0a 20 20 46  srIncrStart(.  F
14690 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146b0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
146c0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
146d0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
146e0 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43  pCsr,       /* C
146f0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
14700 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 6d    /* Column to m
14730 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63 6f  atch on. */.  co
14740 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14760 20 54 65 72 6d 20 74 6f 20 69 74 65 72 61 74 65   Term to iterate
14770 20 74 68 72 6f 75 67 68 20 61 20 64 6f 63 6c 69   through a docli
14780 73 74 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  st for */.  int 
14790 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  nTerm           
147a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
147b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
147c0 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20  n zTerm */.){.  
147d0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
147e0 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
147f0 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  = pCsr->nSegment
14800 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28  ;.  int (*xCmp)(
14810 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c  Fts3SegReader *,
14820 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
14830 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65  ) = (.    p->bDe
14840 73 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52  scIdx ? fts3SegR
14850 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52  eaderDoclistCmpR
14860 65 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64  ev : fts3SegRead
14870 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29  erDoclistCmp.  )
14880 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  ;..  assert( pCs
14890 72 2d 3e 70 46 69 6c 74 65 72 3d 3d 30 20 29 3b  r->pFilter==0 );
148a0 0a 20 20 61 73 73 65 72 74 28 20 7a 54 65 72 6d  .  assert( zTerm
148b0 20 26 26 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a   && nTerm>0 );..
148c0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63    /* Advance eac
148d0 68 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  h segment iterat
148e0 6f 72 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e  or until it poin
148f0 74 73 20 74 6f 20 74 68 65 20 74 65 72 6d 20 7a  ts to the term z
14900 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20  Term/nTerm. */. 
14910 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
14920 64 65 72 53 74 61 72 74 28 70 2c 20 70 43 73 72  derStart(p, pCsr
14930 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
14940 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14950 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
14960 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  ;..  /* Determin
14970 65 20 68 6f 77 20 6d 61 6e 79 20 6f 66 20 74 68  e how many of th
14980 65 20 73 65 67 6d 65 6e 74 73 20 61 63 74 75 61  e segments actua
14990 6c 6c 79 20 70 6f 69 6e 74 20 74 6f 20 7a 54 65  lly point to zTe
149a0 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 66  rm/nTerm. */.  f
149b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65  or(i=0; i<nSegme
149c0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  nt; i++){.    Ft
149d0 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
149e0 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d  g = pCsr->apSegm
149f0 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ent[i];.    if( 
14a00 21 70 53 65 67 2d 3e 61 4e 6f 64 65 20 7c 7c 20  !pSeg->aNode || 
14a10 66 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72  fts3SegReaderTer
14a20 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72 6d  mCmp(pSeg, zTerm
14a30 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  , nTerm) ){.    
14a40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14a50 20 7d 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61   }.  pCsr->nAdva
14a60 6e 63 65 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41  nce = i;..  /* A
14a70 64 76 61 6e 63 65 20 65 61 63 68 20 6f 66 20 74  dvance each of t
14a80 68 65 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 70  he segments to p
14a90 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
14aa0 74 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 66 6f  t docid. */.  fo
14ab0 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
14ac0 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20  Advance; i++){. 
14ad0 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
14ae0 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28  eaderFirstDocid(
14af0 70 2c 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  p, pCsr->apSegme
14b00 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  nt[i]);.    if( 
14b10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14b20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
14b30 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f   fts3SegReaderSo
14b40 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  rt(pCsr->apSegme
14b50 6e 74 2c 20 69 2c 20 69 2c 20 78 43 6d 70 29 3b  nt, i, i, xCmp);
14b60 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ..  assert( iCol
14b70 3c 30 20 7c 7c 20 69 43 6f 6c 3c 70 2d 3e 6e 43  <0 || iCol<p->nC
14b80 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70 43 73 72 2d  olumn );.  pCsr-
14b90 3e 69 43 6f 6c 46 69 6c 74 65 72 20 3d 20 69 43  >iColFilter = iC
14ba0 6f 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ol;..  return SQ
14bb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14bc0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14bd0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 4d  is called on a M
14be0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 74 68  ultiSegReader th
14bf0 61 74 20 68 61 73 20 62 65 65 6e 20 73 74 61 72  at has been star
14c00 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ted using.** sql
14c10 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 53  ite3Fts3MsrIncrS
14c20 74 61 72 74 28 29 2e 20 4f 6e 65 20 6f 72 20 6d  tart(). One or m
14c30 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 4d 73 72  ore calls to Msr
14c40 49 6e 63 72 4e 65 78 74 28 29 20 6d 61 79 20 61  IncrNext() may a
14c50 6c 73 6f 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  lso.** have been
14c60 20 6d 61 64 65 2e 20 43 61 6c 6c 69 6e 67 20 74   made. Calling t
14c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 75 74  his function put
14c80 73 20 74 68 65 20 4d 75 6c 74 69 53 65 67 52 65  s the MultiSegRe
14c90 61 64 65 72 20 69 6e 20 73 75 63 68 0a 2a 2a 20  ader in such.** 
14ca0 61 20 73 74 61 74 65 20 74 68 61 74 20 69 66 20  a state that if 
14cb0 74 68 65 20 6e 65 78 74 20 74 77 6f 20 63 61 6c  the next two cal
14cc0 6c 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ls are:.**.**   
14cd0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
14ce0 61 64 65 72 53 74 61 72 74 28 29 0a 2a 2a 20 20  aderStart().**  
14cf0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
14d00 65 61 64 65 72 53 74 65 70 28 29 0a 2a 2a 0a 2a  eaderStep().**.*
14d10 2a 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  * then the entir
14d20 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  e doclist for th
14d30 65 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61  e term is availa
14d40 62 6c 65 20 69 6e 20 0a 2a 2a 20 4d 75 6c 74 69  ble in .** Multi
14d50 53 65 67 52 65 61 64 65 72 2e 61 44 6f 63 6c 69  SegReader.aDocli
14d60 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  st/nDoclist..*/.
14d70 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
14d80 73 72 49 6e 63 72 52 65 73 74 61 72 74 28 46 74  srIncrRestart(Ft
14d90 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
14da0 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69   *pCsr){.  int i
14db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
14dd0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
14de0 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 2d 72 65  rough segment-re
14df0 61 64 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  aders */..  asse
14e00 72 74 28 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3d  rt( pCsr->zTerm=
14e10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14e20 70 43 73 72 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29  pCsr->nTerm==0 )
14e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
14e40 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b  ->aDoclist==0 );
14e50 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
14e60 3e 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a  >nDoclist==0 );.
14e70 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63  .  pCsr->nAdvanc
14e80 65 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 62  e = 0;.  pCsr->b
14e90 52 65 73 74 61 72 74 20 3d 20 31 3b 0a 20 20 66  Restart = 1;.  f
14ea0 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e  or(i=0; i<pCsr->
14eb0 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a  nSegment; i++){.
14ec0 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d      pCsr->apSegm
14ed0 65 6e 74 5b 69 5d 2d 3e 70 4f 66 66 73 65 74 4c  ent[i]->pOffsetL
14ee0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ist = 0;.    pCs
14ef0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d  r->apSegment[i]-
14f00 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30  >nOffsetList = 0
14f10 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65  ;.    pCsr->apSe
14f20 67 6d 65 6e 74 5b 69 5d 2d 3e 69 44 6f 63 69 64  gment[i]->iDocid
14f30 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
14f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14f50 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
14f60 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
14f70 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
14fa0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
14fb0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
14fc0 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20  er *pCsr        
14fd0 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  /* Cursor object
14fe0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
14ff0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
15000 69 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d 70 74  int isIgnoreEmpt
15010 79 20 3d 20 20 28 70 43 73 72 2d 3e 70 46 69 6c  y =  (pCsr->pFil
15020 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
15030 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45  3_SEGMENT_IGNORE
15040 5f 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74 20 69  _EMPTY);.  int i
15050 73 52 65 71 75 69 72 65 50 6f 73 20 3d 20 20 20  sRequirePos =   
15060 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e  (pCsr->pFilter->
15070 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
15080 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53  MENT_REQUIRE_POS
15090 29 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6c 46 69  );.  int isColFi
150a0 6c 74 65 72 20 3d 20 20 20 20 28 70 43 73 72 2d  lter =    (pCsr-
150b0 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  >pFilter->flags 
150c0 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43  & FTS3_SEGMENT_C
150d0 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20  OLUMN_FILTER);. 
150e0 20 69 6e 74 20 69 73 50 72 65 66 69 78 20 3d 20   int isPrefix = 
150f0 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69        (pCsr->pFi
15100 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  lter->flags & FT
15110 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45 46 49  S3_SEGMENT_PREFI
15120 58 29 3b 0a 20 20 69 6e 74 20 69 73 53 63 61 6e  X);.  int isScan
15130 20 3d 20 20 20 20 20 20 20 20 20 28 70 43 73 72   =         (pCsr
15140 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73  ->pFilter->flags
15150 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   & FTS3_SEGMENT_
15160 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 69 73 46  SCAN);.  int isF
15170 69 72 73 74 20 3d 20 20 20 20 20 20 20 20 28 70  irst =        (p
15180 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c  Csr->pFilter->fl
15190 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45  ags & FTS3_SEGME
151a0 4e 54 5f 46 49 52 53 54 29 3b 0a 0a 20 20 46 74  NT_FIRST);..  Ft
151b0 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70  s3SegReader **ap
151c0 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e  Segment = pCsr->
151d0 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74  apSegment;.  int
151e0 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72   nSegment = pCsr
151f0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 46 74  ->nSegment;.  Ft
15200 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69  s3SegFilter *pFi
15210 6c 74 65 72 20 3d 20 70 43 73 72 2d 3e 70 46 69  lter = pCsr->pFi
15220 6c 74 65 72 3b 0a 20 20 69 6e 74 20 28 2a 78 43  lter;.  int (*xC
15230 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65  mp)(Fts3SegReade
15240 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64  r *, Fts3SegRead
15250 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d  er *) = (.    p-
15260 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33  >bDescIdx ? fts3
15270 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
15280 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67  CmpRev : fts3Seg
15290 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70  ReaderDoclistCmp
152a0 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 73  .  );..  if( pCs
152b0 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29  r->nSegment==0 )
152c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
152d0 4b 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  K;..  do {.    i
152e0 6e 74 20 6e 4d 65 72 67 65 3b 0a 20 20 20 20 69  nt nMerge;.    i
152f0 6e 74 20 69 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  nt i;.  .    /* 
15300 41 64 76 61 6e 63 65 20 74 68 65 20 66 69 72 73  Advance the firs
15310 74 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65  t pCsr->nAdvance
15320 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
15330 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61  apSegment[] arra
15340 79 0a 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64  y.    ** forward
15350 2e 20 54 68 65 6e 20 73 6f 72 74 20 74 68 65 20  . Then sort the 
15360 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 6f 66  list in order of
15370 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 67   current term ag
15380 61 69 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  ain.  .    */.  
15390 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
153a0 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b  r->nAdvance; i++
153b0 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65 67  ){.      Fts3Seg
153c0 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 61  Reader *pSeg = a
153d0 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20  pSegment[i];.   
153e0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f     if( pSeg->bLo
153f0 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20  okup ){.        
15400 66 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74  fts3SegReaderSet
15410 45 6f 66 28 70 53 65 67 29 3b 0a 20 20 20 20 20  Eof(pSeg);.     
15420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15430 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
15440 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  erNext(p, pSeg, 
15450 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
15460 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15470 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
15480 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 53  .    }.    fts3S
15490 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53  egReaderSort(apS
154a0 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74  egment, nSegment
154b0 2c 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65  , pCsr->nAdvance
154c0 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  , fts3SegReaderC
154d0 6d 70 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e  mp);.    pCsr->n
154e0 41 64 76 61 6e 63 65 20 3d 20 30 3b 0a 0a 20 20  Advance = 0;..  
154f0 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
15500 73 65 67 2d 72 65 61 64 65 72 73 20 61 72 65 20  seg-readers are 
15510 61 74 20 45 4f 46 2c 20 77 65 27 72 65 20 66 69  at EOF, we're fi
15520 6e 69 73 68 65 64 2e 20 72 65 74 75 72 6e 20 53  nished. return S
15530 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 20  QLITE_OK. */.   
15540 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
15550 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66  ITE_OK );.    if
15560 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  ( apSegment[0]->
15570 61 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b  aNode==0 ) break
15580 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 54 65  ;..    pCsr->nTe
15590 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30  rm = apSegment[0
155a0 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 70 43  ]->nTerm;.    pC
155b0 73 72 2d 3e 7a 54 65 72 6d 20 3d 20 61 70 53 65  sr->zTerm = apSe
155c0 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b  gment[0]->zTerm;
155d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
155e0 20 69 73 20 61 20 70 72 65 66 69 78 2d 73 65 61   is a prefix-sea
155f0 72 63 68 2c 20 61 6e 64 20 69 66 20 74 68 65 20  rch, and if the 
15600 74 65 72 6d 20 74 68 61 74 20 61 70 53 65 67 6d  term that apSegm
15610 65 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20  ent[0] points.  
15620 20 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74    ** to does not
15630 20 73 68 61 72 65 20 61 20 73 75 66 66 69 78 20   share a suffix 
15640 77 69 74 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54  with pFilter->zT
15650 65 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20  erm/nTerm, then 
15660 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 71 75  all .    ** requ
15670 69 72 65 64 20 63 61 6c 6c 62 61 63 6b 73 20 68  ired callbacks h
15680 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 49  ave been made. I
15690 6e 20 74 68 69 73 20 63 61 73 65 20 65 78 69 74  n this case exit
156a0 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20   early..    **. 
156b0 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
156c0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 65   if this is a se
156d0 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 61 63  arch for an exac
156e0 74 20 6d 61 74 63 68 2c 20 61 6e 64 20 74 68 65  t match, and the
156f0 20 66 69 72 73 74 20 74 65 72 6d 0a 20 20 20 20   first term.    
15700 2a 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20 61 70  ** of segment ap
15710 53 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f  Segment[0] is no
15720 74 20 61 20 6d 61 74 63 68 2c 20 65 78 69 74 20  t a match, exit 
15730 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  early..    */.  
15740 20 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a    if( pFilter->z
15750 54 65 72 6d 20 26 26 20 21 69 73 53 63 61 6e 20  Term && !isScan 
15760 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73  ){.      if( pCs
15770 72 2d 3e 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72  r->nTerm<pFilter
15780 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20  ->nTerm .       
15790 7c 7c 20 28 21 69 73 50 72 65 66 69 78 20 26 26  || (!isPrefix &&
157a0 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3e 70 46 69   pCsr->nTerm>pFi
157b0 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20  lter->nTerm).   
157c0 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 43      || memcmp(pC
157d0 73 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74  sr->zTerm, pFilt
157e0 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74  er->zTerm, pFilt
157f0 65 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20  er->nTerm) .    
15800 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
15810 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15820 7d 0a 0a 20 20 20 20 6e 4d 65 72 67 65 20 3d 20  }..    nMerge = 
15830 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 4d  1;.    while( nM
15840 65 72 67 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20  erge<nSegment . 
15850 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
15860 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f  ent[nMerge]->aNo
15870 64 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  de.        && ap
15880 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d  Segment[nMerge]-
15890 3e 6e 54 65 72 6d 3d 3d 70 43 73 72 2d 3e 6e 54  >nTerm==pCsr->nT
158a0 65 72 6d 20 0a 20 20 20 20 20 20 20 20 26 26 20  erm .        && 
158b0 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e  0==memcmp(pCsr->
158c0 7a 54 65 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74  zTerm, apSegment
158d0 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c  [nMerge]->zTerm,
158e0 20 70 43 73 72 2d 3e 6e 54 65 72 6d 29 0a 20 20   pCsr->nTerm).  
158f0 20 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67    ){.      nMerg
15900 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e++;.    }..    
15910 61 73 73 65 72 74 28 20 69 73 49 67 6e 6f 72 65  assert( isIgnore
15920 45 6d 70 74 79 20 7c 7c 20 28 69 73 52 65 71 75  Empty || (isRequ
15930 69 72 65 50 6f 73 20 26 26 20 21 69 73 43 6f 6c  irePos && !isCol
15940 46 69 6c 74 65 72 29 20 29 3b 0a 20 20 20 20 69  Filter) );.    i
15950 66 28 20 6e 4d 65 72 67 65 3d 3d 31 20 0a 20 20  f( nMerge==1 .  
15960 20 20 20 26 26 20 21 69 73 49 67 6e 6f 72 65 45     && !isIgnoreE
15970 6d 70 74 79 20 0a 20 20 20 20 20 26 26 20 21 69  mpty .     && !i
15980 73 46 69 72 73 74 20 0a 20 20 20 20 20 26 26 20  sFirst .     && 
15990 28 70 2d 3e 62 44 65 73 63 49 64 78 3d 3d 30 20  (p->bDescIdx==0 
159a0 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64 65 72  || fts3SegReader
159b0 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d  IsPending(apSegm
159c0 65 6e 74 5b 30 5d 29 3d 3d 30 29 0a 20 20 20 20  ent[0])==0).    
159d0 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e  ){.      pCsr->n
159e0 44 6f 63 6c 69 73 74 20 3d 20 61 70 53 65 67 6d  Doclist = apSegm
159f0 65 6e 74 5b 30 5d 2d 3e 6e 44 6f 63 6c 69 73 74  ent[0]->nDoclist
15a00 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 33  ;.      if( fts3
15a10 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
15a20 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29  ng(apSegment[0])
15a30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
15a40 20 66 74 73 33 4d 73 72 42 75 66 66 65 72 44 61   fts3MsrBufferDa
15a50 74 61 28 70 43 73 72 2c 20 61 70 53 65 67 6d 65  ta(pCsr, apSegme
15a60 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 2c  nt[0]->aDoclist,
15a70 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29   pCsr->nDoclist)
15a80 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e  ;.        pCsr->
15a90 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d  aDoclist = pCsr-
15aa0 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  >aBuffer;.      
15ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15ac0 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20  Csr->aDoclist = 
15ad0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44  apSegment[0]->aD
15ae0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  oclist;.      }.
15af0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
15b00 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
15b10 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d  QLITE_ROW;.    }
15b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
15b30 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 20 20 20  nDoclist = 0;   
15b40 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
15b50 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  of doclist */.  
15b60 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
15b70 34 20 69 50 72 65 76 20 3d 20 30 3b 20 20 20 20  4 iPrev = 0;    
15b80 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69  /* Previous doci
15b90 64 20 73 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c  d stored in docl
15ba0 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ist */..      /*
15bb0 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   The current ter
15bc0 6d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  m of the first n
15bd0 4d 65 72 67 65 20 65 6e 74 72 69 65 73 20 69 6e  Merge entries in
15be0 20 74 68 65 20 61 72 72 61 79 0a 20 20 20 20 20   the array.     
15bf0 20 2a 2a 20 6f 66 20 46 74 73 33 53 65 67 52 65   ** of Fts3SegRe
15c00 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69 73 20  ader objects is 
15c10 74 68 65 20 73 61 6d 65 2e 20 54 68 65 20 64 6f  the same. The do
15c20 63 6c 69 73 74 73 20 6d 75 73 74 20 62 65 20 6d  clists must be m
15c30 65 72 67 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  erged.      ** a
15c40 6e 64 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  nd a single term
15c50 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 20 74   returned with t
15c60 68 65 20 6d 65 72 67 65 64 20 64 6f 63 6c 69 73  he merged doclis
15c70 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
15c80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65    for(i=0; i<nMe
15c90 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rge; i++){.     
15ca0 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
15cb0 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20 61 70  FirstDocid(p, ap
15cc0 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Segment[i]);.   
15cd0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 53     }.      fts3S
15ce0 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53  egReaderSort(apS
15cf0 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20  egment, nMerge, 
15d00 6e 4d 65 72 67 65 2c 20 78 43 6d 70 29 3b 0a 20  nMerge, xCmp);. 
15d10 20 20 20 20 20 77 68 69 6c 65 28 20 61 70 53 65       while( apSe
15d20 67 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65  gment[0]->pOffse
15d30 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tList ){.       
15d40 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
15d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15d60 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
15d70 20 74 68 61 74 20 73 68 61 72 65 20 61 20 64 6f   that share a do
15d80 63 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  cid */.        c
15d90 68 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20  har *pList;.    
15da0 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20      int nList;. 
15db0 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
15dc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15dd0 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d  3_int64 iDocid =
15de0 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69   apSegment[0]->i
15df0 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 66  Docid;.        f
15e00 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
15e10 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65  Docid(p, apSegme
15e20 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26  nt[0], &pList, &
15e30 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nList);.        
15e40 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  j = 1;.        w
15e50 68 69 6c 65 28 20 6a 3c 6e 4d 65 72 67 65 0a 20  hile( j<nMerge. 
15e60 20 20 20 20 20 20 20 20 20 20 20 26 26 20 61 70             && ap
15e70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66  Segment[j]->pOff
15e80 73 65 74 4c 69 73 74 0a 20 20 20 20 20 20 20 20  setList.        
15e90 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74      && apSegment
15ea0 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f  [j]->iDocid==iDo
15eb0 63 69 64 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cid.        ){. 
15ec0 20 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67           fts3Seg
15ed0 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28  ReaderNextDocid(
15ee0 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c  p, apSegment[j],
15ef0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
15f00 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    j++;.        }
15f10 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ..        if( is
15f20 43 6f 6c 46 69 6c 74 65 72 20 29 7b 0a 20 20 20  ColFilter ){.   
15f30 20 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d         fts3Colum
15f40 6e 46 69 6c 74 65 72 28 70 46 69 6c 74 65 72 2d  nFilter(pFilter-
15f50 3e 69 43 6f 6c 2c 20 26 70 4c 69 73 74 2c 20 26  >iCol, &pList, &
15f60 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nList);.        
15f70 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  }..        if( !
15f80 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c  isIgnoreEmpty ||
15f90 20 6e 4c 69 73 74 3e 30 20 29 7b 0a 0a 20 20 20   nList>0 ){..   
15fa0 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c         /* Calcul
15fb0 61 74 65 20 74 68 65 20 27 64 6f 63 69 64 27 20  ate the 'docid' 
15fc0 64 65 6c 74 61 20 76 61 6c 75 65 20 74 6f 20 77  delta value to w
15fd0 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6d 65  rite into the me
15fe0 72 67 65 64 20 0a 20 20 20 20 20 20 20 20 20 20  rged .          
15ff0 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20  ** doclist. */. 
16000 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16010 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20  _int64 iDelta;. 
16020 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
16030 62 44 65 73 63 49 64 78 20 26 26 20 6e 44 6f 63  bDescIdx && nDoc
16040 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  list>0 ){.      
16050 20 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20 69        iDelta = i
16060 50 72 65 76 20 2d 20 69 44 6f 63 69 64 3b 0a 20  Prev - iDocid;. 
16070 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
16080 20 20 20 20 20 20 20 20 20 20 20 20 69 44 65 6c              iDel
16090 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 69 50  ta = iDocid - iP
160a0 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rev;.          }
160b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
160c0 74 28 20 69 44 65 6c 74 61 3e 30 20 7c 7c 20 28  t( iDelta>0 || (
160d0 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 26 26 20 69  nDoclist==0 && i
160e0 44 65 6c 74 61 3d 3d 69 44 6f 63 69 64 29 20 29  Delta==iDocid) )
160f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16100 72 74 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20 7c  rt( nDoclist>0 |
16110 7c 20 69 44 65 6c 74 61 3d 3d 69 44 6f 63 69 64  | iDelta==iDocid
16120 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6e   );..          n
16130 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74  Byte = sqlite3Ft
16140 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 44 65 6c  s3VarintLen(iDel
16150 74 61 29 20 2b 20 28 69 73 52 65 71 75 69 72 65  ta) + (isRequire
16160 50 6f 73 3f 6e 4c 69 73 74 2b 31 3a 30 29 3b 0a  Pos?nList+1:0);.
16170 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44            if( nD
16180 6f 63 6c 69 73 74 2b 6e 42 79 74 65 3e 70 43 73  oclist+nByte>pCs
16190 72 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20 20  r->nBuffer ){.  
161a0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
161b0 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  aNew;.          
161c0 20 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72 20    pCsr->nBuffer 
161d0 3d 20 28 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74  = (nDoclist+nByt
161e0 65 29 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  e)*2;.          
161f0 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
16200 5f 72 65 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61  _realloc(pCsr->a
16210 42 75 66 66 65 72 2c 20 70 43 73 72 2d 3e 6e 42  Buffer, pCsr->nB
16220 75 66 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20  uffer);.        
16230 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
16240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
16250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16260 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
16270 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  }.            pC
16280 73 72 2d 3e 61 42 75 66 66 65 72 20 3d 20 61 4e  sr->aBuffer = aN
16290 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ew;.          }.
162a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
162b0 73 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  sFirst ){.      
162c0 20 20 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20        char *a = 
162d0 26 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e  &pCsr->aBuffer[n
162e0 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 20 20 20 20  Doclist];.      
162f0 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
16300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  ;.           .  
16310 20 20 20 20 20 20 20 20 20 20 6e 57 72 69 74 65            nWrite
16320 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 46 69   = sqlite3Fts3Fi
16330 72 73 74 46 69 6c 74 65 72 28 69 44 65 6c 74 61  rstFilter(iDelta
16340 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2c 20  , pList, nList, 
16350 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
16360 69 66 28 20 6e 57 72 69 74 65 20 29 7b 0a 20 20  if( nWrite ){.  
16370 20 20 20 20 20 20 20 20 20 20 20 20 69 50 72 65              iPre
16380 76 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20  v = iDocid;.    
16390 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69            nDocli
163a0 73 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  st += nWrite;.  
163b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
163c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
163d0 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73           nDoclis
163e0 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  t += sqlite3Fts3
163f0 50 75 74 56 61 72 69 6e 74 28 26 70 43 73 72 2d  PutVarint(&pCsr-
16400 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73  >aBuffer[nDoclis
16410 74 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20  t], iDelta);.   
16420 20 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d           iPrev =
16430 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20   iDocid;.       
16440 20 20 20 20 20 69 66 28 20 69 73 52 65 71 75 69       if( isRequi
16450 72 65 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 20  rePos ){.       
16460 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
16470 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f  Csr->aBuffer[nDo
16480 63 6c 69 73 74 5d 2c 20 70 4c 69 73 74 2c 20 6e  clist], pList, n
16490 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  List);.         
164a0 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d       nDoclist +=
164b0 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   nList;.        
164c0 20 20 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66        pCsr->aBuf
164d0 66 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b 5d 20  fer[nDoclist++] 
164e0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
164f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16500 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
16510 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
16520 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74  erSort(apSegment
16530 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 78 43 6d  , nMerge, j, xCm
16540 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
16550 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 3e 30    if( nDoclist>0
16560 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72   ){.        pCsr
16570 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73  ->aDoclist = pCs
16580 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20  r->aBuffer;.    
16590 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69      pCsr->nDocli
165a0 73 74 20 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20  st = nDoclist;. 
165b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
165c0 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a  TE_ROW;.      }.
165d0 20 20 20 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e      }.    pCsr->
165e0 6e 41 64 76 61 6e 63 65 20 3d 20 6e 4d 65 72 67  nAdvance = nMerg
165f0 65 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  e;.  }while( rc=
16600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
16610 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
16620 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
16630 53 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28  SegReaderFinish(
16640 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
16650 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20  eader *pCsr     
16660 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
16670 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ct */.){.  if( p
16680 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
16690 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
166a0 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b  <pCsr->nSegment;
166b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
166c0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
166d0 72 46 72 65 65 28 70 43 73 72 2d 3e 61 70 53 65  rFree(pCsr->apSe
166e0 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 7d  gment[i]);.    }
166f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16700 65 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e  e(pCsr->apSegmen
16710 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
16720 66 72 65 65 28 70 43 73 72 2d 3e 61 42 75 66 66  free(pCsr->aBuff
16730 65 72 29 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e  er);..    pCsr->
16740 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  nSegment = 0;.  
16750 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e    pCsr->apSegmen
16760 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d  t = 0;.    pCsr-
16770 3e 61 42 75 66 66 65 72 20 3d 20 30 3b 0a 20 20  >aBuffer = 0;.  
16780 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  }.}../*.** Merge
16790 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65 76 65   all level iLeve
167a0 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
167b0 65 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  e database into 
167c0 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69 4c 65  a single .** iLe
167d0 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e 20 4f  vel+1 segment. O
167e0 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30 2c 20  r, if iLevel<0, 
167f0 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
16800 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ts into a.** sin
16810 67 6c 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68  gle segment with
16820 20 61 20 6c 65 76 65 6c 20 65 71 75 61 6c 20 74   a level equal t
16830 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  o the numericall
16840 79 20 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 20  y largest level 
16850 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 72  .** currently pr
16860 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
16870 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
16880 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
16890 20 63 61 6c 6c 65 64 20 77 69 74 68 20 69 4c 65   called with iLe
168a0 76 65 6c 3c 30 2c 20 62 75 74 20 74 68 65 72 65  vel<0, but there
168b0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a 2a 20   is only one.** 
168c0 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64  segment in the d
168d0 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f  atabase, SQLITE_
168e0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
168f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 2a   immediately. .*
16900 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
16910 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
16920 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16930 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
16940 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20 53 51  ccurs, .** an SQ
16950 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
16960 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
16970 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
16980 65 67 6d 65 6e 74 4d 65 72 67 65 28 0a 20 20 46  egmentMerge(.  F
16990 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20  ts3Table *p, .  
169a0 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20  int iLangid,    
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169c0 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74  /* Language id t
169d0 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  o merge */.  int
169e0 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20   iIndex,        
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a00 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49 6e 64  Index in p->aInd
16a10 65 78 5b 5d 20 74 6f 20 6d 65 72 67 65 20 2a 2f  ex[] to merge */
16a20 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 20 20  .  int iLevel   
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a40 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 6d     /* Level to m
16a50 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  erge */.){.  int
16a60 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
16a90 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20   int iIdx = 0;  
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77   /* Index of new
16ac0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
16ad0 74 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 30 3b  t iNewLevel = 0;
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16af0 20 4c 65 76 65 6c 2f 69 6e 64 65 78 20 74 6f 20   Level/index to 
16b00 63 72 65 61 74 65 20 6e 65 77 20 73 65 67 6d 65  create new segme
16b10 6e 74 20 61 74 20 2a 2f 0a 20 20 53 65 67 6d 65  nt at */.  Segme
16b20 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  ntWriter *pWrite
16b30 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73  r = 0;     /* Us
16b40 65 64 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ed to write the 
16b50 6e 65 77 2c 20 6d 65 72 67 65 64 2c 20 73 65 67  new, merged, seg
16b60 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33 53 65  ment */.  Fts3Se
16b70 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 20  gFilter filter; 
16b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
16b90 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74 65 72  ment term filter
16ba0 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20   condition */.  
16bb0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
16bc0 65 72 20 63 73 72 3b 20 20 20 20 20 20 20 20 20  er csr;         
16bd0 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 69 74 65  /* Cursor to ite
16be0 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
16bf0 65 6c 28 73 29 20 2a 2f 0a 20 20 69 6e 74 20 62  el(s) */.  int b
16c00 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 30 3b  IgnoreEmpty = 0;
16c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
16c20 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 65 6d 70  ue to ignore emp
16c30 74 79 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a  ty segments */..
16c40 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
16c50 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
16c60 5f 41 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 69  _ALL.       || i
16c70 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
16c80 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 0a 20 20  URSOR_PENDING.  
16c90 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d       || iLevel>=
16ca0 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  0.  );.  assert(
16cb0 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45 47   iLevel<FTS3_SEG
16cc0 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a  DIR_MAXLEVEL );.
16cd0 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
16ce0 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d  >=0 && iIndex<p-
16cf0 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 72 63  >nIndex );..  rc
16d00 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65   = sqlite3Fts3Se
16d10 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 70 2c  gReaderCursor(p,
16d20 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
16d30 2c 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30 2c 20  , iLevel, 0, 0, 
16d40 31 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20 20 69  1, 0, &csr);.  i
16d50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16d60 20 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74   || csr.nSegment
16d70 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  ==0 ) goto finis
16d80 68 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76  hed;..  if( iLev
16d90 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
16da0 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a  OR_ALL ){.    /*
16db0 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   This call is to
16dc0 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65   merge all segme
16dd0 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  nts in the datab
16de0 61 73 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a  ase to a single.
16df0 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 2e 20      ** segment. 
16e00 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  The level of the
16e10 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20   new segment is 
16e20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 68 65  equal to the the
16e30 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
16e40 20 20 2a 2a 20 67 72 65 61 74 65 73 74 20 73 65    ** greatest se
16e50 67 6d 65 6e 74 20 6c 65 76 65 6c 20 63 75 72 72  gment level curr
16e60 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e  ently present in
16e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
16e80 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e  r this.    ** in
16e90 64 65 78 2e 20 54 68 65 20 69 64 78 20 6f 66 20  dex. The idx of 
16ea0 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  the new segment 
16eb0 69 73 20 61 6c 77 61 79 73 20 30 2e 20 20 2a 2f  is always 0.  */
16ec0 0a 20 20 20 20 69 66 28 20 63 73 72 2e 6e 53 65  .    if( csr.nSe
16ed0 67 6d 65 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  gment==1 ){.    
16ee0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
16ef0 4e 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  NE;.      goto f
16f00 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
16f10 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d     rc = fts3Segm
16f20 65 6e 74 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69  entMaxLevel(p, i
16f30 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
16f40 26 69 4e 65 77 4c 65 76 65 6c 29 3b 0a 20 20 20  &iNewLevel);.   
16f50 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20   bIgnoreEmpty = 
16f60 31 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  1;..  }else if( 
16f70 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47  iLevel==FTS3_SEG
16f80 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29  CURSOR_PENDING )
16f90 7b 0a 20 20 20 20 69 4e 65 77 4c 65 76 65 6c 20  {.    iNewLevel 
16fa0 3d 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  = getAbsoluteLev
16fb0 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
16fc0 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 72  Index, 0);.    r
16fd0 63 20 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65  c = fts3Allocate
16fe0 53 65 67 64 69 72 49 64 78 28 70 2c 20 69 4c 61  SegdirIdx(p, iLa
16ff0 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 2c  ngid, iIndex, 0,
17000 20 26 69 49 64 78 29 3b 0a 20 20 7d 65 6c 73 65   &iIdx);.  }else
17010 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
17020 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67 65 20 61  ll is to merge a
17030 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61 74 20 6c  ll segments at l
17040 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 66 69 6e  evel iLevel. fin
17050 64 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  d the next.    *
17060 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 65 67 6d  * available segm
17070 65 6e 74 20 69 6e 64 65 78 20 61 74 20 6c 65 76  ent index at lev
17080 65 6c 20 69 4c 65 76 65 6c 2b 31 2e 20 54 68 65  el iLevel+1. The
17090 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
170a0 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64  fts3AllocateSegd
170b0 69 72 49 64 78 28 29 20 77 69 6c 6c 20 6d 65 72  irIdx() will mer
170c0 67 65 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20  ge the segments 
170d0 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b  at level iLevel+
170e0 31 20 74 6f 20 0a 20 20 20 20 2a 2a 20 61 20 73  1 to .    ** a s
170f0 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 32 20 73  ingle iLevel+2 s
17100 65 67 6d 65 6e 74 20 69 66 20 6e 65 63 65 73 73  egment if necess
17110 61 72 79 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20  ary.  */.    rc 
17120 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  = fts3AllocateSe
17130 67 64 69 72 49 64 78 28 70 2c 20 69 4c 61 6e 67  gdirIdx(p, iLang
17140 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
17150 65 6c 2b 31 2c 20 26 69 49 64 78 29 3b 0a 20 20  el+1, &iIdx);.  
17160 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 67 65    iNewLevel = ge
17170 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
17180 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
17190 78 2c 20 69 4c 65 76 65 6c 2b 31 29 3b 0a 20 20  x, iLevel+1);.  
171a0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
171b0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e  TE_OK ) goto fin
171c0 69 73 68 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ished;.  assert(
171d0 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3e 30 20   csr.nSegment>0 
171e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65  );.  assert( iNe
171f0 77 4c 65 76 65 6c 3e 3d 67 65 74 41 62 73 6f 6c  wLevel>=getAbsol
17200 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
17210 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 20  gid, iIndex, 0) 
17220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65  );.  assert( iNe
17230 77 4c 65 76 65 6c 3c 67 65 74 41 62 73 6f 6c 75  wLevel<getAbsolu
17240 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
17250 69 64 2c 20 69 49 6e 64 65 78 2c 46 54 53 33 5f  id, iIndex,FTS3_
17260 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29  SEGDIR_MAXLEVEL)
17270 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66   );..  memset(&f
17280 69 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  ilter, 0, sizeof
17290 28 46 74 73 33 53 65 67 46 69 6c 74 65 72 29 29  (Fts3SegFilter))
172a0 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73  ;.  filter.flags
172b0 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   = FTS3_SEGMENT_
172c0 52 45 51 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66  REQUIRE_POS;.  f
172d0 69 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28  ilter.flags |= (
172e0 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3f 20 46  bIgnoreEmpty ? F
172f0 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f  TS3_SEGMENT_IGNO
17300 52 45 5f 45 4d 50 54 59 20 3a 20 30 29 3b 0a 0a  RE_EMPTY : 0);..
17310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
17320 73 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74  s3SegReaderStart
17330 28 70 2c 20 26 63 73 72 2c 20 26 66 69 6c 74 65  (p, &csr, &filte
17340 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c  r);.  while( SQL
17350 49 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20  ITE_OK==rc ){.  
17360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
17370 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
17380 70 2c 20 26 63 73 72 29 3b 0a 20 20 20 20 69 66  p, &csr);.    if
17390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc!=SQLITE_ROW
173a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63   ) break;.    rc
173b0 20 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72   = fts3SegWriter
173c0 41 64 64 28 70 2c 20 26 70 57 72 69 74 65 72 2c  Add(p, &pWriter,
173d0 20 31 2c 20 0a 20 20 20 20 20 20 20 20 63 73 72   1, .        csr
173e0 2e 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72  .zTerm, csr.nTer
173f0 6d 2c 20 63 73 72 2e 61 44 6f 63 6c 69 73 74 2c  m, csr.aDoclist,
17400 20 63 73 72 2e 6e 44 6f 63 6c 69 73 74 29 3b 0a   csr.nDoclist);.
17410 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
17420 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
17430 69 6e 69 73 68 65 64 3b 0a 20 20 61 73 73 65 72  inished;.  asser
17440 74 28 20 70 57 72 69 74 65 72 20 29 3b 0a 0a 20  t( pWriter );.. 
17450 20 69 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53   if( iLevel!=FTS
17460 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44  3_SEGCURSOR_PEND
17470 49 4e 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ING ){.    rc = 
17480 66 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72  fts3DeleteSegdir
17490 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c 61  (.        p, iLa
174a0 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c  ngid, iIndex, iL
174b0 65 76 65 6c 2c 20 63 73 72 2e 61 70 53 65 67 6d  evel, csr.apSegm
174c0 65 6e 74 2c 20 63 73 72 2e 6e 53 65 67 6d 65 6e  ent, csr.nSegmen
174d0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
174e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
174f0 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
17500 20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33 53    }.  rc = fts3S
17510 65 67 57 72 69 74 65 72 46 6c 75 73 68 28 70 2c  egWriterFlush(p,
17520 20 70 57 72 69 74 65 72 2c 20 69 4e 65 77 4c 65   pWriter, iNewLe
17530 76 65 6c 2c 20 69 49 64 78 29 3b 0a 0a 20 66 69  vel, iIdx);.. fi
17540 6e 69 73 68 65 64 3a 0a 20 20 66 74 73 33 53 65  nished:.  fts3Se
17550 67 57 72 69 74 65 72 46 72 65 65 28 70 57 72 69  gWriterFree(pWri
17560 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ter);.  sqlite3F
17570 74 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69  ts3SegReaderFini
17580 73 68 28 26 63 73 72 29 3b 0a 20 20 72 65 74 75  sh(&csr);.  retu
17590 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a  rn rc;.}.../* .*
175a0 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74  * Flush the cont
175b0 65 6e 74 73 20 6f 66 20 70 65 6e 64 69 6e 67 54  ents of pendingT
175c0 65 72 6d 73 20 74 6f 20 6c 65 76 65 6c 20 30 20  erms to level 0 
175d0 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  segments..*/.int
175e0 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
175f0 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 46 74  ingTermsFlush(Ft
17600 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
17610 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17620 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  K;.  int i;.  fo
17630 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
17640 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e  E_OK && i<p->nIn
17650 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  dex; i++){.    r
17660 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d  c = fts3SegmentM
17670 65 72 67 65 28 70 2c 20 70 2d 3e 69 50 72 65 76  erge(p, p->iPrev
17680 4c 61 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f  Langid, i, FTS3_
17690 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e  SEGCURSOR_PENDIN
176a0 47 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  G);.    if( rc==
176b0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63  SQLITE_DONE ) rc
176c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
176d0 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50  }.  sqlite3Fts3P
176e0 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72  endingTermsClear
176f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63 6f 64  ;.}../*.** Encod
17710 65 20 4e 20 69 6e 74 65 67 65 72 73 20 61 73 20  e N integers as 
17720 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 61 20 62  varints into a b
17730 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lob..*/.static v
17740 6f 69 64 20 66 74 73 33 45 6e 63 6f 64 65 49 6e  oid fts3EncodeIn
17750 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20 4e 2c  tArray(.  int N,
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17770 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  The number of in
17780 74 65 67 65 72 73 20 74 6f 20 65 6e 63 6f 64 65  tegers to encode
17790 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20 20   */.  u32 *a,   
177a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
177b0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 2a  integer values *
177c0 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20  /.  char *zBuf, 
177d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
177e0 74 68 65 20 42 4c 4f 42 20 68 65 72 65 20 2a 2f  the BLOB here */
177f0 0a 20 20 69 6e 74 20 2a 70 4e 42 75 66 20 20 20  .  int *pNBuf   
17800 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
17810 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
17820 66 20 7a 42 75 66 5b 5d 20 75 73 65 64 20 68 65  f zBuf[] used he
17830 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
17840 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  , j;.  for(i=j=0
17850 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<N; i++){.   
17860 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   j += sqlite3Fts
17870 33 50 75 74 56 61 72 69 6e 74 28 26 7a 42 75 66  3PutVarint(&zBuf
17880 5b 6a 5d 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e  [j], (sqlite3_in
17890 74 36 34 29 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20  t64)a[i]);.  }. 
178a0 20 2a 70 4e 42 75 66 20 3d 20 6a 3b 0a 7d 0a 0a   *pNBuf = j;.}..
178b0 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 62  /*.** Decode a b
178c0 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73 20 69  lob of varints i
178d0 6e 74 6f 20 4e 20 69 6e 74 65 67 65 72 73 0a 2a  nto N integers.*
178e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
178f0 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61 79  s3DecodeIntArray
17900 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  (.  int N,      
17910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
17920 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73  mber of integers
17930 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20   to decode */.  
17940 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20 20  u32 *a,         
17950 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
17960 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 2a  integer values *
17970 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
17980 7a 42 75 66 2c 20 20 2f 2a 20 54 68 65 20 42 4c  zBuf,  /* The BL
17990 4f 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  OB containing th
179a0 65 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20 20 69  e varints */.  i
179b0 6e 74 20 6e 42 75 66 20 20 20 20 20 20 20 20 20  nt nBuf         
179c0 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    /* size of the
179d0 20 42 4c 4f 42 20 2a 2f 0a 29 7b 0a 20 20 69 6e   BLOB */.){.  in
179e0 74 20 69 2c 20 6a 3b 0a 20 20 55 4e 55 53 45 44  t i, j;.  UNUSED
179f0 5f 50 41 52 41 4d 45 54 45 52 28 6e 42 75 66 29  _PARAMETER(nBuf)
17a00 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
17a10 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  <N; i++){.    sq
17a20 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20  lite3_int64 x;. 
17a30 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46     j += sqlite3F
17a40 74 73 33 47 65 74 56 61 72 69 6e 74 28 26 7a 42  ts3GetVarint(&zB
17a50 75 66 5b 6a 5d 2c 20 26 78 29 3b 0a 20 20 20 20  uf[j], &x);.    
17a60 61 73 73 65 72 74 28 6a 3c 3d 6e 42 75 66 29 3b  assert(j<=nBuf);
17a70 0a 20 20 20 20 61 5b 69 5d 20 3d 20 28 75 33 32  .    a[i] = (u32
17a80 29 28 78 20 26 20 30 78 66 66 66 66 66 66 66 66  )(x & 0xffffffff
17a90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
17aa0 49 6e 73 65 72 74 20 74 68 65 20 73 69 7a 65 73  Insert the sizes
17ab0 20 28 69 6e 20 74 6f 6b 65 6e 73 29 20 66 6f 72   (in tokens) for
17ac0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
17ad0 74 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20  the document.** 
17ae0 77 69 74 68 20 64 6f 63 69 64 20 65 71 75 61 6c  with docid equal
17af0 20 74 6f 20 70 2d 3e 69 50 72 65 76 44 6f 63 69   to p->iPrevDoci
17b00 64 2e 20 20 54 68 65 20 73 69 7a 65 73 20 61 72  d.  The sizes ar
17b10 65 20 65 6e 63 6f 64 65 64 20 61 73 0a 2a 2a 20  e encoded as.** 
17b20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74  a blob of varint
17b30 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
17b40 64 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73  d fts3InsertDocs
17b50 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c  ize(.  int *pRC,
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
17b80 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54   code */.  Fts3T
17b90 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
17ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
17bb0 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74  ble into which t
17bc0 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 75 33  o insert */.  u3
17bd0 32 20 2a 61 53 7a 20 20 20 20 20 20 20 20 20 20  2 *aSz          
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17bf0 20 53 69 7a 65 73 20 6f 66 20 65 61 63 68 20 63   Sizes of each c
17c00 6f 6c 75 6d 6e 2c 20 69 6e 20 74 6f 6b 65 6e 73  olumn, in tokens
17c10 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
17c20 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
17c30 20 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20 65 6e    /* The BLOB en
17c40 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 64 6f  coding of the do
17c50 63 75 6d 65 6e 74 20 73 69 7a 65 20 2a 2f 0a 20  cument size */. 
17c60 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20   int nBlob;     
17c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17c80 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
17c90 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 73 71  the BLOB */.  sq
17ca0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17cb0 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d  t;     /* Statem
17cc0 65 6e 74 20 75 73 65 64 20 74 6f 20 69 6e 73 65  ent used to inse
17cd0 72 74 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  rt the encoding 
17ce0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d00 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
17d10 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
17d20 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
17d30 72 65 74 75 72 6e 3b 0a 20 20 70 42 6c 6f 62 20  return;.  pBlob 
17d40 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
17d50 28 20 31 30 2a 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  ( 10*p->nColumn 
17d60 29 3b 0a 20 20 69 66 28 20 70 42 6c 6f 62 3d 3d  );.  if( pBlob==
17d70 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
17d80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17d90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
17da0 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72  fts3EncodeIntArr
17db0 61 79 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 61  ay(p->nColumn, a
17dc0 53 7a 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f  Sz, pBlob, &nBlo
17dd0 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53  b);.  rc = fts3S
17de0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45  qlStmt(p, SQL_RE
17df0 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 2c 20 26  PLACE_DOCSIZE, &
17e00 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
17e10 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
17e20 65 33 5f 66 72 65 65 28 70 42 6c 6f 62 29 3b 0a  e3_free(pBlob);.
17e30 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
17e40 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
17e50 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
17e60 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 70 2d  t64(pStmt, 1, p-
17e70 3e 69 50 72 65 76 44 6f 63 69 64 29 3b 0a 20 20  >iPrevDocid);.  
17e80 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
17e90 62 28 70 53 74 6d 74 2c 20 32 2c 20 70 42 6c 6f  b(pStmt, 2, pBlo
17ea0 62 2c 20 6e 42 6c 6f 62 2c 20 73 71 6c 69 74 65  b, nBlob, sqlite
17eb0 33 5f 66 72 65 65 29 3b 0a 20 20 73 71 6c 69 74  3_free);.  sqlit
17ec0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
17ed0 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74 65 33    *pRC = sqlite3
17ee0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d  _reset(pStmt);.}
17ef0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 30  ../*.** Record 0
17f00 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20 74   of the %_stat t
17f10 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  able contains a 
17f20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67 20  blob consisting 
17f30 6f 66 20 4e 20 76 61 72 69 6e 74 73 2c 0a 2a 2a  of N varints,.**
17f40 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
17f50 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64  number of user d
17f60 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69  efined columns i
17f70 6e 20 74 68 65 20 66 74 73 33 20 74 61 62 6c 65  n the fts3 table
17f80 20 70 6c 75 73 0a 2a 2a 20 74 77 6f 2e 20 49 66   plus.** two. If
17f90 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d   nCol is the num
17fa0 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69  ber of user defi
17fb0 6e 65 64 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  ned columns, the
17fc0 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  n values of the 
17fd0 0a 2a 2a 20 76 61 72 69 6e 74 73 20 61 72 65 20  .** varints are 
17fe0 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
17ff0 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20 30  **.**   Varint 0
18000 3a 20 20 20 20 20 20 20 54 6f 74 61 6c 20 6e 75  :       Total nu
18010 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
18020 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
18030 20 20 20 56 61 72 69 6e 74 20 31 2e 2e 6e 43 6f     Varint 1..nCo
18040 6c 3a 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75  l: For each colu
18050 6d 6e 2c 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  mn, the total nu
18060 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 73  mber of tokens s
18070 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20 20  tored in.**     
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
18090 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c  e column for all
180a0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
180b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  le..**.**   Vari
180c0 6e 74 20 31 2b 6e 43 6f 6c 3a 20 20 54 68 65 20  nt 1+nCol:  The 
180d0 74 6f 74 61 6c 20 73 69 7a 65 2c 20 69 6e 20 62  total size, in b
180e0 79 74 65 73 2c 20 6f 66 20 61 6c 6c 20 74 65 78  ytes, of all tex
180f0 74 20 76 61 6c 75 65 73 20 69 6e 20 61 6c 6c 0a  t values in all.
18100 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
18110 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
18120 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
18130 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  table..**.*/.sta
18140 74 69 63 20 76 6f 69 64 20 66 74 73 33 55 70 64  tic void fts3Upd
18150 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 0a 20 20  ateDocTotals(.  
18160 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20  int *pRC,       
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 63 6f  /* The result co
18190 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c  de */.  Fts3Tabl
181a0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
181b0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
181c0 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 20 2a   being updated *
181d0 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 2c  /.  u32 *aSzIns,
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 63 72      /* Size incr
18200 65 61 73 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  eases */.  u32 *
18210 61 53 7a 44 65 6c 2c 20 20 20 20 20 20 20 20 20  aSzDel,         
18220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18230 7a 65 20 64 65 63 72 65 61 73 65 73 20 2a 2f 0a  ze decreases */.
18240 20 20 69 6e 74 20 6e 43 68 6e 67 20 20 20 20 20    int nChng     
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 2f 2a 20 43 68 61 6e 67 65 20 69 6e 20 74    /* Change in t
18270 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63  he number of doc
18280 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
18290 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  har *pBlob;     
182a0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 61          /* Stora
182b0 67 65 20 66 6f 72 20 42 4c 4f 42 20 77 72 69 74  ge for BLOB writ
182c0 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61 74 20  ten into %_stat 
182d0 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
182f0 20 53 69 7a 65 20 6f 66 20 42 4c 4f 42 20 77 72   Size of BLOB wr
18300 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61  itten into %_sta
18310 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 3b 20 20  t */.  u32 *a;  
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18330 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 74 65  /* Array of inte
18340 67 65 72 73 20 74 68 61 74 20 62 65 63 6f 6d 65  gers that become
18350 73 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20  s the BLOB */.  
18360 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
18370 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74  tmt;     /* Stat
18380 65 6d 65 6e 74 20 66 6f 72 20 72 65 61 64 69 6e  ement for readin
18390 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20 2a 2f  g and writing */
183a0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
183b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
183c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
183d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
183e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
183f0 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
18400 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
18410 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53 74 61 74   const int nStat
18420 20 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 3b   = p->nColumn+2;
18430 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
18440 65 74 75 72 6e 3b 0a 20 20 61 20 3d 20 73 71 6c  eturn;.  a = sql
18450 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28 73 69  ite3_malloc( (si
18460 7a 65 6f 66 28 75 33 32 29 2b 31 30 29 2a 6e 53  zeof(u32)+10)*nS
18470 74 61 74 20 29 3b 0a 20 20 69 66 28 20 61 3d 3d  tat );.  if( a==
18480 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
18490 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
184a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
184b0 70 42 6c 6f 62 20 3d 20 28 63 68 61 72 2a 29 26  pBlob = (char*)&
184c0 61 5b 6e 53 74 61 74 5d 3b 0a 20 20 72 63 20 3d  a[nStat];.  rc =
184d0 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
184e0 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 54 4f  SQL_SELECT_DOCTO
184f0 54 41 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  TAL, &pStmt, 0);
18500 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
18510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
18520 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  ;.    *pRC = rc;
18530 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
18540 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
18550 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
18560 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 66 74  TE_ROW ){.    ft
18570 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61 79  s3DecodeIntArray
18580 28 6e 53 74 61 74 2c 20 61 2c 0a 20 20 20 20 20  (nStat, a,.     
18590 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
185a0 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30  mn_blob(pStmt, 0
185b0 29 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ),.         sqli
185c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
185d0 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d  (pStmt, 0));.  }
185e0 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
185f0 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33  (a, 0, sizeof(u3
18600 32 29 2a 28 6e 53 74 61 74 29 20 29 3b 0a 20 20  2)*(nStat) );.  
18610 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  }.  sqlite3_rese
18620 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
18630 6e 43 68 6e 67 3c 30 20 26 26 20 61 5b 30 5d 3c  nChng<0 && a[0]<
18640 28 75 33 32 29 28 2d 6e 43 68 6e 67 29 20 29 7b  (u32)(-nChng) ){
18650 0a 20 20 20 20 61 5b 30 5d 20 3d 20 30 3b 0a 20  .    a[0] = 0;. 
18660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 5b 30 5d   }else{.    a[0]
18670 20 2b 3d 20 6e 43 68 6e 67 3b 0a 20 20 7d 0a 20   += nChng;.  }. 
18680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
18690 43 6f 6c 75 6d 6e 2b 31 3b 20 69 2b 2b 29 7b 0a  Column+1; i++){.
186a0 20 20 20 20 75 33 32 20 78 20 3d 20 61 5b 69 2b      u32 x = a[i+
186b0 31 5d 3b 0a 20 20 20 20 69 66 28 20 78 2b 61 53  1];.    if( x+aS
186c0 7a 49 6e 73 5b 69 5d 20 3c 20 61 53 7a 44 65 6c  zIns[i] < aSzDel
186d0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 78 20 3d  [i] ){.      x =
186e0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
186f0 20 20 20 20 20 78 20 3d 20 78 20 2b 20 61 53 7a       x = x + aSz
18700 49 6e 73 5b 69 5d 20 2d 20 61 53 7a 44 65 6c 5b  Ins[i] - aSzDel[
18710 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 5b  i];.    }.    a[
18720 69 2b 31 5d 20 3d 20 78 3b 0a 20 20 7d 0a 20 20  i+1] = x;.  }.  
18730 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72  fts3EncodeIntArr
18740 61 79 28 6e 53 74 61 74 2c 20 61 2c 20 70 42 6c  ay(nStat, a, pBl
18750 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72  ob, &nBlob);.  r
18760 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
18770 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44  p, SQL_REPLACE_D
18780 4f 43 54 4f 54 41 4c 2c 20 26 70 53 74 6d 74 2c  OCTOTAL, &pStmt,
18790 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
187a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
187b0 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d  e(a);.    *pRC =
187c0 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
187d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  .  }.  sqlite3_b
187e0 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
187f0 31 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  1, pBlob, nBlob,
18800 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
18810 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
18820 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d  pStmt);.  *pRC =
18830 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
18840 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Stmt);.  sqlite3
18850 5f 66 72 65 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(a);.}../*.
18860 2a 2a 20 4d 65 72 67 65 20 74 68 65 20 65 6e 74  ** Merge the ent
18870 69 72 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  ire database so 
18880 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6f 6e  that there is on
18890 65 20 73 65 67 6d 65 6e 74 20 66 6f 72 20 65 61  e segment for ea
188a0 63 68 20 0a 2a 2a 20 69 49 6e 64 65 78 2f 69 4c  ch .** iIndex/iL
188b0 61 6e 67 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  angid combinatio
188c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
188d0 20 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28   fts3DoOptimize(
188e0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e  Fts3Table *p, in
188f0 74 20 62 52 65 74 75 72 6e 44 6f 6e 65 29 7b 0a  t bReturnDone){.
18900 20 20 69 6e 74 20 62 53 65 65 6e 44 6f 6e 65 20    int bSeenDone 
18910 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
18920 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18930 41 6c 6c 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 0a  AllLangid = 0;..
18940 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
18950 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
18960 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41  _ALL_LANGID, &pA
18970 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20  llLangid, 0);.  
18980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18990 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
189a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
189b0 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69  nd_int(pAllLangi
189c0 64 2c 20 31 2c 20 70 2d 3e 6e 49 6e 64 65 78 29  d, 1, p->nIndex)
189d0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
189e0 69 74 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61  ite3_step(pAllLa
189f0 6e 67 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ngid)==SQLITE_RO
18a00 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  W ){.      int i
18a10 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e  ;.      int iLan
18a20 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  gid = sqlite3_co
18a30 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e  lumn_int(pAllLan
18a40 67 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  gid, 0);.      f
18a50 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
18a60 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49  TE_OK && i<p->nI
18a70 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
18a80 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
18a90 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 69 4c 61  mentMerge(p, iLa
18aa0 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f 53 45  ngid, i, FTS3_SE
18ab0 47 43 55 52 53 4f 52 5f 41 4c 4c 29 3b 0a 20 20  GCURSOR_ALL);.  
18ac0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18ad0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
18ae0 20 20 20 20 20 20 20 62 53 65 65 6e 44 6f 6e 65         bSeenDone
18af0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
18b00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18b20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  }.    }.    rc2 
18b30 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
18b40 70 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20  pAllLangid);.   
18b50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18b60 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
18b70 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 46 74 73   }..  sqlite3Fts
18b80 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70  3SegmentsClose(p
18b90 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
18ba0 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61  PendingTermsClea
18bb0 72 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  r(p);..  return 
18bc0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
18bd0 26 20 62 52 65 74 75 72 6e 44 6f 6e 65 20 26 26  & bReturnDone &&
18be0 20 62 53 65 65 6e 44 6f 6e 65 29 20 3f 20 53 51   bSeenDone) ? SQ
18bf0 4c 49 54 45 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a  LITE_DONE : rc;.
18c00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
18c10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
18c20 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 65   when the user e
18c30 78 65 63 75 74 65 73 20 74 68 65 20 66 6f 6c 6c  xecutes the foll
18c40 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 3a  owing statement:
18c50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52  .**.**     INSER
18c60 54 20 49 4e 54 4f 20 3c 74 62 6c 3e 28 3c 74 62  T INTO <tbl>(<tb
18c70 6c 3e 29 20 56 41 4c 55 45 53 28 27 72 65 62 75  l>) VALUES('rebu
18c80 69 6c 64 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ild');.**.** The
18c90 20 65 6e 74 69 72 65 20 46 54 53 20 69 6e 64 65   entire FTS inde
18ca0 78 20 69 73 20 64 69 73 63 61 72 64 65 64 20 61  x is discarded a
18cb0 6e 64 20 72 65 62 75 69 6c 74 2e 20 49 66 20 74  nd rebuilt. If t
18cc0 68 65 20 74 61 62 6c 65 20 69 73 20 6f 6e 65 20  he table is one 
18cd0 0a 2a 2a 20 63 72 65 61 74 65 64 20 75 73 69 6e  .** created usin
18ce0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78  g the content=xx
18cf0 78 20 6f 70 74 69 6f 6e 2c 20 74 68 65 6e 20 74  x option, then t
18d00 68 65 20 6e 65 77 20 69 6e 64 65 78 20 69 73 20  he new index is 
18d10 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
18d20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
18d30 20 6f 66 20 74 68 65 20 78 78 78 20 74 61 62 6c   of the xxx tabl
18d40 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
18d50 20 69 73 20 72 65 62 75 69 6c 74 20 62 61 73 65   is rebuilt base
18d60 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6e 74  d.** on the cont
18d70 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f  ents of the %_co
18d80 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ntent table..*/.
18d90 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
18da0 6f 52 65 62 75 69 6c 64 28 46 74 73 33 54 61 62  oRebuild(Fts3Tab
18db0 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  le *p){.  int rc
18dc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18de0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn Code */..  r
18df0 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c  c = fts3DeleteAl
18e00 6c 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  l(p, 0);.  if( r
18e10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18e20 20 20 20 20 75 33 32 20 2a 61 53 7a 20 3d 20 30      u32 *aSz = 0
18e30 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 49 6e  ;.    u32 *aSzIn
18e40 73 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 2a  s = 0;.    u32 *
18e50 61 53 7a 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  aSzDel = 0;.    
18e60 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
18e70 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tmt = 0;.    int
18e80 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a 0a 20 20   nEntry = 0;..  
18e90 20 20 2f 2a 20 43 6f 6d 70 6f 73 65 20 61 6e 64    /* Compose and
18ea0 20 70 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20   prepare an SQL 
18eb0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f  statement to loo
18ec0 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  p through the co
18ed0 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  ntent table */. 
18ee0 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
18ef0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
18f00 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70 2d  "SELECT %s" , p-
18f10 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b  >zReadExprlist);
18f20 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29  .    if( !zSql )
18f30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
18f40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
18f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
18f60 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
18f70 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
18f80 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
18f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
18fa0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
18fb0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
18fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18fd0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
18fe0 65 6f 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e  eof(u32) * (p->n
18ff0 43 6f 6c 75 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20  Column+1)*3;.   
19000 20 20 20 61 53 7a 20 3d 20 28 75 33 32 20 2a 29     aSz = (u32 *)
19010 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
19020 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
19030 20 61 53 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   aSz==0 ){.     
19040 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19050 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
19060 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
19070 74 28 61 53 7a 2c 20 30 2c 20 6e 42 79 74 65 29  t(aSz, 0, nByte)
19080 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73  ;.        aSzIns
19090 20 3d 20 26 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75   = &aSz[p->nColu
190a0 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  mn+1];.        a
190b0 53 7a 44 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b  SzDel = &aSzIns[
190c0 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20  p->nColumn+1];. 
190d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
190e0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
190f0 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
19100 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
19110 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
19120 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
19130 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d     int iLangid =
19140 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63   langidFromSelec
19150 74 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  t(p, pStmt);.   
19160 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
19170 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c  ingTermsDocid(p,
19180 20 69 4c 61 6e 67 69 64 2c 20 73 71 6c 69 74 65   iLangid, sqlite
19190 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
191a0 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20  Stmt, 0));.     
191b0 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d   aSz[p->nColumn]
191c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
191d0 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iCol=0; rc==SQLI
191e0 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d  TE_OK && iCol<p-
191f0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b  >nColumn; iCol++
19200 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
19210 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
19220 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
19230 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
19240 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20  tmt, iCol+1);.  
19250 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50        rc = fts3P
19260 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70  endingTermsAdd(p
19270 2c 20 69 4c 61 6e 67 69 64 2c 20 7a 2c 20 69 43  , iLangid, z, iC
19280 6f 6c 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b  ol, &aSz[iCol]);
19290 0a 20 20 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e  .        aSz[p->
192a0 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69  nColumn] += sqli
192b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
192c0 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b  (pStmt, iCol+1);
192d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
192e0 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  f( p->bHasDocsiz
192f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  e ){.        fts
19300 33 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 26  3InsertDocsize(&
19310 72 63 2c 20 70 2c 20 61 53 7a 29 3b 0a 20 20 20  rc, p, aSz);.   
19320 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
19330 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
19350 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
19360 0a 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d  .        pStmt =
19370 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
19380 0a 20 20 20 20 20 20 20 20 6e 45 6e 74 72 79 2b  .        nEntry+
19390 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  +;.        for(i
193a0 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 3d 70 2d 3e  Col=0; iCol<=p->
193b0 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29  nColumn; iCol++)
193c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 7a 49  {.          aSzI
193d0 6e 73 5b 69 43 6f 6c 5d 20 2b 3d 20 61 53 7a 5b  ns[iCol] += aSz[
193e0 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 7d  iCol];.        }
193f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19400 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 53 74     if( p->bHasSt
19410 61 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33  at ){.      fts3
19420 55 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28  UpdateDocTotals(
19430 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20  &rc, p, aSzIns, 
19440 61 53 7a 44 65 6c 2c 20 6e 45 6e 74 72 79 29 3b  aSzDel, nEntry);
19450 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19460 65 33 5f 66 72 65 65 28 61 53 7a 29 3b 0a 0a 20  e3_free(aSz);.. 
19470 20 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a     if( pStmt ){.
19480 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
19490 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
194a0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
194b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
194c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
194d0 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
194e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
194f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  n rc;.}../*.** H
19500 61 6e 64 6c 65 20 61 20 27 73 70 65 63 69 61 6c  andle a 'special
19510 27 20 49 4e 53 45 52 54 20 6f 66 20 74 68 65 20  ' INSERT of the 
19520 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 49  form:.**.**   "I
19530 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 28 74  NSERT INTO tbl(t
19540 62 6c 29 20 56 41 4c 55 45 53 28 3c 65 78 70 72  bl) VALUES(<expr
19550 3e 29 22 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  >)".**.** Argume
19560 6e 74 20 70 56 61 6c 20 63 6f 6e 74 61 69 6e 73  nt pVal contains
19570 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 3c   the result of <
19580 65 78 70 72 3e 2e 20 43 75 72 72 65 6e 74 6c 79  expr>. Currently
19590 20 74 68 65 20 6f 6e 6c 79 20 0a 2a 2a 20 6d 65   the only .** me
195a0 61 6e 69 6e 67 66 75 6c 20 76 61 6c 75 65 20 74  aningful value t
195b0 6f 20 69 6e 73 65 72 74 20 69 73 20 74 68 65 20  o insert is the 
195c0 74 65 78 74 20 27 6f 70 74 69 6d 69 7a 65 27 2e  text 'optimize'.
195d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
195e0 74 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74  ts3SpecialInsert
195f0 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73  (Fts3Table *p, s
19600 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
19610 61 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  al){.  int rc;  
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
19640 20 43 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   Code */.  const
19650 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 28 63   char *zVal = (c
19660 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
19670 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
19680 56 61 6c 29 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Val);.  int nVal
19690 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
196a0 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 0a 20  _bytes(pVal);.. 
196b0 20 69 66 28 20 21 7a 56 61 6c 20 29 7b 0a 20 20   if( !zVal ){.  
196c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
196d0 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 20 69  NOMEM;.  }else i
196e0 66 28 20 6e 56 61 6c 3d 3d 38 20 26 26 20 30 3d  f( nVal==8 && 0=
196f0 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
19700 70 28 7a 56 61 6c 2c 20 22 6f 70 74 69 6d 69 7a  p(zVal, "optimiz
19710 65 22 2c 20 38 29 20 29 7b 0a 20 20 20 20 72 63  e", 8) ){.    rc
19720 20 3d 20 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a   = fts3DoOptimiz
19730 65 28 70 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  e(p, 0);.  }else
19740 20 69 66 28 20 6e 56 61 6c 3d 3d 37 20 26 26 20   if( nVal==7 && 
19750 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
19760 63 6d 70 28 7a 56 61 6c 2c 20 22 72 65 62 75 69  cmp(zVal, "rebui
19770 6c 64 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 72  ld", 7) ){.    r
19780 63 20 3d 20 66 74 73 33 44 6f 52 65 62 75 69 6c  c = fts3DoRebuil
19790 64 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d(p);.#ifdef SQL
197a0 49 54 45 5f 54 45 53 54 0a 20 20 7d 65 6c 73 65  ITE_TEST.  }else
197b0 20 69 66 28 20 6e 56 61 6c 3e 39 20 26 26 20 30   if( nVal>9 && 0
197c0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
197d0 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64 65 73 69  mp(zVal, "nodesi
197e0 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20  ze=", 9) ){.    
197f0 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 3d 20 61  p->nNodeSize = a
19800 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29 3b 0a 20  toi(&zVal[9]);. 
19810 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
19820 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  K;.  }else if( n
19830 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d 73 71 6c  Val>11 && 0==sql
19840 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
19850 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69 6e 67 3d  al, "maxpending=
19860 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e  ", 9) ){.    p->
19870 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20  nMaxPendingData 
19880 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 31 31 5d  = atoi(&zVal[11]
19890 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
198a0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  TE_OK;.#endif.  
198b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
198c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
198d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
198e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
198f0 61 6c 6c 20 63 61 63 68 65 64 20 64 65 66 65 72  all cached defer
19900 72 65 64 20 64 6f 63 6c 69 73 74 73 2e 20 44 65  red doclists. De
19910 66 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73 20  ferred doclists 
19920 61 72 65 20 63 61 63 68 65 64 0a 2a 2a 20 28 61  are cached.** (a
19930 6c 6c 6f 63 61 74 65 64 29 20 62 79 20 74 68 65  llocated) by the
19940 20 73 71 6c 69 74 65 33 46 74 73 33 43 61 63 68   sqlite3Fts3Cach
19950 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74  eDeferredDoclist
19960 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  s() function..*/
19970 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
19980 33 46 72 65 65 44 65 66 65 72 72 65 64 44 6f 63  3FreeDeferredDoc
19990 6c 69 73 74 73 28 46 74 73 33 43 75 72 73 6f 72  lists(Fts3Cursor
199a0 20 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 33 44   *pCsr){.  Fts3D
199b0 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44  eferredToken *pD
199c0 65 66 3b 0a 20 20 66 6f 72 28 70 44 65 66 3d 70  ef;.  for(pDef=p
199d0 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20  Csr->pDeferred; 
199e0 70 44 65 66 3b 20 70 44 65 66 3d 70 44 65 66 2d  pDef; pDef=pDef-
199f0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 66 74 73  >pNext){.    fts
19a00 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65  3PendingListDele
19a10 74 65 28 70 44 65 66 2d 3e 70 4c 69 73 74 29 3b  te(pDef->pList);
19a20 0a 20 20 20 20 70 44 65 66 2d 3e 70 4c 69 73 74  .    pDef->pList
19a30 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
19a40 2a 2a 20 46 72 65 65 20 61 6c 6c 20 65 6e 74 72  ** Free all entr
19a50 69 65 73 20 69 6e 20 74 68 65 20 70 43 73 72 2d  ies in the pCsr-
19a60 3e 70 44 65 66 66 65 72 65 64 20 6c 69 73 74 2e  >pDeffered list.
19a70 20 45 6e 74 72 69 65 73 20 61 72 65 20 61 64 64   Entries are add
19a80 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20 6c  ed to .** this l
19a90 69 73 74 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ist using sqlite
19aa0 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28  3Fts3DeferToken(
19ab0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
19ac0 65 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72  e3Fts3FreeDeferr
19ad0 65 64 54 6f 6b 65 6e 73 28 46 74 73 33 43 75 72  edTokens(Fts3Cur
19ae0 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74  sor *pCsr){.  Ft
19af0 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20  s3DeferredToken 
19b00 2a 70 44 65 66 3b 0a 20 20 46 74 73 33 44 65 66  *pDef;.  Fts3Def
19b10 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 4e 65 78  erredToken *pNex
19b20 74 3b 0a 20 20 66 6f 72 28 70 44 65 66 3d 70 43  t;.  for(pDef=pC
19b30 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70  sr->pDeferred; p
19b40 44 65 66 3b 20 70 44 65 66 3d 70 4e 65 78 74 29  Def; pDef=pNext)
19b50 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 44  {.    pNext = pD
19b60 65 66 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 66  ef->pNext;.    f
19b70 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65  ts3PendingListDe
19b80 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c 69 73 74  lete(pDef->pList
19b90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19ba0 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a 20  ree(pDef);.  }. 
19bb0 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64   pCsr->pDeferred
19bc0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = 0;.}../*.** G
19bd0 65 6e 65 72 61 74 65 20 64 65 66 65 72 72 65 64  enerate deferred
19be0 2d 64 6f 63 6c 69 73 74 73 20 66 6f 72 20 61 6c  -doclists for al
19bf0 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20  l tokens in the 
19c00 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20  pCsr->pDeferred 
19c10 6c 69 73 74 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  list.** based on
19c20 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 70 43   the row that pC
19c30 73 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  sr currently poi
19c40 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 41 20  nts to..**.** A 
19c50 64 65 66 65 72 72 65 64 2d 64 6f 63 6c 69 73 74  deferred-doclist
19c60 20 69 73 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68   is like any oth
19c70 65 72 20 64 6f 63 6c 69 73 74 20 77 69 74 68 20  er doclist with 
19c80 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  position informa
19c90 74 69 6f 6e 0a 2a 2a 20 69 6e 63 6c 75 64 65 64  tion.** included
19ca0 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
19cb0 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e 73 20 65   only contains e
19cc0 6e 74 72 69 65 73 20 66 6f 72 20 61 20 73 69 6e  ntries for a sin
19cd0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a  gle row of the.*
19ce0 2a 20 74 61 62 6c 65 2c 20 6e 6f 74 20 66 6f 72  * table, not for
19cf0 20 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2f 0a 69 6e   all rows..*/.in
19d00 74 20 73 71 6c 69 74 65 33 46 74 73 33 43 61 63  t sqlite3Fts3Cac
19d10 68 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73  heDeferredDoclis
19d20 74 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70  ts(Fts3Cursor *p
19d30 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Csr){.  int rc =
19d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
19d50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
19d60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20  n code */.  if( 
19d70 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20  pCsr->pDeferred 
19d80 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
19db0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
19dc0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f  table columns */
19dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
19de0 36 34 20 69 44 6f 63 69 64 3b 20 20 20 20 20 20  64 iDocid;      
19df0 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20 74     /* Docid of t
19e00 68 65 20 72 6f 77 20 70 43 73 72 20 70 6f 69 6e  he row pCsr poin
19e10 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 46 74 73  ts to */.    Fts
19e20 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
19e30 70 44 65 66 3b 20 20 20 20 20 20 2f 2a 20 55 73  pDef;      /* Us
19e40 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
19e50 72 6f 75 67 68 20 64 65 66 65 72 72 65 64 20 74  rough deferred t
19e60 6f 6b 65 6e 73 20 2a 2f 0a 20 20 0a 20 20 20 20  okens */.  .    
19e70 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28  Fts3Table *p = (
19e80 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72  Fts3Table *)pCsr
19e90 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20  ->base.pVtab;.  
19ea0 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
19eb0 7a 65 72 20 2a 70 54 20 3d 20 70 2d 3e 70 54 6f  zer *pT = p->pTo
19ec0 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20 73 71 6c  kenizer;.    sql
19ed0 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
19ee0 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
19ef0 64 75 6c 65 20 3d 20 70 54 2d 3e 70 4d 6f 64 75  dule = pT->pModu
19f00 6c 65 3b 0a 20 20 20 0a 20 20 20 20 61 73 73 65  le;.   .    asse
19f10 72 74 28 20 70 43 73 72 2d 3e 69 73 52 65 71 75  rt( pCsr->isRequ
19f20 69 72 65 53 65 65 6b 3d 3d 30 20 29 3b 0a 20 20  ireSeek==0 );.  
19f30 20 20 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74    iDocid = sqlit
19f40 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
19f50 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b  pCsr->pStmt, 0);
19f60 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  .  .    for(i=0;
19f70 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26   i<p->nColumn &&
19f80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
19f90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
19fa0 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  t char *zText = 
19fb0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
19fc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
19fd0 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 69  t(pCsr->pStmt, i
19fe0 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
19ff0 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72  e3_tokenizer_cur
1a000 73 6f 72 20 2a 70 54 43 20 3d 20 30 3b 0a 20 20  sor *pTC = 0;.  
1a010 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a020 74 65 33 46 74 73 33 4f 70 65 6e 54 6f 6b 65 6e  te3Fts3OpenToken
1a030 69 7a 65 72 28 70 54 2c 20 70 43 73 72 2d 3e 69  izer(pT, pCsr->i
1a040 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c 20 2d  Langid, zText, -
1a050 31 2c 20 26 70 54 43 29 3b 0a 20 20 20 20 20 20  1, &pTC);.      
1a060 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1a070 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a080 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b  char const *zTok
1a090 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42 75 66  en;       /* Buf
1a0a0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
1a0b0 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  oken */.        
1a0c0 69 6e 74 20 6e 54 6f 6b 65 6e 3b 20 20 20 20 20  int nToken;     
1a0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a0e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1a0f0 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  token */.       
1a100 20 69 6e 74 20 69 44 75 6d 31 2c 20 69 44 75 6d   int iDum1, iDum
1a110 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75  2;         /* Du
1a120 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  mmy variables */
1a130 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f  .        int iPo
1a140 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1a150 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
1a160 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74  f token in zText
1a170 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 72   */.  .        r
1a180 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  c = pModule->xNe
1a190 78 74 28 70 54 43 2c 20 26 7a 54 6f 6b 65 6e 2c  xt(pTC, &zToken,
1a1a0 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31   &nToken, &iDum1
1a1b0 2c 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 29  , &iDum2, &iPos)
1a1c0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 44  ;.        for(pD
1a1d0 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72  ef=pCsr->pDeferr
1a1e0 65 64 3b 20 70 44 65 66 20 26 26 20 72 63 3d 3d  ed; pDef && rc==
1a1f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65 66 3d  SQLITE_OK; pDef=
1a200 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pDef->pNext){.  
1a210 20 20 20 20 20 20 20 20 46 74 73 33 50 68 72 61          Fts3Phra
1a220 73 65 54 6f 6b 65 6e 20 2a 70 50 54 20 3d 20 70  seToken *pPT = p
1a230 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b 0a 20 20 20  Def->pToken;.   
1a240 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
1a250 2d 3e 69 43 6f 6c 3e 3d 70 2d 3e 6e 43 6f 6c 75  ->iCol>=p->nColu
1a260 6d 6e 20 7c 7c 20 70 44 65 66 2d 3e 69 43 6f 6c  mn || pDef->iCol
1a270 3d 3d 69 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==i).           
1a280 26 26 20 28 70 50 54 2d 3e 62 46 69 72 73 74 3d  && (pPT->bFirst=
1a290 3d 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29 0a 20  =0 || iPos==0). 
1a2a0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
1a2b0 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20  T->n==nToken || 
1a2c0 28 70 50 54 2d 3e 69 73 50 72 65 66 69 78 20 26  (pPT->isPrefix &
1a2d0 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e 29  & pPT->n<nToken)
1a2e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
1a2f0 28 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54 6f 6b 65  (0==memcmp(zToke
1a300 6e 2c 20 70 50 54 2d 3e 7a 2c 20 70 50 54 2d 3e  n, pPT->z, pPT->
1a310 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  n)).          ){
1a320 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1a330 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
1a340 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69 73 74 2c  nd(&pDef->pList,
1a350 20 69 44 6f 63 69 64 2c 20 69 2c 20 69 50 6f 73   iDocid, i, iPos
1a360 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
1a370 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1a380 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a390 70 54 43 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78  pTC ) pModule->x
1a3a0 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20 20 20 20  Close(pTC);.    
1a3b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a3c0 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
1a3d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1a3e0 0a 20 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43  .    for(pDef=pC
1a3f0 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70  sr->pDeferred; p
1a400 44 65 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Def && rc==SQLIT
1a410 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d  E_OK; pDef=pDef-
1a420 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1a430 66 28 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 29  f( pDef->pList )
1a440 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
1a450 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
1a460 70 65 6e 64 56 61 72 69 6e 74 28 26 70 44 65 66  pendVarint(&pDef
1a470 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  ->pList, 0);.   
1a480 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1a490 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a4a0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 44  int sqlite3Fts3D
1a4b0 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69 73 74  eferredTokenList
1a4c0 28 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64  (.  Fts3Deferred
1a4d0 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63 68 61  Token *p, .  cha
1a4e0 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20 20 69  r **ppData, .  i
1a4f0 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a 20 20  nt *pnData.){.  
1a500 63 68 61 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e  char *pRet;.  in
1a510 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c 69 74  t nSkip;.  sqlit
1a520 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79 3b 0a  e3_int64 dummy;.
1a530 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 30 3b 0a  .  *ppData = 0;.
1a540 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a 0a    *pnData = 0;..
1a550 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d 3d    if( p->pList==
1a560 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a570 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1a580 20 20 70 52 65 74 20 3d 20 28 63 68 61 72 20 2a    pRet = (char *
1a590 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
1a5a0 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61 29  p->pList->nData)
1a5b0 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20 29 20  ;.  if( !pRet ) 
1a5c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1a5d0 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20 3d 20  MEM;..  nSkip = 
1a5e0 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
1a5f0 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61  rint(p->pList->a
1a600 44 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  Data, &dummy);. 
1a610 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e 70 4c   *pnData = p->pL
1a620 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 6b  ist->nData - nSk
1a630 69 70 3b 0a 20 20 2a 70 70 44 61 74 61 20 3d 20  ip;.  *ppData = 
1a640 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d 63 70  pRet;.  .  memcp
1a650 79 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c 69 73  y(pRet, &p->pLis
1a660 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70 5d 2c  t->aData[nSkip],
1a670 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72 65 74   *pnData);.  ret
1a680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a690 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  ../*.** Add an e
1a6a0 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e 20 70  ntry for token p
1a6b0 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70 43 73  Token to the pCs
1a6c0 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69 73  r->pDeferred lis
1a6d0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1a6e0 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28  3Fts3DeferToken(
1a6f0 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
1a700 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
1a710 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65     /* Fts3 table
1a720 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74 73   cursor */.  Fts
1a730 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54  3PhraseToken *pT
1a740 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
1a750 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 20 2a  Token to defer *
1a760 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68      /* Column th
1a790 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20 61 70  at token must ap
1a7a0 70 65 61 72 20 69 6e 20 28 6f 72 20 2d 31 29 20  pear in (or -1) 
1a7b0 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65 66 65  */.){.  Fts3Defe
1a7c0 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65  rredToken *pDefe
1a7d0 72 72 65 64 3b 0a 20 20 70 44 65 66 65 72 72 65  rred;.  pDeferre
1a7e0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
1a7f0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44 65 66 65  oc(sizeof(*pDefe
1a800 72 72 65 64 29 29 3b 0a 20 20 69 66 28 20 21 70  rred));.  if( !p
1a810 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20  Deferred ){.    
1a820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1a830 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
1a840 74 28 70 44 65 66 65 72 72 65 64 2c 20 30 2c 20  t(pDeferred, 0, 
1a850 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72 72 65  sizeof(*pDeferre
1a860 64 29 29 3b 0a 20 20 70 44 65 66 65 72 72 65 64  d));.  pDeferred
1a870 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f 6b 65  ->pToken = pToke
1a880 6e 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e  n;.  pDeferred->
1a890 70 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e 70 44  pNext = pCsr->pD
1a8a0 65 66 65 72 72 65 64 3b 20 0a 20 20 70 44 65 66  eferred; .  pDef
1a8b0 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20 69 43  erred->iCol = iC
1a8c0 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44 65 66  ol;.  pCsr->pDef
1a8d0 65 72 72 65 64 20 3d 20 70 44 65 66 65 72 72 65  erred = pDeferre
1a8e0 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  d;..  assert( pT
1a8f0 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3d  oken->pDeferred=
1a900 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e  =0 );.  pToken->
1a910 70 44 65 66 65 72 72 65 64 20 3d 20 70 44 65 66  pDeferred = pDef
1a920 65 72 72 65 64 3b 0a 0a 20 20 72 65 74 75 72 6e  erred;..  return
1a930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a940 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61 6c 75  *.** SQLite valu
1a950 65 20 70 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e  e pRowid contain
1a960 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61  s the rowid of a
1a970 20 72 6f 77 20 74 68 61 74 20 6d 61 79 20 6f 72   row that may or
1a980 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 70   may not be.** p
1a990 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 46 54  resent in the FT
1a9a0 53 33 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20  S3 table. If it 
1a9b0 69 73 2c 20 64 65 6c 65 74 65 20 69 74 20 61 6e  is, delete it an
1a9c0 64 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 6e  d adjust the con
1a9d0 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75 62 73  tents.** of subs
1a9e0 69 64 75 61 72 79 20 64 61 74 61 20 73 74 72 75  iduary data stru
1a9f0 63 74 75 72 65 73 20 61 63 63 6f 72 64 69 6e 67  ctures according
1aa00 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
1aa10 74 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f  t fts3DeleteByRo
1aa20 77 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65  wid(.  Fts3Table
1aa30 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f   *p, .  sqlite3_
1aa40 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 0a  value *pRowid, .
1aa50 20 20 69 6e 74 20 2a 70 6e 44 6f 63 2c 0a 20 20    int *pnDoc,.  
1aa60 75 33 32 20 2a 61 53 7a 44 65 6c 0a 29 7b 0a 20  u32 *aSzDel.){. 
1aa70 20 69 6e 74 20 69 73 45 6d 70 74 79 20 3d 20 30   int isEmpty = 0
1aa80 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
1aa90 33 49 73 45 6d 70 74 79 28 70 2c 20 70 52 6f 77  3IsEmpty(p, pRow
1aaa0 69 64 2c 20 26 69 73 45 6d 70 74 79 29 3b 0a 20  id, &isEmpty);. 
1aab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1aac0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  OK ){.    if( is
1aad0 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 2f  Empty ){.      /
1aae0 2a 20 44 65 6c 65 74 69 6e 67 20 74 68 69 73 20  * Deleting this 
1aaf0 72 6f 77 20 6d 65 61 6e 73 20 74 68 65 20 77 68  row means the wh
1ab00 6f 6c 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  ole table is emp
1ab10 74 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ty. In this case
1ab20 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  .      ** delete
1ab30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1ab40 20 61 6c 6c 20 74 68 72 65 65 20 74 61 62 6c 65   all three table
1ab50 73 20 61 6e 64 20 74 68 72 6f 77 20 61 77 61 79  s and throw away
1ab60 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 64 61   any.      ** da
1ab70 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64 69 6e  ta in the pendin
1ab80 67 54 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c  gTerms hash tabl
1ab90 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  e.  */.      rc 
1aba0 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28  = fts3DeleteAll(
1abb0 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 2a 70 6e  p, 1);.      *pn
1abc0 44 6f 63 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31  Doc = *pnDoc - 1
1abd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1abe0 20 20 20 66 74 73 33 44 65 6c 65 74 65 54 65 72     fts3DeleteTer
1abf0 6d 73 28 26 72 63 2c 20 70 2c 20 70 52 6f 77 69  ms(&rc, p, pRowi
1ac00 64 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20  d, aSzDel);.    
1ac10 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e    if( p->zConten
1ac20 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tTbl==0 ){.     
1ac30 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26     fts3SqlExec(&
1ac40 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54  rc, p, SQL_DELET
1ac50 45 5f 43 4f 4e 54 45 4e 54 2c 20 26 70 52 6f 77  E_CONTENT, &pRow
1ac60 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  id);.        if(
1ac70 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
1ac80 28 70 2d 3e 64 62 29 20 29 20 2a 70 6e 44 6f 63  (p->db) ) *pnDoc
1ac90 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31 3b 0a 20   = *pnDoc - 1;. 
1aca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1acb0 20 20 20 20 2a 70 6e 44 6f 63 20 3d 20 2a 70 6e      *pnDoc = *pn
1acc0 44 6f 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 7d  Doc - 1;.      }
1acd0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 48  .      if( p->bH
1ace0 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20  asDocsize ){.   
1acf0 20 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63       fts3SqlExec
1ad00 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
1ad10 45 54 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70 52  ETE_DOCSIZE, &pR
1ad20 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  owid);.      }. 
1ad30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1ad40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ad50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
1ad60 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20  es the work for 
1ad70 74 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68  the xUpdate meth
1ad80 6f 64 20 6f 66 20 46 54 53 33 20 76 69 72 74 75  od of FTS3 virtu
1ad90 61 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68  al.** tables. Th
1ada0 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20  e schema of the 
1adb0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 62 65  virtual table be
1adc0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ing:.**.**     C
1add0 52 45 41 54 45 20 54 41 42 4c 45 20 3c 74 61 62  REATE TABLE <tab
1ade0 6c 65 20 6e 61 6d 65 3e 28 20 0a 2a 2a 20 20 20  le name>( .**   
1adf0 20 20 20 20 3c 75 73 65 72 20 43 4f 4c 55 4d 6e      <user COLUMn
1ae00 73 3e 2c 0a 2a 2a 20 20 20 20 20 20 20 3c 74 61  s>,.**       <ta
1ae10 62 6c 65 20 6e 61 6d 65 3e 20 48 49 44 44 45 4e  ble name> HIDDEN
1ae20 2c 20 0a 2a 2a 20 20 20 20 20 20 20 64 6f 63 69  , .**       doci
1ae30 64 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20  d HIDDEN, .**   
1ae40 20 20 20 20 3c 6c 61 6e 67 69 64 3e 20 48 49 44      <langid> HID
1ae50 44 45 4e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a  DEN.**     );.**
1ae60 0a 2a 2a 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  .** .*/.int sqli
1ae70 74 65 33 46 74 73 33 55 70 64 61 74 65 4d 65 74  te3Fts3UpdateMet
1ae80 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  hod(.  sqlite3_v
1ae90 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20  tab *pVtab,     
1aea0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 76         /* FTS3 v
1aeb0 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tab object */.  
1aec0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d  /* Size of argum
1aef0 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
1af00 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1af10 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  pVal,          /
1af20 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
1af30 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ents */.  sqlite
1af40 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 20 20  _int64 *pRowid  
1af50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1af60 3a 20 54 68 65 20 61 66 66 65 63 74 65 64 20 28  : The affected (
1af70 6f 72 20 65 66 66 65 63 74 65 64 29 20 72 6f 77  or effected) row
1af80 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54  id */.){.  Fts3T
1af90 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
1afa0 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20 20  able *)pVtab;.  
1afb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1afc0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
1afd0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
1afe0 2f 0a 20 20 69 6e 74 20 69 73 52 65 6d 6f 76 65  /.  int isRemove
1aff0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b000 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
1b010 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
1b020 45 54 45 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53  ETE */.  u32 *aS
1b030 7a 49 6e 73 20 3d 20 30 3b 20 20 20 20 20 20 20  zIns = 0;       
1b040 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b050 73 20 6f 66 20 69 6e 73 65 72 74 65 64 20 64 6f  s of inserted do
1b060 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 75 33 32  cuments */.  u32
1b070 20 2a 61 53 7a 44 65 6c 3b 20 20 20 20 20 20 20   *aSzDel;       
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b090 53 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64  Sizes of deleted
1b0a0 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   documents */.  
1b0b0 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 20 20  int nChng = 0;  
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 2f 2a 20 4e 65 74 20 63 68 61 6e 67 65 20 69 6e  /* Net change in
1b0e0 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d   number of docum
1b0f0 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ents */.  int bI
1b100 6e 73 65 72 74 44 6f 6e 65 20 3d 20 30 3b 0a 0a  nsertDone = 0;..
1b110 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65    assert( p->pSe
1b120 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20 61  gments==0 );.  a
1b130 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 6e 41  ssert( .      nA
1b140 72 67 3d 3d 31 20 20 20 20 20 20 20 20 20 20 20  rg==1           
1b150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c            /* DEL
1b160 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  ETE operations *
1b170 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d 28 32  /.   || nArg==(2
1b180 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20   + p->nColumn + 
1b190 33 29 20 20 2f 2a 20 49 4e 53 45 52 54 20 6f 72  3)  /* INSERT or
1b1a0 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
1b1b0 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ns */.  );..  /*
1b1c0 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22 73 70   Check for a "sp
1b1d0 65 63 69 61 6c 22 20 49 4e 53 45 52 54 20 6f 70  ecial" INSERT op
1b1e0 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66 20  eration. One of 
1b1f0 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
1b200 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54   **   INSERT INT
1b210 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45  O xyz(xyz) VALUE
1b220 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a 20 20  S('command');.  
1b230 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20  */.  if( nArg>1 
1b240 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76  .   && sqlite3_v
1b250 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
1b260 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
1b270 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f   .   && sqlite3_
1b280 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
1b290 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 21  [p->nColumn+2])!
1b2a0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20 20  =SQLITE_NULL .  
1b2b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
1b2c0 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28 70 2c  SpecialInsert(p,
1b2d0 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d   apVal[p->nColum
1b2e0 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74 6f 20  n+2]);.    goto 
1b2f0 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a  update_out;.  }.
1b300 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26  .  if( nArg>1 &&
1b310 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
1b320 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70 2d 3e  nt(apVal[2 + p->
1b330 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c 30 20  nColumn + 2])<0 
1b340 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1b350 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
1b360 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f     goto update_o
1b370 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  ut;.  }..  /* Al
1b380 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20  locate space to 
1b390 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67 65 20  hold the change 
1b3a0 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65  in document size
1b3b0 73 20 2a 2f 0a 20 20 61 53 7a 49 6e 73 20 3d 20  s */.  aSzIns = 
1b3c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1b3d0 73 69 7a 65 6f 66 28 61 53 7a 49 6e 73 5b 30 5d  sizeof(aSzIns[0]
1b3e0 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29  )*(p->nColumn+1)
1b3f0 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 53 7a 49  *2 );.  if( aSzI
1b400 6e 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ns==0 ){.    rc 
1b410 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1b420 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
1b430 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a 44 65  out;.  }.  aSzDe
1b440 6c 20 3d 20 26 61 53 7a 49 6e 73 5b 70 2d 3e 6e  l = &aSzIns[p->n
1b450 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d 65 6d  Column+1];.  mem
1b460 73 65 74 28 61 53 7a 49 6e 73 2c 20 30 2c 20 73  set(aSzIns, 0, s
1b470 69 7a 65 6f 66 28 61 53 7a 49 6e 73 5b 30 5d 29  izeof(aSzIns[0])
1b480 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a  *(p->nColumn+1)*
1b490 32 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  2);..  /* If thi
1b4a0 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f  s is an INSERT o
1b4b0 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 61 6e 20  peration, or an 
1b4c0 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f 64 69  UPDATE that modi
1b4d0 66 69 65 73 20 74 68 65 20 72 6f 77 69 64 0a 20  fies the rowid. 
1b4e0 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68 65 6e 20   ** value, then 
1b4f0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
1b500 65 71 75 69 72 65 73 20 63 6f 6e 73 74 72 61 69  equires constrai
1b510 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 2a  nt handling..  *
1b520 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 6e  *.  ** If the on
1b530 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69  -conflict mode i
1b540 73 20 52 45 50 4c 41 43 45 2c 20 74 68 69 73 20  s REPLACE, this 
1b550 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65  means that the e
1b560 78 69 73 74 69 6e 67 20 72 6f 77 0a 20 20 2a 2a  xisting row.  **
1b570 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 65 74   should be delet
1b580 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1b590 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e 73 65  base before inse
1b5a0 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 72 6f  rting the new ro
1b5b0 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69 66 20 74  w. Or,.  ** if t
1b5c0 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d  he on-conflict m
1b5d0 6f 64 65 20 69 73 20 6f 74 68 65 72 20 74 68 61  ode is other tha
1b5e0 6e 20 52 45 50 4c 41 43 45 2c 20 74 68 65 6e 20  n REPLACE, then 
1b5f0 74 68 69 73 20 6d 65 74 68 6f 64 20 6d 75 73 74  this method must
1b600 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 65  .  ** detect the
1b610 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64 20 72 65   conflict and re
1b620 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
1b630 54 52 41 49 4e 54 20 62 65 66 6f 72 65 20 62 65  TRAINT before be
1b640 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  ginning to.  ** 
1b650 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
1b660 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
1b670 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 70   if( nArg>1 && p
1b680 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
1b690 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   ){.    /* Find 
1b6a0 74 68 65 20 76 61 6c 75 65 20 6f 62 6a 65 63 74  the value object
1b6b0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
1b6c0 6e 65 77 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  new rowid value.
1b6d0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1b6e0 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f 77 69 64  value *pNewRowid
1b6f0 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43   = apVal[3+p->nC
1b700 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69 66 28 20  olumn];.    if( 
1b710 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1b720 70 65 28 70 4e 65 77 52 6f 77 69 64 29 3d 3d 53  pe(pNewRowid)==S
1b730 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
1b740 20 20 20 20 70 4e 65 77 52 6f 77 69 64 20 3d 20      pNewRowid = 
1b750 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d 0a  apVal[1];.    }.
1b760 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1b770 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e 65 77  _value_type(pNew
1b780 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45 5f 4e  Rowid)!=SQLITE_N
1b790 55 4c 4c 20 26 26 20 28 20 0a 20 20 20 20 20 20  ULL && ( .      
1b7a0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
1b7b0 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d 3d  type(apVal[0])==
1b7c0 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20  SQLITE_NULL.    
1b7d0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   || sqlite3_valu
1b7e0 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d  e_int64(apVal[0]
1b7f0 29 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  )!=sqlite3_value
1b800 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f 77 69 64  _int64(pNewRowid
1b810 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20  ).    )){.      
1b820 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64  /* The new rowid
1b830 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 69 6e   is not NULL (in
1b840 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72   this case the r
1b850 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a 20 20 20  owid will be.   
1b860 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
1b870 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 61 6e 64  lly assigned and
1b880 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
1b890 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63  nce of a conflic
1b8a0 74 29 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 2a  t), and .      *
1b8b0 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
1b8c0 69 73 20 65 69 74 68 65 72 20 61 6e 20 49 4e 53  is either an INS
1b8d0 45 52 54 20 6f 72 20 61 6e 20 55 50 44 41 54 45  ERT or an UPDATE
1b8e0 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 74   that modifies t
1b8f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69  he.      ** rowi
1b900 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20 69 66 20  d column. So if 
1b910 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d 6f 64  the conflict mod
1b920 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68  e is REPLACE, th
1b930 65 6e 20 64 65 6c 65 74 65 20 61 6e 79 0a 20 20  en delete any.  
1b940 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20      ** existing 
1b950 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64 3d 70  row with rowid=p
1b960 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20 20 20 20  NewRowid. .     
1b970 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c   **.      ** Or,
1b980 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   if the conflict
1b990 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20 52 45 50   mode is not REP
1b9a0 4c 41 43 45 2c 20 69 6e 73 65 72 74 20 74 68 65  LACE, insert the
1b9b0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
1b9c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 25   .      ** the %
1b9d0 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20  _content table. 
1b9e0 49 66 20 77 65 20 68 69 74 20 74 68 65 20 64 75  If we hit the du
1b9f0 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20 63 6f  plicate rowid co
1ba00 6e 73 74 72 61 69 6e 74 20 28 6f 72 20 61 6e 79  nstraint (or any
1ba10 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
1ba20 65 72 72 6f 72 29 20 77 68 69 6c 65 20 64 6f 69  error) while doi
1ba30 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e 20 69 6d  ng so, return im
1ba40 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 20  mediately..     
1ba50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
1ba60 73 20 62 72 61 6e 63 68 20 6d 61 79 20 61 6c 73  s branch may als
1ba70 6f 20 72 75 6e 20 69 66 20 70 4e 65 77 52 6f 77  o run if pNewRow
1ba80 69 64 20 63 6f 6e 74 61 69 6e 73 20 61 20 76 61  id contains a va
1ba90 6c 75 65 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a  lue that cannot.
1baa0 20 20 20 20 20 20 2a 2a 20 62 65 20 6c 6f 73 73        ** be loss
1bab0 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65 64  lessly converted
1bac0 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   to an integer. 
1bad0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1bae0 65 20 65 76 65 6e 74 75 61 6c 20 0a 20 20 20 20  e eventual .    
1baf0 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73    ** call to fts
1bb00 33 49 6e 73 65 72 74 44 61 74 61 28 29 20 28 65  3InsertData() (e
1bb10 69 74 68 65 72 20 6a 75 73 74 20 62 65 6c 6f 77  ither just below
1bb20 20 6f 72 20 66 75 72 74 68 65 72 20 6f 6e 20 69   or further on i
1bb30 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
1bb40 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c 6c 20 72  function) will r
1bb50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1bb60 4d 41 54 43 48 2e 20 49 66 20 66 74 73 33 44 65  MATCH. If fts3De
1bb70 6c 65 74 65 42 79 52 6f 77 69 64 20 69 73 20 0a  leteByRowid is .
1bb80 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 65 64        ** invoked
1bb90 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c 65 74 65  , it will delete
1bba0 20 7a 65 72 6f 20 72 6f 77 73 20 28 73 69 6e 63   zero rows (sinc
1bbb0 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c 20 68 61  e no row will ha
1bbc0 76 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 69  ve.      ** doci
1bbd0 64 3d 24 70 4e 65 77 52 6f 77 69 64 20 69 66 20  d=$pNewRowid if 
1bbe0 24 70 4e 65 77 52 6f 77 69 64 20 69 73 20 6e 6f  $pNewRowid is no
1bbf0 74 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  t an integer val
1bc00 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ue)..      */.  
1bc10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1bc20 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74  vtab_on_conflict
1bc30 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49 54 45 5f  (p->db)==SQLITE_
1bc40 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20  REPLACE ){.     
1bc50 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
1bc60 74 65 42 79 52 6f 77 69 64 28 70 2c 20 70 4e 65  teByRowid(p, pNe
1bc70 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e 67 2c 20  wRowid, &nChng, 
1bc80 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 20 20 7d  aSzDel);.      }
1bc90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1bca0 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44 61 74   = fts3InsertDat
1bcb0 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f 77  a(p, apVal, pRow
1bcc0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 49 6e  id);.        bIn
1bcd0 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  sertDone = 1;.  
1bce0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bcf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bd00 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1bd10 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a  update_out;.  }.
1bd20 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1bd30 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44   a DELETE or UPD
1bd40 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20 72  ATE operation, r
1bd50 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 20 72 65  emove the old re
1bd60 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cord. */.  if( s
1bd70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
1bd80 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d 53 51 4c  e(apVal[0])!=SQL
1bd90 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
1bda0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1bdb0 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
1bdc0 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  [0])==SQLITE_INT
1bdd0 45 47 45 52 20 29 3b 0a 20 20 20 20 72 63 20 3d  EGER );.    rc =
1bde0 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77   fts3DeleteByRow
1bdf0 69 64 28 70 2c 20 61 70 56 61 6c 5b 30 5d 2c 20  id(p, apVal[0], 
1be00 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c 29 3b  &nChng, aSzDel);
1be10 0a 20 20 20 20 69 73 52 65 6d 6f 76 65 20 3d 20  .    isRemove = 
1be20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  1;.  }.  .  /* I
1be30 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53  f this is an INS
1be40 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f 70  ERT or UPDATE op
1be50 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65 72 74 20  eration, insert 
1be60 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20  the new record. 
1be70 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20  */.  if( nArg>1 
1be80 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1be90 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e   ){.    int iLan
1bea0 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gid = sqlite3_va
1beb0 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20  lue_int(apVal[2 
1bec0 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32  + p->nColumn + 2
1bed0 5d 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 73  ]);.    if( bIns
1bee0 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20  ertDone==0 ){.  
1bef0 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73      rc = fts3Ins
1bf00 65 72 74 44 61 74 61 28 70 2c 20 61 70 56 61 6c  ertData(p, apVal
1bf10 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , pRowid);.     
1bf20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bf30 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 2d  CONSTRAINT && p-
1bf40 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20  >zContentTbl==0 
1bf50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1bf60 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  FTS_CORRUPT_VTAB
1bf70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bf80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bf90 54 45 5f 4f 4b 20 26 26 20 28 21 69 73 52 65 6d  TE_OK && (!isRem
1bfa0 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69 64 21 3d  ove || *pRowid!=
1bfb0 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20 29 20  p->iPrevDocid ) 
1bfc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ){.      rc = ft
1bfd0 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f  s3PendingTermsDo
1bfe0 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  cid(p, iLangid, 
1bff0 2a 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  *pRowid);.    }.
1c000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
1c020 73 73 65 72 74 28 20 70 2d 3e 69 50 72 65 76 44  ssert( p->iPrevD
1c030 6f 63 69 64 3d 3d 2a 70 52 6f 77 69 64 20 29 3b  ocid==*pRowid );
1c040 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
1c050 49 6e 73 65 72 74 54 65 72 6d 73 28 70 2c 20 69  InsertTerms(p, i
1c060 4c 61 6e 67 69 64 2c 20 61 70 56 61 6c 2c 20 61  Langid, apVal, a
1c070 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20  SzIns);.    }.  
1c080 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63    if( p->bHasDoc
1c090 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 66 74  size ){.      ft
1c0a0 73 33 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28  s3InsertDocsize(
1c0b0 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 29 3b  &rc, p, aSzIns);
1c0c0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 6e 67  .    }.    nChng
1c0d0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ++;.  }..  if( p
1c0e0 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20  ->bHasStat ){.  
1c0f0 20 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54    fts3UpdateDocT
1c100 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61 53  otals(&rc, p, aS
1c110 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 43  zIns, aSzDel, nC
1c120 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20 75 70 64 61  hng);.  }.. upda
1c130 74 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  te_out:.  sqlite
1c140 33 5f 66 72 65 65 28 61 53 7a 49 6e 73 29 3b 0a  3_free(aSzIns);.
1c150 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
1c160 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
1c170 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c180 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  * .** Flush any 
1c190 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64  data in the pend
1c1a0 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
1c1b0 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20 49 66  able to disk. If
1c1c0 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
1c1d0 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
1c1e0 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
1c1f0 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68  se (including th
1c200 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c 20 69  e new segment, i
1c210 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61 73 20  f .** there was 
1c220 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c 75 73  any data to flus
1c230 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  h) into a single
1c240 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a 69 6e   segment. .*/.in
1c250 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 74  t sqlite3Fts3Opt
1c260 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20  imize(Fts3Table 
1c270 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1c280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
1c290 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50  ec(p->db, "SAVEP
1c2a0 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c 20 30  OINT fts3", 0, 0
1c2b0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1c2c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c2d0 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 74 69   rc = fts3DoOpti
1c2e0 6d 69 7a 65 28 70 2c 20 31 29 3b 0a 20 20 20 20  mize(p, 1);.    
1c2f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c300 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
1c310 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  DONE ){.      in
1c320 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f  t rc2 = sqlite3_
1c330 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
1c340 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30  EASE fts3", 0, 0
1c350 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1c360 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1c370 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
1c380 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1c390 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
1c3a0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66 74 73  "ROLLBACK TO fts
1c3b0 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  3", 0, 0, 0);.  
1c3c0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
1c3d0 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45  (p->db, "RELEASE
1c3e0 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29   fts3", 0, 0, 0)
1c3f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1c400 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74  lite3Fts3Segment
1c410 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65 74  sClose(p);.  ret
1c420 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
1c430 66 0a                                            f.