/ Hex Artifact Content
Login

Artifact 36fc2e3a28f51ee135a344877c1e4be0a9f45e6e:


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 2f 2a 0a 2a 2a 20 54 68 69     26../*.** Thi
2540: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2550: 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  ed to obtain an 
2560: 53 51 4c 69 74 65 20 70 72 65 70 61 72 65 64 20  SQLite prepared 
2570: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
2580: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 73 74 61 74  .** for the stat
2590: 65 6d 65 6e 74 20 69 64 65 6e 74 69 66 69 65 64  ement identified
25a0: 20 62 79 20 74 68 65 20 73 65 63 6f 6e 64 20 61   by the second a
25b0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 73 75 63 63  rgument. If succ
25c0: 65 73 73 66 75 6c 2c 0a 2a 2a 20 2a 70 70 20 69  essful,.** *pp i
25d0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 72 65 71  s set to the req
25e0: 75 65 73 74 65 64 20 73 74 61 74 65 6d 65 6e 74  uested statement
25f0: 20 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49   handle and SQLI
2600: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
2610: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
2620: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2630: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2640: 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
2650: 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67   0..**.** If arg
2660: 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20 6e  ument apVal is n
2670: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
2680: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
2690: 6e 20 61 72 72 61 79 20 77 69 74 68 0a 2a 2a 20  n array with.** 
26a0: 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79  at least as many
26b0: 20 65 6e 74 72 69 65 73 20 61 73 20 74 68 65 20   entries as the 
26c0: 72 65 71 75 65 73 74 65 64 20 73 74 61 74 65 6d  requested statem
26d0: 65 6e 74 20 68 61 73 20 62 6f 75 6e 64 20 0a 2a  ent has bound .*
26e0: 2a 20 70 61 72 61 6d 65 74 65 72 73 2e 20 54 68  * parameters. Th
26f0: 65 20 76 61 6c 75 65 73 20 61 72 65 20 62 6f 75  e values are bou
2700: 6e 64 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  nd to the statem
2710: 65 6e 74 73 20 70 61 72 61 6d 65 74 65 72 73 20  ents parameters 
2720: 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
2730: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2740: 6e 74 20 66 74 73 33 53 71 6c 53 74 6d 74 28 0a  nt fts3SqlStmt(.
2750: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
2780: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
2790: 6e 74 20 65 53 74 6d 74 2c 20 20 20 20 20 20 20  nt eStmt,       
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27b0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c  * One of the SQL
27c0: 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74 73 20 61  _XXX constants a
27d0: 62 6f 76 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bove */.  sqlite
27e0: 33 5f 73 74 6d 74 20 2a 2a 70 70 2c 20 20 20 20  3_stmt **pp,    
27f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2800: 3a 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  : Statement hand
2810: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2820: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
2830: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2840: 73 20 74 6f 20 62 69 6e 64 20 74 6f 20 73 74 61  s to bind to sta
2850: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  tement */.){.  c
2860: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 71 6c  onst char *azSql
2870: 5b 5d 20 3d 20 7b 0a 2f 2a 20 30 20 20 2a 2f 20  [] = {./* 0  */ 
2880: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
2890: 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 57 48  .'%q_content' WH
28a0: 45 52 45 20 72 6f 77 69 64 20 3d 20 3f 22 2c 0a  ERE rowid = ?",.
28b0: 2f 2a 20 31 20 20 2a 2f 20 20 22 53 45 4c 45 43  /* 1  */  "SELEC
28c0: 54 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c  T NOT EXISTS(SEL
28d0: 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 25  ECT docid FROM %
28e0: 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 57  Q.'%q_content' W
28f0: 48 45 52 45 20 72 6f 77 69 64 21 3d 3f 29 22 2c  HERE rowid!=?)",
2900: 0a 2f 2a 20 32 20 20 2a 2f 20 20 22 44 45 4c 45  ./* 2  */  "DELE
2910: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63  TE FROM %Q.'%q_c
2920: 6f 6e 74 65 6e 74 27 22 2c 0a 2f 2a 20 33 20 20  ontent'",./* 3  
2930: 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  */  "DELETE FROM
2940: 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73   %Q.'%q_segments
2950: 27 22 2c 0a 2f 2a 20 34 20 20 2a 2f 20 20 22 44  '",./* 4  */  "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 64 69 72 27 22 2c 0a 2f 2a 20 35  q_segdir'",./* 5
2980: 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52    */  "DELETE FR
2990: 4f 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a  OM %Q.'%q_docsiz
29a0: 65 27 22 2c 0a 2f 2a 20 36 20 20 2a 2f 20 20 22  e'",./* 6  */  "
29b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
29c0: 25 71 5f 73 74 61 74 27 22 2c 0a 2f 2a 20 37 20  %q_stat'",./* 7 
29d0: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 25 73 20   */  "SELECT %s 
29e0: 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 22 2c 0a  WHERE rowid=?",.
29f0: 2f 2a 20 38 20 20 2a 2f 20 20 22 53 45 4c 45 43  /* 8  */  "SELEC
2a00: 54 20 28 53 45 4c 45 43 54 20 6d 61 78 28 69 64  T (SELECT max(id
2a10: 78 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  x) FROM %Q.'%q_s
2a20: 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76  egdir' WHERE lev
2a30: 65 6c 20 3d 20 3f 29 20 2b 20 31 22 2c 0a 2f 2a  el = ?) + 1",./*
2a40: 20 39 20 20 2a 2f 20 20 22 49 4e 53 45 52 54 20   9  */  "INSERT 
2a50: 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65 67 6d  INTO %Q.'%q_segm
2a60: 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 2c 20 62  ents'(blockid, b
2a70: 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c 20  lock) VALUES(?, 
2a80: 3f 29 22 2c 0a 2f 2a 20 31 30 20 2a 2f 20 20 22  ?)",./* 10 */  "
2a90: 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28  SELECT coalesce(
2aa0: 28 53 45 4c 45 43 54 20 6d 61 78 28 62 6c 6f 63  (SELECT max(bloc
2ab0: 6b 69 64 29 20 46 52 4f 4d 20 25 51 2e 27 25 71  kid) FROM %Q.'%q
2ac0: 5f 73 65 67 6d 65 6e 74 73 27 29 20 2b 20 31 2c  _segments') + 1,
2ad0: 20 31 29 22 2c 0a 2f 2a 20 31 31 20 2a 2f 20 20   1)",./* 11 */  
2ae0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
2af0: 27 25 71 5f 73 65 67 64 69 72 27 20 56 41 4c 55  '%q_segdir' VALU
2b00: 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 22  ES(?,?,?,?,?,?)"
2b10: 2c 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,..          /* 
2b20: 52 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73 20  Return segments 
2b30: 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f 6c  in order from ol
2b40: 64 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 2a  dest to newest.*
2b50: 2f 20 0a 2f 2a 20 31 32 20 2a 2f 20 20 22 53 45  / ./* 12 */  "SE
2b60: 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f  LECT idx, start_
2b70: 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e  block, leaves_en
2b80: 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f  d_block, end_blo
2b90: 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20  ck, root ".     
2ba0: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e         "FROM %Q.
2bb0: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
2bc0: 45 20 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44 45  E level = ? ORDE
2bd0: 52 20 42 59 20 69 64 78 20 41 53 43 22 2c 0a 2f  R BY idx ASC",./
2be0: 2a 20 31 33 20 2a 2f 20 20 22 53 45 4c 45 43 54  * 13 */  "SELECT
2bf0: 20 69 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63   idx, start_bloc
2c00: 6b 2c 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c  k, leaves_end_bl
2c10: 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20  ock, end_block, 
2c20: 72 6f 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20  root ".         
2c30: 20 20 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f     "FROM %Q.'%q_
2c40: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
2c50: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
2c60: 44 20 3f 22 0a 20 20 20 20 20 20 20 20 20 20 20  D ?".           
2c70: 20 22 4f 52 44 45 52 20 42 59 20 6c 65 76 65 6c   "ORDER BY level
2c80: 20 44 45 53 43 2c 20 69 64 78 20 41 53 43 22 2c   DESC, idx ASC",
2c90: 0a 0a 2f 2a 20 31 34 20 2a 2f 20 20 22 53 45 4c  ../* 14 */  "SEL
2ca0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2cb0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
2cc0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
2cd0: 22 2c 0a 2f 2a 20 31 35 20 2a 2f 20 20 22 53 45  ",./* 15 */  "SE
2ce0: 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20  LECT max(level) 
2cf0: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
2d00: 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20  ir' WHERE level 
2d10: 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22  BETWEEN ? AND ?"
2d20: 2c 0a 0a 2f 2a 20 31 36 20 2a 2f 20 20 22 44 45  ,../* 16 */  "DE
2d30: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71  LETE FROM %Q.'%q
2d40: 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c  _segdir' WHERE l
2d50: 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 31 37  evel = ?",./* 17
2d60: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
2d70: 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74  M %Q.'%q_segment
2d80: 73 27 20 57 48 45 52 45 20 62 6c 6f 63 6b 69 64  s' WHERE blockid
2d90: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
2da0: 22 2c 0a 2f 2a 20 31 38 20 2a 2f 20 20 22 49 4e  ",./* 18 */  "IN
2db0: 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 27 25 71  SERT INTO %Q.'%q
2dc0: 5f 63 6f 6e 74 65 6e 74 27 20 56 41 4c 55 45 53  _content' VALUES
2dd0: 28 25 73 29 22 2c 0a 2f 2a 20 31 39 20 2a 2f 20  (%s)",./* 19 */ 
2de0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
2df0: 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 20 57 48  .'%q_docsize' WH
2e00: 45 52 45 20 64 6f 63 69 64 20 3d 20 3f 22 2c 0a  ERE docid = ?",.
2e10: 2f 2a 20 32 30 20 2a 2f 20 20 22 52 45 50 4c 41  /* 20 */  "REPLA
2e20: 43 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 64  CE INTO %Q.'%q_d
2e30: 6f 63 73 69 7a 65 27 20 56 41 4c 55 45 53 28 3f  ocsize' VALUES(?
2e40: 2c 3f 29 22 2c 0a 2f 2a 20 32 31 20 2a 2f 20 20  ,?)",./* 21 */  
2e50: 22 53 45 4c 45 43 54 20 73 69 7a 65 20 46 52 4f  "SELECT size FRO
2e60: 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  M %Q.'%q_docsize
2e70: 27 20 57 48 45 52 45 20 64 6f 63 69 64 3d 3f 22  ' WHERE docid=?"
2e80: 2c 0a 2f 2a 20 32 32 20 2a 2f 20 20 22 53 45 4c  ,./* 22 */  "SEL
2e90: 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 25  ECT value FROM %
2ea0: 51 2e 27 25 71 5f 73 74 61 74 27 20 57 48 45 52  Q.'%q_stat' WHER
2eb0: 45 20 69 64 3d 30 22 2c 0a 2f 2a 20 32 33 20 2a  E id=0",./* 23 *
2ec0: 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f  /  "REPLACE INTO
2ed0: 20 25 51 2e 27 25 71 5f 73 74 61 74 27 20 56 41   %Q.'%q_stat' VA
2ee0: 4c 55 45 53 28 30 2c 3f 29 22 2c 0a 2f 2a 20 32  LUES(0,?)",./* 2
2ef0: 34 20 2a 2f 20 20 22 22 2c 0a 2f 2a 20 32 35 20  4 */  "",./* 25 
2f00: 2a 2f 20 20 22 22 2c 0a 0a 2f 2a 20 32 36 20 2a  */  "",../* 26 *
2f10: 2f 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25  / "DELETE FROM %
2f20: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
2f30: 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45  ERE level BETWEE
2f40: 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 0a 20 20 7d  N ? AND ?",..  }
2f50: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2f60: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
2f70: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
2f80: 20 20 61 73 73 65 72 74 28 20 53 69 7a 65 6f 66    assert( Sizeof
2f90: 41 72 72 61 79 28 61 7a 53 71 6c 29 3d 3d 53 69  Array(azSql)==Si
2fa0: 7a 65 6f 66 41 72 72 61 79 28 70 2d 3e 61 53 74  zeofArray(p->aSt
2fb0: 6d 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  mt) );.  assert(
2fc0: 20 65 53 74 6d 74 3c 53 69 7a 65 6f 66 41 72 72   eStmt<SizeofArr
2fd0: 61 79 28 61 7a 53 71 6c 29 20 26 26 20 65 53 74  ay(azSql) && eSt
2fe0: 6d 74 3e 3d 30 20 29 3b 0a 20 20 0a 20 20 70 53  mt>=0 );.  .  pS
2ff0: 74 6d 74 20 3d 20 70 2d 3e 61 53 74 6d 74 5b 65  tmt = p->aStmt[e
3000: 53 74 6d 74 5d 3b 0a 20 20 69 66 28 20 21 70 53  Stmt];.  if( !pS
3010: 74 6d 74 20 29 7b 0a 20 20 20 20 63 68 61 72 20  tmt ){.    char 
3020: 2a 7a 53 71 6c 3b 0a 20 20 20 20 69 66 28 20 65  *zSql;.    if( e
3030: 53 74 6d 74 3d 3d 53 51 4c 5f 43 4f 4e 54 45 4e  Stmt==SQL_CONTEN
3040: 54 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20 20  T_INSERT ){.    
3050: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
3060: 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65  _mprintf(azSql[e
3070: 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70  Stmt], p->zDb, p
3080: 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 7a 57 72 69  ->zName, p->zWri
3090: 74 65 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20  teExprlist);.   
30a0: 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 6d 74   }else if( eStmt
30b0: 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e  ==SQL_SELECT_CON
30c0: 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 20 29 7b  TENT_BY_ROWID ){
30d0: 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
30e0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a  lite3_mprintf(az
30f0: 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a  Sql[eStmt], p->z
3100: 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a 20  ReadExprlist);. 
3110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3120: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
3130: 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74  printf(azSql[eSt
3140: 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e  mt], p->zDb, p->
3150: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3160: 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20    if( !zSql ){. 
3170: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3180: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
3190: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
31a0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
31b0: 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
31c0: 2c 20 26 70 53 74 6d 74 2c 20 4e 55 4c 4c 29 3b  , &pStmt, NULL);
31d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
31e0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ree(zSql);.     
31f0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
3200: 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
3210: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  =0 );.      p->a
3220: 53 74 6d 74 5b 65 53 74 6d 74 5d 20 3d 20 70 53  Stmt[eStmt] = pS
3230: 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  tmt;.    }.  }. 
3240: 20 69 66 28 20 61 70 56 61 6c 20 29 7b 0a 20 20   if( apVal ){.  
3250: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
3260: 20 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69 74 65   nParam = sqlite
3270: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
3280: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
3290: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
32a0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
32b0: 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  Param; i++){.   
32c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
32d0: 62 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74  bind_value(pStmt
32e0: 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29  , i+1, apVal[i])
32f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
3300: 70 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74  p = pStmt;.  ret
3310: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
3320: 63 20 69 6e 74 20 66 74 73 33 53 65 6c 65 63 74  c int fts3Select
3330: 44 6f 63 73 69 7a 65 28 0a 20 20 46 74 73 33 54  Docsize(.  Fts3T
3340: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
3350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
3360: 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
3370: 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c 20  */.  int eStmt, 
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 53       /* Either S
33a0: 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a  QL_SELECT_DOCSIZ
33b0: 45 20 6f 72 20 44 4f 43 54 4f 54 41 4c 20 2a 2f  E or DOCTOTAL */
33c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
33d0: 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20   iDocid,        
33e0: 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20 62     /* Docid to b
33f0: 69 6e 64 20 66 6f 72 20 53 51 4c 5f 53 45 4c 45  ind for SQL_SELE
3400: 43 54 5f 44 4f 43 53 49 5a 45 20 2a 2f 0a 20 20  CT_DOCSIZE */.  
3410: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
3420: 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20  pStmt           
3430: 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e  /* OUT: Statemen
3440: 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20  t handle */.){. 
3450: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
3460: 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Stmt = 0;       
3470: 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 72 65   /* Statement re
3480: 71 75 65 73 74 65 64 20 66 72 6f 6d 20 66 74 73  quested from fts
3490: 33 53 71 6c 53 74 6d 74 28 29 20 2a 2f 0a 20 20  3SqlStmt() */.  
34a0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
34d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 65 53 74  /..  assert( eSt
34e0: 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 44  mt==SQL_SELECT_D
34f0: 4f 43 53 49 5a 45 20 7c 7c 20 65 53 74 6d 74 3d  OCSIZE || eStmt=
3500: 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 54  =SQL_SELECT_DOCT
3510: 4f 54 41 4c 20 29 3b 0a 0a 20 20 72 63 20 3d 20  OTAL );..  rc = 
3520: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 54 61 62  fts3SqlStmt(pTab
3530: 2c 20 65 53 74 6d 74 2c 20 26 70 53 74 6d 74 2c  , eStmt, &pStmt,
3540: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
3550: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3560: 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 53  if( eStmt==SQL_S
3570: 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 20 29 7b  ELECT_DOCSIZE ){
3580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
3590: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
35a0: 20 31 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20   1, iDocid);.   
35b0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
35c0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
35d0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
35e0: 49 54 45 5f 52 4f 57 20 7c 7c 20 73 71 6c 69 74  ITE_ROW || sqlit
35f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
3600: 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c 49 54 45  Stmt, 0)!=SQLITE
3610: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 72  _BLOB ){.      r
3620: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
3630: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
3640: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3650: 4b 20 29 20 72 63 20 3d 20 46 54 53 5f 43 4f 52  K ) rc = FTS_COR
3660: 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20  RUPT_VTAB;.     
3670: 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
3680: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
3690: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
36a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 74 6d   }.  }..  *ppStm
36b0: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74  t = pStmt;.  ret
36c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73  urn rc;.}..int s
36d0: 71 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63 74  qlite3Fts3Select
36e0: 44 6f 63 74 6f 74 61 6c 28 0a 20 20 46 74 73 33  Doctotal(.  Fts3
36f0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
3700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3710: 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ts3 table handle
3720: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
3730: 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20  mt **ppStmt     
3740: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74        /* OUT: St
3750: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a  atement handle *
3760: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  /.){.  return ft
3770: 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28  s3SelectDocsize(
3780: 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54  pTab, SQL_SELECT
3790: 5f 44 4f 43 54 4f 54 41 4c 2c 20 30 2c 20 70 70  _DOCTOTAL, 0, pp
37a0: 53 74 6d 74 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  Stmt);.}..int sq
37b0: 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63 74 44  lite3Fts3SelectD
37c0: 6f 63 73 69 7a 65 28 0a 20 20 46 74 73 33 54 61  ocsize(.  Fts3Ta
37d0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
37e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
37f0: 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
3800: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
3810: 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20  4 iDocid,       
3820: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20      /* Docid to 
3830: 72 65 61 64 20 73 69 7a 65 20 64 61 74 61 20 66  read size data f
3840: 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
3850: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20  stmt **ppStmt   
3860: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3870: 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  Statement handle
3880: 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
3890: 66 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a  fts3SelectDocsiz
38a0: 65 28 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45  e(pTab, SQL_SELE
38b0: 43 54 5f 44 4f 43 53 49 5a 45 2c 20 69 44 6f 63  CT_DOCSIZE, iDoc
38c0: 69 64 2c 20 70 70 53 74 6d 74 29 3b 0a 7d 0a 0a  id, ppStmt);.}..
38d0: 2f 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74 6f  /*.** Similar to
38e0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e 20   fts3SqlStmt(). 
38f0: 45 78 63 65 70 74 2c 20 61 66 74 65 72 20 62 69  Except, after bi
3900: 6e 64 69 6e 67 20 74 68 65 20 70 61 72 61 6d 65  nding the parame
3910: 74 65 72 73 20 69 6e 0a 2a 2a 20 61 72 72 61 79  ters in.** array
3920: 20 61 70 56 61 6c 5b 5d 20 74 6f 20 74 68 65 20   apVal[] to the 
3930: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 64  SQL statement id
3940: 65 6e 74 69 66 69 65 64 20 62 79 20 65 53 74 6d  entified by eStm
3950: 74 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  t, the statement
3960: 0a 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 2e  .** is executed.
3970: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53  .**.** Returns S
3980: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
3990: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75 63  statement is suc
39a0: 63 65 73 73 66 75 6c 6c 79 20 65 78 65 63 75 74  cessfully execut
39b0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 53 51 4c  ed, or an.** SQL
39c0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
39d0: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
39e0: 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 71 6c  tic void fts3Sql
39f0: 45 78 65 63 28 0a 20 20 69 6e 74 20 2a 70 52 43  Exec(.  int *pRC
3a00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3a10: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
3a20: 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  */.  Fts3Table *
3a30: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
3a40: 20 54 68 65 20 46 54 53 33 20 74 61 62 6c 65 20   The FTS3 table 
3a50: 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c 20  */.  int eStmt, 
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a70: 20 49 6e 64 65 78 20 6f 66 20 73 74 61 74 65 6d   Index of statem
3a80: 65 6e 74 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ent to evaluate 
3a90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
3aa0: 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 2f 2a  ue **apVal    /*
3ab0: 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20 62   Parameters to b
3ac0: 69 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ind */.){.  sqli
3ad0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
3ae0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
3af0: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
3b00: 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
3b10: 6d 74 28 70 2c 20 65 53 74 6d 74 2c 20 26 70 53  mt(p, eStmt, &pS
3b20: 74 6d 74 2c 20 61 70 56 61 6c 29 3b 20 0a 20 20  tmt, apVal); .  
3b30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3b40: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
3b50: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
3b60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
3b70: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d  eset(pStmt);.  }
3b80: 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 7d 0a  .  *pRC = rc;.}.
3b90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3ba0: 63 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74 68  ction ensures th
3bb0: 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
3bc0: 73 20 6f 62 74 61 69 6e 65 64 20 61 20 73 68 61  s obtained a sha
3bd0: 72 65 64 2d 63 61 63 68 65 0a 2a 2a 20 74 61 62  red-cache.** tab
3be0: 6c 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25  le-lock on the %
3bf0: 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20  _content table. 
3c00: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
3c10: 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 0a   before reading.
3c20: 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
3c30: 20 66 74 73 33 20 74 61 62 6c 65 2e 20 49 66 20   fts3 table. If 
3c40: 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  this lock is not
3c50: 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74 2c   acquired first,
3c60: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
3c70: 6c 65 72 20 6d 61 79 20 65 6e 64 20 75 70 20 68  ler may end up h
3c80: 6f 6c 64 69 6e 67 20 72 65 61 64 2d 6c 6f 63 6b  olding read-lock
3c90: 73 20 6f 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  s on the %_segme
3ca0: 6e 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72  nts and %_segdir
3cb0: 0a 2a 2a 20 74 61 62 6c 65 73 2c 20 62 75 74 20  .** tables, but 
3cc0: 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  no read-lock on 
3cd0: 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  the %_content ta
3ce0: 62 6c 65 2e 20 49 66 20 74 68 69 73 20 68 61 70  ble. If this hap
3cf0: 70 65 6e 73 20 0a 2a 2a 20 61 20 73 65 63 6f 6e  pens .** a secon
3d00: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  d connection wil
3d10: 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 77 72 69  l be able to wri
3d20: 74 65 20 74 6f 20 74 68 65 20 66 74 73 33 20 74  te to the fts3 t
3d30: 61 62 6c 65 2c 20 62 75 74 0a 2a 2a 20 61 74 74  able, but.** att
3d40: 65 6d 70 74 69 6e 67 20 74 6f 20 63 6f 6d 6d 69  empting to commi
3d50: 74 20 74 68 6f 73 65 20 77 72 69 74 65 73 20 6d  t those writes m
3d60: 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
3d70: 54 45 5f 4c 4f 43 4b 45 44 20 6f 72 0a 2a 2a 20  TE_LOCKED or.** 
3d80: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
3d90: 41 52 45 44 43 41 43 48 45 20 28 62 65 63 61 75  AREDCACHE (becau
3da0: 73 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 61 74  se the commit at
3db0: 74 65 6d 70 74 73 20 74 6f 20 6f 62 74 61 69 6e  tempts to obtain
3dc0: 20 0a 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 73   .** write-locks
3dd0: 20 6f 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e   on the %_segmen
3de0: 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72 20  ts and %_segdir 
3df0: 2a 2a 20 74 61 62 6c 65 73 29 2e 20 0a 2a 2a 0a  ** tables). .**.
3e00: 2a 2a 20 57 65 20 74 72 79 20 74 6f 20 61 76 6f  ** We try to avo
3e10: 69 64 20 74 68 69 73 20 62 65 63 61 75 73 65 20  id this because 
3e20: 69 66 20 46 54 53 33 20 72 65 74 75 72 6e 73 20  if FTS3 returns 
3e30: 61 6e 79 20 65 72 72 6f 72 20 77 68 65 6e 20 63  any error when c
3e40: 6f 6d 6d 69 74 74 69 6e 67 0a 2a 2a 20 61 20 74  ommitting.** a t
3e50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
3e60: 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
3e70: 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  n will be rolled
3e80: 20 62 61 63 6b 2e 20 41 6e 64 20 74 68 69 73 20   back. And this 
3e90: 69 73 0a 2a 2a 20 6e 6f 74 20 77 68 61 74 20 75  is.** not what u
3ea0: 73 65 72 73 20 65 78 70 65 63 74 20 77 68 65 6e  sers expect when
3eb0: 20 74 68 65 79 20 67 65 74 20 53 51 4c 49 54 45   they get SQLITE
3ec0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
3ed0: 43 48 45 2e 20 49 74 20 63 61 6e 0a 2a 2a 20 73  CHE. It can.** s
3ee0: 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 66 20 74  till happen if t
3ef0: 68 65 20 75 73 65 72 20 72 65 61 64 73 20 64 61  he user reads da
3f00: 74 61 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ta directly from
3f10: 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
3f20: 6f 72 0a 2a 2a 20 25 5f 73 65 67 64 69 72 20 74  or.** %_segdir t
3f30: 61 62 6c 65 73 20 69 6e 73 74 65 61 64 20 6f 66  ables instead of
3f40: 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 20 46   going through F
3f50: 54 53 33 20 74 68 6f 75 67 68 2e 0a 2a 2a 0a 2a  TS3 though..**.*
3f60: 2a 20 54 68 69 73 20 72 65 61 73 6f 6e 69 6e 67  * This reasoning
3f70: 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 20   does not apply 
3f80: 74 6f 20 61 20 63 6f 6e 74 65 6e 74 3d 78 78 78  to a content=xxx
3f90: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73   table..*/.int s
3fa0: 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 4c 6f  qlite3Fts3ReadLo
3fb0: 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29  ck(Fts3Table *p)
3fc0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
3ff0: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
4000: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
4010: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
4020: 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 6f 62 74  ment used to obt
4030: 61 69 6e 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 69  ain lock */..  i
4040: 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62  f( p->zContentTb
4050: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
4060: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
4070: 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45  SQL_SELECT_CONTE
4080: 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70 53  NT_BY_ROWID, &pS
4090: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
40a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
40b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
40c0: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
40d0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
40e0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
40f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4100: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
4110: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
4120: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4130: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OK;.  }..  retur
4140: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
4150: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 67 65  sqlite3_int64 ge
4160: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 0a  tAbsoluteLevel(.
4170: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
4180: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20  .  int iLangid, 
4190: 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a  .  int iIndex, .
41a0: 20 20 69 6e 74 20 69 4c 65 76 65 6c 0a 29 7b 0a    int iLevel.){.
41b0: 20 20 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69    assert( iLangi
41c0: 64 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d>=0 );.  assert
41d0: 28 20 70 2d 3e 6e 49 6e 64 65 78 3e 30 20 29 3b  ( p->nIndex>0 );
41e0: 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65  .  assert( iInde
41f0: 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70  x>=0 && iIndex<p
4200: 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 20 20 72 65  ->nIndex );.  re
4210: 74 75 72 6e 20 28 69 4c 61 6e 67 69 64 20 2a 20  turn (iLangid * 
4220: 70 2d 3e 6e 49 6e 64 65 78 20 2b 20 69 49 6e 64  p->nIndex + iInd
4230: 65 78 29 20 2a 20 46 54 53 33 5f 53 45 47 44 49  ex) * FTS3_SEGDI
4240: 52 5f 4d 41 58 4c 45 56 45 4c 20 2b 20 69 4c 65  R_MAXLEVEL + iLe
4250: 76 65 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  vel;.}.../*.** S
4260: 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 61 20  et *ppStmt to a 
4270: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
4280: 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65   that may be use
4290: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
42a0: 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 72 6f 77 73  ough.** all rows
42b0: 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   in the %_segdir
42c0: 20 74 61 62 6c 65 2c 20 66 72 6f 6d 20 6f 6c 64   table, from old
42d0: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 49  est to newest. I
42e0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
42f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4300: 4b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  K. If an error o
4310: 63 63 75 72 73 20 77 68 69 6c 65 20 70 72 65 70  ccurs while prep
4320: 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
4330: 65 6e 74 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ent, .** return 
4340: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
4350: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  code..**.** Ther
4360: 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f  e is only ever o
4370: 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
4380: 68 69 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  his SQL statemen
4390: 74 20 63 6f 6d 70 69 6c 65 64 20 66 6f 72 0a 2a  t compiled for.*
43a0: 2a 20 65 61 63 68 20 46 54 53 33 20 74 61 62 6c  * each FTS3 tabl
43b0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61  e..**.** The sta
43c0: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74  tement returns t
43d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6c  he following col
43e0: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 25 5f  umns from the %_
43f0: 73 65 67 64 69 72 20 74 61 62 6c 65 3a 0a 2a 2a  segdir table:.**
4400: 0a 2a 2a 20 20 20 30 3a 20 69 64 78 0a 2a 2a 20  .**   0: idx.** 
4410: 20 20 31 3a 20 73 74 61 72 74 5f 62 6c 6f 63 6b    1: start_block
4420: 0a 2a 2a 20 20 20 32 3a 20 6c 65 61 76 65 73 5f  .**   2: leaves_
4430: 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 33  end_block.**   3
4440: 3a 20 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20  : end_block.**  
4450: 20 34 3a 20 72 6f 6f 74 0a 2a 2f 0a 69 6e 74 20   4: root.*/.int 
4460: 73 71 6c 69 74 65 33 46 74 73 33 41 6c 6c 53 65  sqlite3Fts3AllSe
4470: 67 64 69 72 73 28 0a 20 20 46 74 73 33 54 61 62  gdirs(.  Fts3Tab
4480: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
4490: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
44a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
44b0: 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20  iLangid,        
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
44d0: 61 6e 67 75 61 67 65 20 62 65 69 6e 67 20 71 75  anguage being qu
44e0: 65 72 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  eried */.  int i
44f0: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
4500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4510: 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65  dex for p->aInde
4520: 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  x[] */.  int iLe
4530: 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
4540: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
4550: 6c 20 74 6f 20 73 65 6c 65 63 74 20 2a 2f 0a 20  l to select */. 
4560: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
4570: 70 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20  ppStmt          
4580: 20 2f 2a 20 4f 55 54 3a 20 43 6f 6d 70 69 6c 65   /* OUT: Compile
4590: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  d statement */.)
45a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
45b0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
45c0: 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  t = 0;..  assert
45d0: 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53  ( iLevel==FTS3_S
45e0: 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 7c 7c 20  EGCURSOR_ALL || 
45f0: 69 4c 65 76 65 6c 3e 3d 30 20 29 3b 0a 20 20 61  iLevel>=0 );.  a
4600: 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3c 46 54  ssert( iLevel<FT
4610: 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
4620: 45 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EL );.  assert( 
4630: 69 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e  iIndex>=0 && iIn
4640: 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b  dex<p->nIndex );
4650: 0a 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30  ..  if( iLevel<0
4660: 20 29 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45   ){.    /* "SELE
4670: 43 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64  CT * FROM %_segd
4680: 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42  ir WHERE level B
4690: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 4f  ETWEEN ? AND ? O
46a0: 52 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a  RDER BY ..." */.
46b0: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
46c0: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
46d0: 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 2c 20  CT_LEVEL_RANGE, 
46e0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
46f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4700: 4b 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69  K ){ .      sqli
4710: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
4720: 53 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f  Stmt, 1, getAbso
4730: 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61  luteLevel(p, iLa
4740: 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29  ngid, iIndex, 0)
4750: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4760: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
4770: 20 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20 67   2, .          g
4780: 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28  etAbsoluteLevel(
4790: 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
47a0: 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f  ex, FTS3_SEGDIR_
47b0: 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20 20  MAXLEVEL-1).    
47c0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c    );.    }.  }el
47d0: 73 65 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45  se{.    /* "SELE
47e0: 43 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64  CT * FROM %_segd
47f0: 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  ir WHERE level =
4800: 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 22   ? ORDER BY ..."
4810: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
4820: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
4830: 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26 70  SELECT_LEVEL, &p
4840: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
4850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4860: 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ){ .      sqlite
4870: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
4880: 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65  , 1, getAbsolute
4890: 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
48a0: 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c  , iIndex, iLevel
48b0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
48c0: 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b  *ppStmt = pStmt;
48d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
48e0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
48f0: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 74   single varint t
4900: 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  o a PendingList 
4910: 62 75 66 66 65 72 2e 20 53 51 4c 49 54 45 5f 4f  buffer. SQLITE_O
4920: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
4930: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
4940: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
4950: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
4960: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
4970: 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 73 65 72 76  nction also serv
4980: 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  es to allocate t
4990: 68 65 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73  he PendingList s
49a0: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
49b0: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
49c0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
49d0: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72   PendingList str
49e0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
49f0: 67 20 74 77 6f 0a 2a 2a 20 76 61 72 69 6e 74 73  g two.** varints
4a00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 65 6e 64 69 6e  :.**.**   Pendin
4a10: 67 4c 69 73 74 20 2a 70 20 3d 20 30 3b 0a 2a 2a  gList *p = 0;.**
4a20: 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69     fts3PendingLi
4a30: 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  stAppendVarint(&
4a40: 70 2c 20 31 29 3b 0a 2a 2a 20 20 20 66 74 73 33  p, 1);.**   fts3
4a50: 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
4a60: 64 56 61 72 69 6e 74 28 26 70 2c 20 32 29 3b 0a  dVarint(&p, 2);.
4a70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
4a80: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
4a90: 65 6e 64 56 61 72 69 6e 74 28 0a 20 20 50 65 6e  endVarint(.  Pen
4aa0: 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20  dingList **pp,  
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ac0: 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  IN/OUT: Pointer 
4ad0: 74 6f 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73  to PendingList s
4ae0: 74 72 75 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  truct */.  sqlit
4af0: 65 33 5f 69 6e 74 36 34 20 69 20 20 20 20 20 20  e3_int64 i      
4b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
4b10: 6c 75 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  lue to append to
4b20: 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 50 65   data */.){.  Pe
4b30: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 2a  ndingList *p = *
4b40: 70 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  pp;..  /* Alloca
4b50: 74 65 20 6f 72 20 67 72 6f 77 20 74 68 65 20 50  te or grow the P
4b60: 65 6e 64 69 6e 67 4c 69 73 74 20 61 73 20 72 65  endingList as re
4b70: 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
4b80: 20 21 70 20 29 7b 0a 20 20 20 20 70 20 3d 20 73   !p ){.    p = s
4b90: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
4ba0: 7a 65 6f 66 28 2a 70 29 20 2b 20 31 30 30 29 3b  zeof(*p) + 100);
4bb0: 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20  .    if( !p ){. 
4bc0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
4bd0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
4be0: 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20      p->nSpace = 
4bf0: 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  100;.    p->aDat
4c00: 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31  a = (char *)&p[1
4c10: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 44 61 74 61 20  ];.    p->nData 
4c20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  = 0;.  }.  else 
4c30: 69 66 28 20 70 2d 3e 6e 44 61 74 61 2b 46 54 53  if( p->nData+FTS
4c40: 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2b 31 3e 70  3_VARINT_MAX+1>p
4c50: 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20  ->nSpace ){.    
4c60: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 2d 3e 6e 53  int nNew = p->nS
4c70: 70 61 63 65 20 2a 20 32 3b 0a 20 20 20 20 70 20  pace * 2;.    p 
4c80: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
4c90: 63 28 70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  c(p, sizeof(*p) 
4ca0: 2b 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  + nNew);.    if(
4cb0: 20 21 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   !p ){.      sql
4cc0: 69 74 65 33 5f 66 72 65 65 28 2a 70 70 29 3b 0a  ite3_free(*pp);.
4cd0: 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20        *pp = 0;. 
4ce0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
4cf0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
4d00: 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20      p->nSpace = 
4d10: 6e 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 61 44 61  nNew;.    p->aDa
4d20: 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70 5b  ta = (char *)&p[
4d30: 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70  1];.  }..  /* Ap
4d40: 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 65 72  pend the new ser
4d50: 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 20 74  ialized varint t
4d60: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
4d70: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 6e   list. */.  p->n
4d80: 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46  Data += sqlite3F
4d90: 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 2d  ts3PutVarint(&p-
4da0: 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d  >aData[p->nData]
4db0: 2c 20 69 29 3b 0a 20 20 70 2d 3e 61 44 61 74 61  , i);.  p->aData
4dc0: 5b 70 2d 3e 6e 44 61 74 61 5d 20 3d 20 27 5c 30  [p->nData] = '\0
4dd0: 27 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20  ';.  *pp = p;.  
4de0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
4e00: 20 64 6f 63 69 64 2f 63 6f 6c 75 6d 6e 2f 70 6f   docid/column/po
4e10: 73 69 74 69 6f 6e 20 65 6e 74 72 79 20 74 6f 20  sition entry to 
4e20: 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74  a PendingList st
4e30: 72 75 63 74 75 72 65 2e 20 4e 6f 6e 2d 7a 65 72  ructure. Non-zer
4e40: 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  o.** is returned
4e50: 20 69 66 20 74 68 65 20 73 74 72 75 63 74 75 72   if the structur
4e60: 65 20 69 73 20 73 71 6c 69 74 65 33 5f 72 65 61  e is sqlite3_rea
4e70: 6c 6c 6f 63 65 64 20 61 73 20 70 61 72 74 20 6f  lloced as part o
4e80: 66 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20  f adding.** the 
4e90: 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
4ea0: 2c 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  , zero..**.** If
4eb0: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
4ec0: 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20 73 65  curs, *pRc is se
4ed0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
4ee0: 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  M before returni
4ef0: 6e 67 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 61  ng..** Zero is a
4f00: 6c 77 61 79 73 20 72 65 74 75 72 6e 65 64 20 69  lways returned i
4f10: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 4f 74 68  n this case. Oth
4f20: 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 4f 4f  erwise, if no OO
4f30: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  M error occurs,.
4f40: 2a 2a 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  ** it is set to 
4f50: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
4f60: 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e  atic int fts3Pen
4f70: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 0a  dingListAppend(.
4f80: 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a    PendingList **
4f90: 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pp,             
4fa0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 65 6e    /* IN/OUT: Pen
4fb0: 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75  dingList structu
4fc0: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
4fd0: 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20 20  int64 iDocid,   
4fe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64          /* Docid
4ff0: 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20 61 64   for entry to ad
5000: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
5010: 6e 74 36 34 20 69 43 6f 6c 2c 20 20 20 20 20 20  nt64 iCol,      
5020: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
5030: 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20 61 64   for entry to ad
5040: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
5050: 6e 74 36 34 20 69 50 6f 73 2c 20 20 20 20 20 20  nt64 iPos,      
5060: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
5070: 6f 6e 20 6f 66 20 74 65 72 6d 20 66 6f 72 20 65  on of term for e
5080: 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20  ntry to add */. 
5090: 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20   int *pRc       
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
50c0: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e  code */.){.  Pen
50d0: 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70  dingList *p = *p
50e0: 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
50f0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
5100: 72 74 28 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61  rt( !p || p->iLa
5110: 73 74 44 6f 63 69 64 3c 3d 69 44 6f 63 69 64 20  stDocid<=iDocid 
5120: 29 3b 0a 0a 20 20 69 66 28 20 21 70 20 7c 7c 20  );..  if( !p || 
5130: 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 21 3d 69  p->iLastDocid!=i
5140: 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 73 71 6c  Docid ){.    sql
5150: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74  ite3_int64 iDelt
5160: 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 28 70 20  a = iDocid - (p 
5170: 3f 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20  ? p->iLastDocid 
5180: 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  : 0);.    if( p 
5190: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
51a0: 20 70 2d 3e 6e 44 61 74 61 3c 70 2d 3e 6e 53 70   p->nData<p->nSp
51b0: 61 63 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ace );.      ass
51c0: 65 72 74 28 20 70 2d 3e 61 44 61 74 61 5b 70 2d  ert( p->aData[p-
51d0: 3e 6e 44 61 74 61 5d 3d 3d 30 20 29 3b 0a 20 20  >nData]==0 );.  
51e0: 20 20 20 20 70 2d 3e 6e 44 61 74 61 2b 2b 3b 0a      p->nData++;.
51f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
5200: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66  LITE_OK!=(rc = f
5210: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
5220: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 69  pendVarint(&p, i
5230: 44 65 6c 74 61 29 29 20 29 7b 0a 20 20 20 20 20  Delta)) ){.     
5240: 20 67 6f 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73   goto pendinglis
5250: 74 61 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20  tappend_out;.   
5260: 20 7d 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 43   }.    p->iLastC
5270: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e  ol = -1;.    p->
5280: 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20  iLastPos = 0;.  
5290: 20 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20    p->iLastDocid 
52a0: 3d 20 69 44 6f 63 69 64 3b 0a 20 20 7d 0a 20 20  = iDocid;.  }.  
52b0: 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20 70 2d  if( iCol>0 && p-
52c0: 3e 69 4c 61 73 74 43 6f 6c 21 3d 69 43 6f 6c 20  >iLastCol!=iCol 
52d0: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
52e0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33  E_OK!=(rc = fts3
52f0: 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
5300: 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29 29 0a  dVarint(&p, 1)).
5310: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
5320: 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e  K!=(rc = fts3Pen
5330: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
5340: 72 69 6e 74 28 26 70 2c 20 69 43 6f 6c 29 29 0a  rint(&p, iCol)).
5350: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
5360: 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 70 70  o pendinglistapp
5370: 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  end_out;.    }. 
5380: 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d     p->iLastCol =
5390: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 4c   iCol;.    p->iL
53a0: 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a  astPos = 0;.  }.
53b0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
53c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f  .    assert( iPo
53d0: 73 3e 70 2d 3e 69 4c 61 73 74 50 6f 73 20 7c 7c  s>p->iLastPos ||
53e0: 20 28 69 50 6f 73 3d 3d 30 20 26 26 20 70 2d 3e   (iPos==0 && p->
53f0: 69 4c 61 73 74 50 6f 73 3d 3d 30 29 20 29 3b 0a  iLastPos==0) );.
5400: 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e      rc = fts3Pen
5410: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
5420: 72 69 6e 74 28 26 70 2c 20 32 2b 69 50 6f 73 2d  rint(&p, 2+iPos-
5430: 70 2d 3e 69 4c 61 73 74 50 6f 73 29 3b 0a 20 20  p->iLastPos);.  
5440: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5450: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
5460: 69 4c 61 73 74 50 6f 73 20 3d 20 69 50 6f 73 3b  iLastPos = iPos;
5470: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 70 65 6e  .    }.  }.. pen
5480: 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f  dinglistappend_o
5490: 75 74 3a 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b  ut:.  *pRc = rc;
54a0: 0a 20 20 69 66 28 20 70 21 3d 2a 70 70 20 29 7b  .  if( p!=*pp ){
54b0: 0a 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20  .    *pp = p;.  
54c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
54d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
54e0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 50 65 6e 64  *.** Free a Pend
54f0: 69 6e 67 4c 69 73 74 20 6f 62 6a 65 63 74 20 61  ingList object a
5500: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 33  llocated by fts3
5510: 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
5520: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
5530: 6f 69 64 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  oid fts3PendingL
5540: 69 73 74 44 65 6c 65 74 65 28 50 65 6e 64 69 6e  istDelete(Pendin
5550: 67 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  gList *pList){. 
5560: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
5570: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ist);.}../*.** A
5580: 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 6f  dd an entry to o
5590: 6e 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ne of the pendin
55a0: 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61 62  g-terms hash tab
55b0: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
55c0: 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  nt fts3PendingTe
55d0: 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 46 74 73  rmsAddOne(.  Fts
55e0: 33 54 61 62 6c 65 20 2a 70 2c 0a 20 20 69 6e 74  3Table *p,.  int
55f0: 20 69 43 6f 6c 2c 0a 20 20 69 6e 74 20 69 50 6f   iCol,.  int iPo
5600: 73 2c 0a 20 20 46 74 73 33 48 61 73 68 20 2a 70  s,.  Fts3Hash *p
5610: 48 61 73 68 2c 20 20 20 20 20 20 20 20 20 20 20  Hash,           
5620: 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20       /* Pending 
5630: 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65  terms hash table
5640: 20 74 6f 20 61 64 64 20 65 6e 74 72 79 20 74 6f   to add entry to
5650: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
5660: 20 2a 7a 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20   *zToken,.  int 
5670: 6e 54 6f 6b 65 6e 0a 29 7b 0a 20 20 50 65 6e 64  nToken.){.  Pend
5680: 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  ingList *pList;.
5690: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
56a0: 45 5f 4f 4b 3b 0a 0a 20 20 70 4c 69 73 74 20 3d  E_OK;..  pList =
56b0: 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29   (PendingList *)
56c0: 66 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61  fts3HashFind(pHa
56d0: 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  sh, zToken, nTok
56e0: 65 6e 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  en);.  if( pList
56f0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64   ){.    p->nPend
5700: 69 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c 69 73  ingData -= (pLis
5710: 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65  t->nData + nToke
5720: 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 48  n + sizeof(Fts3H
5730: 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20  ashElem));.  }. 
5740: 20 69 66 28 20 66 74 73 33 50 65 6e 64 69 6e 67   if( fts3Pending
5750: 4c 69 73 74 41 70 70 65 6e 64 28 26 70 4c 69 73  ListAppend(&pLis
5760: 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64  t, p->iPrevDocid
5770: 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 72  , iCol, iPos, &r
5780: 63 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  c) ){.    if( pL
5790: 69 73 74 3d 3d 66 74 73 33 48 61 73 68 49 6e 73  ist==fts3HashIns
57a0: 65 72 74 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65  ert(pHash, zToke
57b0: 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69 73 74  n, nToken, pList
57c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61  ) ){.      /* Ma
57d0: 6c 6c 6f 63 20 66 61 69 6c 65 64 20 77 68 69 6c  lloc failed whil
57e0: 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 20  e inserting the 
57f0: 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 69 73 20  new entry. This 
5800: 63 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20  can only .      
5810: 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ** happen if the
5820: 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76 69 6f  re was no previo
5830: 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  us entry for thi
5840: 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20 20 2a  s token..      *
5850: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
5860: 30 3d 3d 66 74 73 33 48 61 73 68 46 69 6e 64 28  0==fts3HashFind(
5870: 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e  pHash, zToken, n
5880: 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 20 20  Token) );.      
5890: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69  sqlite3_free(pLi
58a0: 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  st);.      rc = 
58b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
58c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
58d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
58e0: 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
58f0: 74 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e 6e 44  ta += (pList->nD
5900: 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73  ata + nToken + s
5910: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
5920: 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  em));.  }.  retu
5930: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5940: 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e 75 6c  Tokenize the nul
5950: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
5960: 6e 67 20 7a 54 65 78 74 20 61 6e 64 20 61 64 64  ng zText and add
5970: 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f 20 74   all tokens to t
5980: 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65  he.** pending-te
5990: 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65 2e 20  rms hash-table. 
59a0: 54 68 65 20 64 6f 63 69 64 20 75 73 65 64 20 69  The docid used i
59b0: 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  s that currently
59c0: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 2d   stored in.** p-
59d0: 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 61 6e 64  >iPrevDocid, and
59e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 73   the column is s
59f0: 70 65 63 69 66 69 65 64 20 62 79 20 61 72 67 75  pecified by argu
5a00: 6d 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a  ment iCol..**.**
5a10: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
5a20: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5a30: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
5a40: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
5a50: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
5a60: 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e  c int fts3Pendin
5a70: 67 54 65 72 6d 73 41 64 64 28 0a 20 20 46 74 73  gTermsAdd(.  Fts
5a80: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5aa0: 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  Table into which
5ab0: 20 74 65 78 74 20 77 69 6c 6c 20 62 65 20 69 6e   text will be in
5ac0: 73 65 72 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  serted */.  cons
5ad0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 20  t char *zText,  
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5af0: 65 78 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20  ext of document 
5b00: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a  to be inserted *
5b10: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
5b40: 74 6f 20 77 68 69 63 68 20 74 65 78 74 20 69 73  to which text is
5b50: 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
5b60: 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 57 6f 72 64  */.  u32 *pnWord
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
5b90: 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e  ber of tokens in
5ba0: 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  serted */.){.  i
5bb0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 53 74  nt rc;.  int iSt
5bc0: 61 72 74 3b 0a 20 20 69 6e 74 20 69 45 6e 64 3b  art;.  int iEnd;
5bd0: 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a 20 20 69  .  int iPos;.  i
5be0: 6e 74 20 6e 57 6f 72 64 20 3d 20 30 3b 0a 0a 20  nt nWord = 0;.. 
5bf0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f   char const *zTo
5c00: 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65  ken;.  int nToke
5c10: 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f  n;..  sqlite3_to
5c20: 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69  kenizer *pTokeni
5c30: 7a 65 72 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69  zer = p->pTokeni
5c40: 7a 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74  zer;.  sqlite3_t
5c50: 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
5c60: 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d  const *pModule =
5c70: 20 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f   pTokenizer->pMo
5c80: 64 75 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dule;.  sqlite3_
5c90: 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72  tokenizer_cursor
5ca0: 20 2a 70 43 73 72 3b 0a 20 20 69 6e 74 20 28 2a   *pCsr;.  int (*
5cb0: 78 4e 65 78 74 29 28 73 71 6c 69 74 65 33 5f 74  xNext)(sqlite3_t
5cc0: 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20  okenizer_cursor 
5cd0: 2a 70 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20  *pCursor,.      
5ce0: 63 6f 6e 73 74 20 63 68 61 72 2a 2a 2c 69 6e 74  const char**,int
5cf0: 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a  *,int*,int*,int*
5d00: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  );..  assert( pT
5d10: 6f 6b 65 6e 69 7a 65 72 20 26 26 20 70 4d 6f 64  okenizer && pMod
5d20: 75 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ule );..  /* If 
5d30: 74 68 65 20 75 73 65 72 20 68 61 73 20 69 6e 73  the user has ins
5d40: 65 72 74 65 64 20 61 20 4e 55 4c 4c 20 76 61 6c  erted a NULL val
5d50: 75 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ue, this functio
5d60: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
5d70: 77 69 74 68 0a 20 20 2a 2a 20 7a 54 65 78 74 3d  with.  ** zText=
5d80: 3d 30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  =0. In this case
5d90: 2c 20 61 64 64 20 7a 65 72 6f 20 74 6f 6b 65 6e  , add zero token
5da0: 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
5db0: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 0a  hash table and .
5dc0: 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c    ** return earl
5dd0: 79 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 54 65 78  y. */.  if( zTex
5de0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 6e 57  t==0 ){.    *pnW
5df0: 6f 72 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ord = 0;.    ret
5e00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5e10: 20 7d 0a 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75   }..  rc = pModu
5e20: 6c 65 2d 3e 78 4f 70 65 6e 28 70 54 6f 6b 65 6e  le->xOpen(pToken
5e30: 69 7a 65 72 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  izer, zText, -1,
5e40: 20 26 70 43 73 72 29 3b 0a 20 20 69 66 28 20 72   &pCsr);.  if( r
5e50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
5e60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5e70: 20 7d 0a 20 20 70 43 73 72 2d 3e 70 54 6f 6b 65   }.  pCsr->pToke
5e80: 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69 7a  nizer = pTokeniz
5e90: 65 72 3b 0a 0a 20 20 78 4e 65 78 74 20 3d 20 70  er;..  xNext = p
5ea0: 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 3b 0a 20  Module->xNext;. 
5eb0: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f   while( SQLITE_O
5ec0: 4b 3d 3d 72 63 0a 20 20 20 20 20 20 26 26 20 53  K==rc.      && S
5ed0: 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
5ee0: 78 4e 65 78 74 28 70 43 73 72 2c 20 26 7a 54 6f  xNext(pCsr, &zTo
5ef0: 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69  ken, &nToken, &i
5f00: 53 74 61 72 74 2c 20 26 69 45 6e 64 2c 20 26 69  Start, &iEnd, &i
5f10: 50 6f 73 29 29 0a 20 20 29 7b 0a 20 20 20 20 69  Pos)).  ){.    i
5f20: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 69 50  nt i;.    if( iP
5f30: 6f 73 3e 3d 6e 57 6f 72 64 20 29 20 6e 57 6f 72  os>=nWord ) nWor
5f40: 64 20 3d 20 69 50 6f 73 2b 31 3b 0a 0a 20 20 20  d = iPos+1;..   
5f50: 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 73 20 63 61   /* Positions ca
5f60: 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 69 76 65  nnot be negative
5f70: 3b 20 77 65 20 75 73 65 20 2d 31 20 61 73 20 61  ; we use -1 as a
5f80: 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 6e 74 65   terminator inte
5f90: 72 6e 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 54  rnally..    ** T
5fa0: 6f 6b 65 6e 73 20 6d 75 73 74 20 68 61 76 65 20  okens must have 
5fb0: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 6c 65 6e 67 74  a non-zero lengt
5fc0: 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  h..    */.    if
5fd0: 28 20 69 50 6f 73 3c 30 20 7c 7c 20 21 7a 54 6f  ( iPos<0 || !zTo
5fe0: 6b 65 6e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 3d 30  ken || nToken<=0
5ff0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
6000: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
6010: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6020: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
6030: 74 65 72 6d 20 74 6f 20 74 68 65 20 74 65 72 6d  term to the term
6040: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 72  s index */.    r
6050: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
6060: 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20  ermsAddOne(.    
6070: 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f      p, iCol, iPo
6080: 73 2c 20 26 70 2d 3e 61 49 6e 64 65 78 5b 30 5d  s, &p->aIndex[0]
6090: 2e 68 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65  .hPending, zToke
60a0: 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 20 20 29 3b  n, nToken.    );
60b0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 64 64  .    .    /* Add
60c0: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 65 61 63   the term to eac
60d0: 68 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  h of the prefix 
60e0: 69 6e 64 65 78 65 73 20 74 68 61 74 20 69 74 20  indexes that it 
60f0: 69 73 20 6e 6f 74 20 74 6f 6f 20 0a 20 20 20 20  is not too .    
6100: 2a 2a 20 73 68 6f 72 74 20 66 6f 72 2e 20 2a 2f  ** short for. */
6110: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 72 63  .    for(i=1; rc
6120: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
6130: 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29  <p->nIndex; i++)
6140: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 46  {.      struct F
6150: 74 73 33 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  ts3Index *pIndex
6160: 20 3d 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d   = &p->aIndex[i]
6170: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b  ;.      if( nTok
6180: 65 6e 3c 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66  en<pIndex->nPref
6190: 69 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ix ) continue;. 
61a0: 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65       rc = fts3Pe
61b0: 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e 65  ndingTermsAddOne
61c0: 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20 69  (.          p, i
61d0: 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 49 6e 64  Col, iPos, &pInd
61e0: 65 78 2d 3e 68 50 65 6e 64 69 6e 67 2c 20 7a 54  ex->hPending, zT
61f0: 6f 6b 65 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 50  oken, pIndex->nP
6200: 72 65 66 69 78 0a 20 20 20 20 20 20 29 3b 0a 20  refix.      );. 
6210: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4d 6f 64     }.  }..  pMod
6220: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 43 73 72  ule->xClose(pCsr
6230: 29 3b 0a 20 20 2a 70 6e 57 6f 72 64 20 3d 20 6e  );.  *pnWord = n
6240: 57 6f 72 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  Word;.  return (
6250: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
6260: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
6270: 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c  );.}../* .** Cal
6280: 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
6290: 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  on indicates tha
62a0: 74 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  t subsequent cal
62b0: 6c 73 20 74 6f 20 0a 2a 2a 20 66 74 73 33 50 65  ls to .** fts3Pe
62c0: 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 29 20  ndingTermsAdd() 
62d0: 61 72 65 20 74 6f 20 61 64 64 20 74 65 72 6d 2f  are to add term/
62e0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 70 61  position-list pa
62f0: 69 72 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63  irs for the.** c
6300: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
6310: 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63  ocument with doc
6320: 69 64 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a 73 74  id iDocid..*/.st
6330: 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e  atic int fts3Pen
6340: 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 0a  dingTermsDocid(.
6350: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74    /* Full-text t
6380: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
6390: 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20   int iLangid,   
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20   /* Language id 
63c0: 6f 66 20 72 6f 77 20 62 65 69 6e 67 20 77 72 69  of row being wri
63d0: 74 74 65 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tten */.  sqlite
63e0: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 20 20  _int64 iDocid   
63f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
6400: 69 64 20 6f 66 20 72 6f 77 20 62 65 69 6e 67 20  id of row being 
6410: 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20  written */.){.  
6420: 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e  assert( iLangid>
6430: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f  =0 );..  /* TODO
6440: 28 73 68 65 73 73 29 20 45 78 70 6c 6f 72 65 20  (shess) Explore 
6450: 77 68 65 74 68 65 72 20 70 61 72 74 69 61 6c 6c  whether partiall
6460: 79 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20 62  y flushing the b
6470: 75 66 66 65 72 20 6f 6e 0a 20 20 2a 2a 20 66 6f  uffer on.  ** fo
6480: 72 63 65 64 2d 66 6c 75 73 68 20 77 6f 75 6c 64  rced-flush would
6490: 20 70 72 6f 76 69 64 65 20 62 65 74 74 65 72 20   provide better 
64a0: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 49 20  performance.  I 
64b0: 73 75 73 70 65 63 74 20 74 68 61 74 20 69 66 0a  suspect that if.
64c0: 20 20 2a 2a 20 77 65 20 6f 72 64 65 72 65 64 20    ** we ordered 
64d0: 74 68 65 20 64 6f 63 6c 69 73 74 73 20 62 79 20  the doclists by 
64e0: 73 69 7a 65 20 61 6e 64 20 66 6c 75 73 68 65 64  size and flushed
64f0: 20 74 68 65 20 6c 61 72 67 65 73 74 20 75 6e 74   the largest unt
6500: 69 6c 20 74 68 65 0a 20 20 2a 2a 20 62 75 66 66  il the.  ** buff
6510: 65 72 20 77 61 73 20 68 61 6c 66 20 65 6d 70 74  er was half empt
6520: 79 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6c 65  y, that would le
6530: 74 20 74 68 65 20 6c 65 73 73 20 66 72 65 71 75  t the less frequ
6540: 65 6e 74 20 74 65 72 6d 73 0a 20 20 2a 2a 20 67  ent terms.  ** g
6550: 65 6e 65 72 61 74 65 20 6c 6f 6e 67 65 72 20 64  enerate longer d
6560: 6f 63 6c 69 73 74 73 2e 0a 20 20 2a 2f 0a 20 20  oclists..  */.  
6570: 69 66 28 20 69 44 6f 63 69 64 3c 3d 70 2d 3e 69  if( iDocid<=p->i
6580: 50 72 65 76 44 6f 63 69 64 20 0a 20 20 20 7c 7c  PrevDocid .   ||
6590: 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 21   p->iPrevLangid!
65a0: 3d 69 4c 61 6e 67 69 64 0a 20 20 20 7c 7c 20 70  =iLangid.   || p
65b0: 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3e 70  ->nPendingData>p
65c0: 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74  ->nMaxPendingDat
65d0: 61 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  a .  ){.    int 
65e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
65f0: 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73  PendingTermsFlus
6600: 68 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  h(p);.    if( rc
6610: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6620: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
6630: 2d 3e 69 50 72 65 76 44 6f 63 69 64 20 3d 20 69  ->iPrevDocid = i
6640: 44 6f 63 69 64 3b 0a 20 20 70 2d 3e 69 50 72 65  Docid;.  p->iPre
6650: 76 4c 61 6e 67 69 64 20 3d 20 69 4c 61 6e 67 69  vLangid = iLangi
6660: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
6670: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6680: 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  Discard the cont
6690: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64  ents of the pend
66a0: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
66b0: 61 62 6c 65 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20  ables. .*/.void 
66c0: 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
66d0: 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 46 74 73  ngTermsClear(Fts
66e0: 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  3Table *p){.  in
66f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
6700: 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b  i<p->nIndex; i++
6710: 29 7b 0a 20 20 20 20 46 74 73 33 48 61 73 68 45  ){.    Fts3HashE
6720: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 20 20  lem *pElem;.    
6730: 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68 20  Fts3Hash *pHash 
6740: 3d 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e  = &p->aIndex[i].
6750: 68 50 65 6e 64 69 6e 67 3b 0a 20 20 20 20 66 6f  hPending;.    fo
6760: 72 28 70 45 6c 65 6d 3d 66 74 73 33 48 61 73 68  r(pElem=fts3Hash
6770: 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
6780: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33 48  lem; pElem=fts3H
6790: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
67a0: 0a 20 20 20 20 20 20 50 65 6e 64 69 6e 67 4c 69  .      PendingLi
67b0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e  st *pList = (Pen
67c0: 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33 48  dingList *)fts3H
67d0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
67e0: 20 20 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e        fts3Pendin
67f0: 67 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  gListDelete(pLis
6800: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  t);.    }.    ft
6810: 73 33 48 61 73 68 43 6c 65 61 72 28 70 48 61 73  s3HashClear(pHas
6820: 68 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50 65  h);.  }.  p->nPe
6830: 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 7d  ndingData = 0;.}
6840: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
6850: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
6860: 62 79 20 74 68 65 20 78 55 70 64 61 74 65 28 29  by the xUpdate()
6870: 20 6d 65 74 68 6f 64 20 61 73 20 70 61 72 74 20   method as part 
6880: 6f 66 20 61 6e 20 49 4e 53 45 52 54 0a 2a 2a 20  of an INSERT.** 
6890: 6f 70 65 72 61 74 69 6f 6e 2e 20 49 74 20 61 64  operation. It ad
68a0: 64 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65  ds entries for e
68b0: 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ach term in the 
68c0: 6e 65 77 20 72 65 63 6f 72 64 20 74 6f 20 74 68  new record to th
68d0: 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 54 65 72 6d  e.** pendingTerm
68e0: 73 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2a  s hash table..**
68f0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70 56  .** Argument apV
6900: 61 6c 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  al is the same a
6910: 73 20 74 68 65 20 73 69 6d 69 6c 61 72 6c 79 20  s the similarly 
6920: 6e 61 6d 65 64 20 61 72 67 75 6d 65 6e 74 20 70  named argument p
6930: 61 73 73 65 64 20 74 6f 0a 2a 2a 20 66 74 73 33  assed to.** fts3
6940: 49 6e 73 65 72 74 44 61 74 61 28 29 2e 20 50 61  InsertData(). Pa
6950: 72 61 6d 65 74 65 72 20 69 44 6f 63 69 64 20 69  rameter iDocid i
6960: 73 20 74 68 65 20 64 6f 63 69 64 20 6f 66 20 74  s the docid of t
6970: 68 65 20 6e 65 77 20 72 6f 77 2e 0a 2a 2f 0a 73  he new row..*/.s
6980: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
6990: 73 65 72 74 54 65 72 6d 73 28 46 74 73 33 54 61  sertTerms(Fts3Ta
69a0: 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ble *p, sqlite3_
69b0: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 75  value **apVal, u
69c0: 33 32 20 2a 61 53 7a 29 7b 0a 20 20 69 6e 74 20  32 *aSz){.  int 
69d0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
69f0: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
6a00: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69   */.  for(i=2; i
6a10: 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 3b 20 69  <p->nColumn+2; i
6a20: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
6a30: 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f  har *zText = (co
6a40: 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
6a50: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
6a60: 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 6e 74  Val[i]);.    int
6a70: 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
6a80: 67 54 65 72 6d 73 41 64 64 28 70 2c 20 7a 54 65  gTermsAdd(p, zTe
6a90: 78 74 2c 20 69 2d 32 2c 20 26 61 53 7a 5b 69 2d  xt, i-2, &aSz[i-
6aa0: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  2]);.    if( rc!
6ab0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6ac0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6ad0: 20 20 20 7d 0a 20 20 20 20 61 53 7a 5b 70 2d 3e     }.    aSz[p->
6ae0: 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69  nColumn] += sqli
6af0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6b00: 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apVal[i]);.  }. 
6b10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6b20: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
6b30: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6b40: 6c 65 64 20 62 79 20 74 68 65 20 78 55 70 64 61  led by the xUpda
6b50: 74 65 28 29 20 6d 65 74 68 6f 64 20 66 6f 72 20  te() method for 
6b60: 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  an INSERT operat
6b70: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 61 70 56 61  ion..** The apVa
6b80: 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  l parameter is p
6b90: 61 73 73 65 64 20 61 20 63 6f 70 79 20 6f 66 20  assed a copy of 
6ba0: 74 68 65 20 61 70 56 61 6c 20 61 72 67 75 6d 65  the apVal argume
6bb0: 6e 74 20 70 61 73 73 65 64 20 62 79 0a 2a 2a 20  nt passed by.** 
6bc0: 53 51 4c 69 74 65 20 74 6f 20 74 68 65 20 78 55  SQLite to the xU
6bd0: 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 20  pdate() method. 
6be0: 69 2e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56  i.e:.**.**   apV
6bf0: 61 6c 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20  al[0]           
6c00: 20 20 20 20 20 4e 6f 74 20 75 73 65 64 20 66 6f       Not used fo
6c10: 72 20 49 4e 53 45 52 54 2e 0a 2a 2a 20 20 20 61  r INSERT..**   a
6c20: 70 56 61 6c 5b 31 5d 20 20 20 20 20 20 20 20 20  pVal[1]         
6c30: 20 20 20 20 20 20 20 72 6f 77 69 64 0a 2a 2a 20         rowid.** 
6c40: 20 20 61 70 56 61 6c 5b 32 5d 20 20 20 20 20 20    apVal[2]      
6c50: 20 20 20 20 20 20 20 20 20 20 4c 65 66 74 2d 6d            Left-m
6c60: 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ost user-defined
6c70: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e   column.**   ...
6c80: 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e  .**   apVal[p->n
6c90: 43 6f 6c 75 6d 6e 2b 31 5d 20 20 20 20 20 52 69  Column+1]     Ri
6ca0: 67 68 74 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65  ght-most user-de
6cb0: 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  fined column.** 
6cc0: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
6cd0: 6d 6e 2b 32 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+2]     Hidden
6ce0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 73 61 6d   column with sam
6cf0: 65 20 6e 61 6d 65 20 61 73 20 74 61 62 6c 65 0a  e name as table.
6d00: 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43  **   apVal[p->nC
6d10: 6f 6c 75 6d 6e 2b 33 5d 20 20 20 20 20 48 69 64  olumn+3]     Hid
6d20: 64 65 6e 20 22 64 6f 63 69 64 22 20 63 6f 6c 75  den "docid" colu
6d30: 6d 6e 20 28 61 6c 69 61 73 20 66 6f 72 20 72 6f  mn (alias for ro
6d40: 77 69 64 29 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  wid).**   apVal[
6d50: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d 20 20 20  p->nColumn+4]   
6d60: 20 20 48 69 64 64 65 6e 20 6c 61 6e 67 75 61 67    Hidden languag
6d70: 65 69 64 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  eid column.*/.st
6d80: 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 73  atic int fts3Ins
6d90: 65 72 74 44 61 74 61 28 0a 20 20 46 74 73 33 54  ertData(.  Fts3T
6da0: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
6db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
6dc0: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 2a 2f  ll-text table */
6dd0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
6de0: 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20 20   **apVal,       
6df0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 76     /* Array of v
6e00: 61 6c 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20  alues to insert 
6e10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
6e20: 36 34 20 2a 70 69 44 6f 63 69 64 20 20 20 20 20  64 *piDocid     
6e30: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63       /* OUT: Doc
6e40: 69 64 20 66 6f 72 20 72 6f 77 20 6a 75 73 74 20  id for row just 
6e50: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20  inserted */.){. 
6e60: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
6e90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
6ea0: 74 20 2a 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72  t *pContentInser
6eb0: 74 3b 20 20 20 2f 2a 20 49 4e 53 45 52 54 20 49  t;   /* INSERT I
6ec0: 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41  NTO %_content VA
6ed0: 4c 55 45 53 28 2e 2e 2e 29 20 2a 2f 0a 0a 20 20  LUES(...) */..  
6ee0: 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  if( p->zContentT
6ef0: 62 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  bl ){.    sqlite
6f00: 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 20  3_value *pRowid 
6f10: 3d 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75  = apVal[p->nColu
6f20: 6d 6e 2b 33 5d 3b 0a 20 20 20 20 69 66 28 20 73  mn+3];.    if( s
6f30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
6f40: 65 28 70 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54  e(pRowid)==SQLIT
6f50: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  E_NULL ){.      
6f60: 70 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 31  pRowid = apVal[1
6f70: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
6f80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6f90: 79 70 65 28 70 52 6f 77 69 64 29 21 3d 53 51 4c  ype(pRowid)!=SQL
6fa0: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
6fb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6fc0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
6fd0: 20 20 20 7d 0a 20 20 20 20 2a 70 69 44 6f 63 69     }.    *piDoci
6fe0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
6ff0: 65 5f 69 6e 74 36 34 28 70 52 6f 77 69 64 29 3b  e_int64(pRowid);
7000: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7010: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
7020: 20 4c 6f 63 61 74 65 20 74 68 65 20 73 74 61 74   Locate the stat
7030: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 75 73 65  ement handle use
7040: 64 20 74 6f 20 69 6e 73 65 72 74 20 64 61 74 61  d to insert data
7050: 20 69 6e 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74   into the %_cont
7060: 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  ent.  ** table. 
7070: 54 68 65 20 53 51 4c 20 66 6f 72 20 74 68 69 73  The SQL for this
7080: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20   statement is:. 
7090: 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52   **.  **   INSER
70a0: 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74  T INTO %_content
70b0: 20 56 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c   VALUES(?, ?, ?,
70c0: 20 2e 2e 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ...).  **.  ** 
70d0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 66 65  The statement fe
70e0: 61 74 75 72 65 73 20 4e 20 27 3f 27 20 76 61 72  atures N '?' var
70f0: 69 61 62 6c 65 73 2c 20 77 68 65 72 65 20 4e 20  iables, where N 
7100: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
7110: 20 75 73 65 72 0a 20 20 2a 2a 20 64 65 66 69 6e   user.  ** defin
7120: 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
7130: 65 20 46 54 53 33 20 74 61 62 6c 65 2c 20 70 6c  e FTS3 table, pl
7140: 75 73 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 64  us one for the d
7150: 6f 63 69 64 20 66 69 65 6c 64 2e 0a 20 20 2a 2f  ocid field..  */
7160: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
7170: 74 6d 74 28 70 2c 20 53 51 4c 5f 43 4f 4e 54 45  tmt(p, SQL_CONTE
7180: 4e 54 5f 49 4e 53 45 52 54 2c 20 26 70 43 6f 6e  NT_INSERT, &pCon
7190: 74 65 6e 74 49 6e 73 65 72 74 2c 20 26 61 70 56  tentInsert, &apV
71a0: 61 6c 5b 31 5d 29 3b 0a 20 20 69 66 28 20 72 63  al[1]);.  if( rc
71b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
71c0: 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 7b  ->zLanguageid ){
71d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
71e0: 33 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 20 20  3_bind_int(.    
71f0: 20 20 20 20 70 43 6f 6e 74 65 6e 74 49 6e 73 65      pContentInse
7200: 72 74 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  rt, p->nColumn+2
7210: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
7220: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
7230: 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d  al[p->nColumn+4]
7240: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69  ).    );.  }.  i
7250: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7260: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7270: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 61 20 71   /* There is a q
7280: 75 69 72 6b 20 68 65 72 65 2e 20 54 68 65 20 75  uirk here. The u
7290: 73 65 72 73 20 49 4e 53 45 52 54 20 73 74 61 74  sers INSERT stat
72a0: 65 6d 65 6e 74 20 6d 61 79 20 68 61 76 65 20 73  ement may have s
72b0: 70 65 63 69 66 69 65 64 0a 20 20 2a 2a 20 61 20  pecified.  ** a 
72c0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 22 72  value for the "r
72d0: 6f 77 69 64 22 20 66 69 65 6c 64 2c 20 66 6f 72  owid" field, for
72e0: 20 74 68 65 20 22 64 6f 63 69 64 22 20 66 69 65   the "docid" fie
72f0: 6c 64 2c 20 6f 72 20 66 6f 72 20 62 6f 74 68 2e  ld, or for both.
7300: 0a 20 20 2a 2a 20 57 68 69 63 68 20 69 73 20 61  .  ** Which is a
7310: 20 70 72 6f 62 6c 65 6d 2c 20 73 69 6e 63 65 20   problem, since 
7320: 22 72 6f 77 69 64 22 20 61 6e 64 20 22 64 6f 63  "rowid" and "doc
7330: 69 64 22 20 61 72 65 20 61 6c 69 61 73 65 73 20  id" are aliases 
7340: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
7350: 65 20 76 61 6c 75 65 2e 20 46 6f 72 20 65 78 61  e value. For exa
7360: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
7370: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74    INSERT INTO ft
7380: 73 33 74 62 6c 28 72 6f 77 69 64 2c 20 64 6f 63  s3tbl(rowid, doc
7390: 69 64 29 20 56 41 4c 55 45 53 28 31 2c 20 32 29  id) VALUES(1, 2)
73a0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46  ;.  **.  ** In F
73b0: 54 53 33 2c 20 74 68 69 73 20 69 73 20 61 6e 20  TS3, this is an 
73c0: 65 72 72 6f 72 2e 20 49 74 20 69 73 20 61 6e 20  error. It is an 
73d0: 65 72 72 6f 72 20 74 6f 20 73 70 65 63 69 66 79  error to specify
73e0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73   non-NULL values
73f0: 0a 20 20 2a 2a 20 66 6f 72 20 62 6f 74 68 20 64  .  ** for both d
7400: 6f 63 69 64 20 61 6e 64 20 73 6f 6d 65 20 6f 74  ocid and some ot
7410: 68 65 72 20 72 6f 77 69 64 20 61 6c 69 61 73 2e  her rowid alias.
7420: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
7430: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
7440: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
7450: 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29  l[3+p->nColumn])
7460: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
7470: 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33  TE_NULL==sqlite3
7480: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
7490: 6c 5b 30 5d 29 0a 20 20 20 20 20 26 26 20 53 51  l[0]).     && SQ
74a0: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
74b0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
74c0: 56 61 6c 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20  Val[1]).    ){. 
74d0: 20 20 20 20 20 2f 2a 20 41 20 72 6f 77 69 64 2f       /* A rowid/
74e0: 64 6f 63 69 64 20 63 6f 6e 66 6c 69 63 74 2e 20  docid conflict. 
74f0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
7500: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7510: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
7520: 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
7530: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20  pContentInsert, 
7540: 31 2c 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43  1, apVal[3+p->nC
7550: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 20 20 69 66 28  olumn]);.    if(
7560: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7570: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7580: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
7590: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69  e statement to i
75a0: 6e 73 65 72 74 20 74 68 65 20 72 65 63 6f 72 64  nsert the record
75b0: 2e 20 53 65 74 20 2a 70 69 44 6f 63 69 64 20 74  . Set *piDocid t
75c0: 6f 20 74 68 65 20 0a 20 20 2a 2a 20 6e 65 77 20  o the .  ** new 
75d0: 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 0a 20 20  docid value. .  
75e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  */.  sqlite3_ste
75f0: 70 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74  p(pContentInsert
7600: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7610: 33 5f 72 65 73 65 74 28 70 43 6f 6e 74 65 6e 74  3_reset(pContent
7620: 49 6e 73 65 72 74 29 3b 0a 0a 20 20 2a 70 69 44  Insert);..  *piD
7630: 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  ocid = sqlite3_l
7640: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
7650: 28 70 2d 3e 64 62 29 3b 0a 20 20 72 65 74 75 72  (p->db);.  retur
7660: 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  n rc;.}..../*.**
7670: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
7680: 20 66 72 6f 6d 20 74 68 65 20 46 54 53 33 20 74   from the FTS3 t
7690: 61 62 6c 65 2e 20 43 6c 65 61 72 20 74 68 65 20  able. Clear the 
76a0: 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61  hash table conta
76b0: 69 6e 69 6e 67 0a 2a 2a 20 70 65 6e 64 69 6e 67  ining.** pending
76c0: 20 74 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69   terms..*/.stati
76d0: 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65  c int fts3Delete
76e0: 41 6c 6c 28 46 74 73 33 54 61 62 6c 65 20 2a 70  All(Fts3Table *p
76f0: 2c 20 69 6e 74 20 62 43 6f 6e 74 65 6e 74 29 7b  , int bContent){
7700: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7710: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
7720: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
7730: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 69 73 63 61  e */..  /* Disca
7740: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
7750: 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  of the pending-t
7760: 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e  erms hash table.
7770: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73   */.  sqlite3Fts
7780: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65  3PendingTermsCle
7790: 61 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  ar(p);..  /* Del
77a0: 65 74 65 20 65 76 65 72 79 74 68 69 6e 67 20 66  ete everything f
77b0: 72 6f 6d 20 74 68 65 20 73 68 61 64 6f 77 20 74  rom the shadow t
77c0: 61 62 6c 65 73 2e 20 45 78 63 65 70 74 2c 20 6c  ables. Except, l
77d0: 65 61 76 65 20 25 5f 63 6f 6e 74 65 6e 74 20 61  eave %_content a
77e0: 73 0a 20 20 2a 2a 20 69 73 20 69 66 20 62 43 6f  s.  ** is if bCo
77f0: 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 20  ntent is false. 
7800: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
7810: 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20  >zContentTbl==0 
7820: 7c 7c 20 62 43 6f 6e 74 65 6e 74 3d 3d 30 20 29  || bContent==0 )
7830: 3b 0a 20 20 69 66 28 20 62 43 6f 6e 74 65 6e 74  ;.  if( bContent
7840: 20 29 20 66 74 73 33 53 71 6c 45 78 65 63 28 26   ) fts3SqlExec(&
7850: 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54  rc, p, SQL_DELET
7860: 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 2c 20 30  E_ALL_CONTENT, 0
7870: 29 3b 0a 20 20 66 74 73 33 53 71 6c 45 78 65 63  );.  fts3SqlExec
7880: 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
7890: 45 54 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53  ETE_ALL_SEGMENTS
78a0: 2c 20 30 29 3b 0a 20 20 66 74 73 33 53 71 6c 45  , 0);.  fts3SqlE
78b0: 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
78c0: 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49  DELETE_ALL_SEGDI
78d0: 52 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  R, 0);.  if( p->
78e0: 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
78f0: 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26     fts3SqlExec(&
7900: 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54  rc, p, SQL_DELET
7910: 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 2c 20 30  E_ALL_DOCSIZE, 0
7920: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
7930: 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20  bHasStat ){.    
7940: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
7950: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
7960: 4c 4c 5f 53 54 41 54 2c 20 30 29 3b 0a 20 20 7d  LL_STAT, 0);.  }
7970: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7980: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
7990: 20 69 6e 74 20 6c 61 6e 67 69 64 46 72 6f 6d 53   int langidFromS
79a0: 65 6c 65 63 74 28 46 74 73 33 54 61 62 6c 65 20  elect(Fts3Table 
79b0: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
79c0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 6e   *pSelect){.  in
79d0: 74 20 69 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 20  t iLangid = 0;. 
79e0: 20 69 66 28 20 70 2d 3e 7a 4c 61 6e 67 75 61 67   if( p->zLanguag
79f0: 65 69 64 20 29 20 69 4c 61 6e 67 69 64 20 3d 20  eid ) iLangid = 
7a00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
7a10: 6e 74 28 70 53 65 6c 65 63 74 2c 20 70 2d 3e 6e  nt(pSelect, p->n
7a20: 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 72 65 74  Column+1);.  ret
7a30: 75 72 6e 20 69 4c 61 6e 67 69 64 3b 0a 7d 0a 0a  urn iLangid;.}..
7a40: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
7a50: 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61  element in the a
7a60: 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20  pVal[] array is 
7a70: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
7a80: 69 6e 20 74 68 65 20 64 6f 63 69 64 0a 2a 2a 20  in the docid.** 
7a90: 28 61 6e 20 69 6e 74 65 67 65 72 29 20 6f 66 20  (an integer) of 
7aa0: 61 20 72 6f 77 20 61 62 6f 75 74 20 74 6f 20 62  a row about to b
7ab0: 65 20 64 65 6c 65 74 65 64 2e 20 52 65 6d 6f 76  e deleted. Remov
7ac0: 65 20 61 6c 6c 20 74 65 72 6d 73 20 66 72 6f 6d  e all terms from
7ad0: 20 74 68 65 0a 2a 2a 20 66 75 6c 6c 2d 74 65 78   the.** full-tex
7ae0: 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  t index..*/.stat
7af0: 69 63 20 76 6f 69 64 20 66 74 73 33 44 65 6c 65  ic void fts3Dele
7b00: 74 65 54 65 72 6d 73 28 20 0a 20 20 69 6e 74 20  teTerms( .  int 
7b10: 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pRC,           
7b20: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
7b30: 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c  de */.  Fts3Tabl
7b40: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
7b50: 2f 2a 20 54 68 65 20 46 54 53 20 74 61 62 6c 65  /* The FTS table
7b60: 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20   to delete from 
7b70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
7b80: 75 65 20 2a 70 52 6f 77 69 64 2c 20 20 2f 2a 20  ue *pRowid,  /* 
7b90: 54 68 65 20 64 6f 63 69 64 20 74 6f 20 62 65 20  The docid to be 
7ba0: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 33 32  deleted */.  u32
7bb0: 20 2a 61 53 7a 20 20 20 20 20 20 20 20 20 20 20   *aSz           
7bc0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
7bd0: 20 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e   deleted documen
7be0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
7bf0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
7c00: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
7c10: 53 65 6c 65 63 74 3b 0a 0a 20 20 69 66 28 20 2a  Select;..  if( *
7c20: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
7c30: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
7c40: 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43  (p, SQL_SELECT_C
7c50: 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 2c  ONTENT_BY_ROWID,
7c60: 20 26 70 53 65 6c 65 63 74 2c 20 26 70 52 6f 77   &pSelect, &pRow
7c70: 69 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  id);.  if( rc==S
7c80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7c90: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
7ca0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
7cb0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 69  lect) ){.      i
7cc0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
7cd0: 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
7ce0: 73 44 6f 63 69 64 28 70 2c 20 0a 20 20 20 20 20  sDocid(p, .     
7cf0: 20 20 20 20 20 6c 61 6e 67 69 64 46 72 6f 6d 53       langidFromS
7d00: 65 6c 65 63 74 28 70 2c 20 70 53 65 6c 65 63 74  elect(p, pSelect
7d10: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  ), .          sq
7d20: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
7d30: 36 34 28 70 53 65 6c 65 63 74 2c 20 30 29 0a 20  64(pSelect, 0). 
7d40: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 6f       );.      fo
7d50: 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=1; rc==SQLIT
7d60: 45 5f 4f 4b 20 26 26 20 69 3c 3d 70 2d 3e 6e 43  E_OK && i<=p->nC
7d70: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
7d80: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
7d90: 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
7da0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
7db0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
7dc0: 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ct, i);.        
7dd0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
7de0: 54 65 72 6d 73 41 64 64 28 70 2c 20 7a 54 65 78  TermsAdd(p, zTex
7df0: 74 2c 20 2d 31 2c 20 26 61 53 7a 5b 69 2d 31 5d  t, -1, &aSz[i-1]
7e00: 29 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 5b 70  );.        aSz[p
7e10: 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71  ->nColumn] += sq
7e20: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
7e30: 65 73 28 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a  es(pSelect, i);.
7e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7e50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7e60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7e70: 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74  e3_reset(pSelect
7e80: 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 43 20  );.        *pRC 
7e90: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65  = rc;.        re
7ea0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
7eb0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
7ec0: 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
7ed0: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
7ee0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
7ef0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
7f00: 2a 70 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a  *pRC = rc;.}../*
7f10: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
7f20: 61 72 61 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75  aration to accou
7f30: 6e 74 20 66 6f 72 20 74 68 65 20 63 69 72 63 75  nt for the circu
7f40: 6c 61 72 20 64 65 70 65 6e 64 65 6e 63 79 20 62  lar dependency b
7f50: 65 74 77 65 65 6e 0a 2a 2a 20 66 75 6e 63 74 69  etween.** functi
7f60: 6f 6e 73 20 66 74 73 33 53 65 67 6d 65 6e 74 4d  ons fts3SegmentM
7f70: 65 72 67 65 28 29 20 61 6e 64 20 66 74 73 33 41  erge() and fts3A
7f80: 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
7f90: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
7fa0: 74 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72  t fts3SegmentMer
7fb0: 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 2c 20  ge(Fts3Table *, 
7fc0: 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a  int, int, int);.
7fd0: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
7fe0: 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
7ff0: 61 20 6e 65 77 20 6c 65 76 65 6c 20 69 4c 65 76  a new level iLev
8000: 65 6c 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  el index in the 
8010: 73 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a  segdir table..**
8020: 20 55 73 75 61 6c 6c 79 2c 20 69 6e 64 65 78 65   Usually, indexe
8030: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
8040: 77 69 74 68 69 6e 20 61 20 6c 65 76 65 6c 20 73  within a level s
8050: 65 71 75 65 6e 74 69 61 6c 6c 79 20 73 74 61 72  equentially star
8060: 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2c 20  ting.** with 0, 
8070: 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  so the allocated
8080: 20 69 6e 64 65 78 20 69 73 20 6f 6e 65 20 67 72   index is one gr
8090: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  eater than the v
80a0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a  alue returned.**
80b0: 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c   by:.**.**   SEL
80c0: 45 43 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f  ECT max(idx) FRO
80d0: 4d 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45  M %_segdir WHERE
80e0: 20 6c 65 76 65 6c 20 3d 20 3a 69 4c 65 76 65 6c   level = :iLevel
80f0: 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  .**.** However, 
8100: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  if there are alr
8110: 65 61 64 79 20 46 54 53 33 5f 4d 45 52 47 45 5f  eady FTS3_MERGE_
8120: 43 4f 55 4e 54 20 69 6e 64 65 78 65 73 20 61 74  COUNT indexes at
8130: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 2a   the requested.*
8140: 2a 20 6c 65 76 65 6c 2c 20 74 68 65 79 20 61 72  * level, they ar
8150: 65 20 6d 65 72 67 65 64 20 69 6e 74 6f 20 61 20  e merged into a 
8160: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 28 69 4c  single level (iL
8170: 65 76 65 6c 2b 31 29 20 73 65 67 6d 65 6e 74 20  evel+1) segment 
8180: 61 6e 64 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f  and the .** allo
8190: 63 61 74 65 64 20 69 6e 64 65 78 20 69 73 20 30  cated index is 0
81a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
81b0: 73 73 66 75 6c 2c 20 2a 70 69 49 64 78 20 69 73  ssful, *piIdx is
81c0: 20 73 65 74 20 74 6f 20 74 68 65 20 61 6c 6c 6f   set to the allo
81d0: 63 61 74 65 64 20 69 6e 64 65 78 20 73 6c 6f 74  cated index slot
81e0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
81f0: 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  * returned. Othe
8200: 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
8210: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
8220: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
8230: 69 63 20 69 6e 74 20 66 74 73 33 41 6c 6c 6f 63  ic int fts3Alloc
8240: 61 74 65 53 65 67 64 69 72 49 64 78 28 0a 20 20  ateSegdirIdx(.  
8250: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20  Fts3Table *p, . 
8260: 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20   int iLangid,   
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20   /* Language id 
8290: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  */.  int iIndex,
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
82c0: 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20  r p->aIndex */. 
82d0: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 0a 20 20   int iLevel, .  
82e0: 69 6e 74 20 2a 70 69 49 64 78 0a 29 7b 0a 20 20  int *piIdx.){.  
82f0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
8320: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
8330: 20 2a 70 4e 65 78 74 49 64 78 3b 20 20 20 20 20   *pNextIdx;     
8340: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72      /* Query for
8350: 20 6e 65 78 74 20 69 64 78 20 61 74 20 6c 65 76   next idx at lev
8360: 65 6c 20 69 4c 65 76 65 6c 20 2a 2f 0a 20 20 69  el iLevel */.  i
8370: 6e 74 20 69 4e 65 78 74 20 3d 20 30 3b 20 20 20  nt iNext = 0;   
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8390: 2a 20 52 65 73 75 6c 74 20 6f 66 20 71 75 65 72  * Result of quer
83a0: 79 20 70 4e 65 78 74 49 64 78 20 2a 2f 0a 0a 20  y pNextIdx */.. 
83b0: 20 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64   assert( iLangid
83c0: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
83d0: 20 70 2d 3e 6e 49 6e 64 65 78 3e 3d 31 20 29 3b   p->nIndex>=1 );
83e0: 0a 0a 20 20 2f 2a 20 53 65 74 20 76 61 72 69 61  ..  /* Set varia
83f0: 62 6c 65 20 69 4e 65 78 74 20 74 6f 20 74 68 65  ble iNext to the
8400: 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
8410: 73 65 67 64 69 72 20 69 6e 64 65 78 20 61 74 20  segdir index at 
8420: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 2a 2f  level iLevel. */
8430: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
8440: 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f  tmt(p, SQL_NEXT_
8450: 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26  SEGMENT_INDEX, &
8460: 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20  pNextIdx, 0);.  
8470: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8480: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
8490: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 20  _bind_int64(.   
84a0: 20 20 20 20 20 70 4e 65 78 74 49 64 78 2c 20 31       pNextIdx, 1
84b0: 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  , getAbsoluteLev
84c0: 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
84d0: 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 0a 20  Index, iLevel). 
84e0: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51     );.    if( SQ
84f0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
8500: 33 5f 73 74 65 70 28 70 4e 65 78 74 49 64 78 29  3_step(pNextIdx)
8510: 20 29 7b 0a 20 20 20 20 20 20 69 4e 65 78 74 20   ){.      iNext 
8520: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
8530: 5f 69 6e 74 28 70 4e 65 78 74 49 64 78 2c 20 30  _int(pNextIdx, 0
8540: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
8550: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
8560: 70 4e 65 78 74 49 64 78 29 3b 0a 20 20 7d 0a 0a  pNextIdx);.  }..
8570: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8580: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  _OK ){.    /* If
8590: 20 69 4e 65 78 74 20 69 73 20 46 54 53 33 5f 4d   iNext is FTS3_M
85a0: 45 52 47 45 5f 43 4f 55 4e 54 2c 20 69 6e 64 69  ERGE_COUNT, indi
85b0: 63 61 74 69 6e 67 20 74 68 61 74 20 6c 65 76 65  cating that leve
85c0: 6c 20 69 4c 65 76 65 6c 20 69 73 20 61 6c 72 65  l iLevel is alre
85d0: 61 64 79 0a 20 20 20 20 2a 2a 20 66 75 6c 6c 2c  ady.    ** full,
85e0: 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65   merge all segme
85f0: 6e 74 73 20 69 6e 20 6c 65 76 65 6c 20 69 4c 65  nts in level iLe
8600: 76 65 6c 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  vel into a singl
8610: 65 20 69 4c 65 76 65 6c 2b 31 0a 20 20 20 20 2a  e iLevel+1.    *
8620: 2a 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 61 6c  * segment and al
8630: 6c 6f 63 61 74 65 20 28 6e 65 77 6c 79 20 66 72  locate (newly fr
8640: 65 65 64 29 20 69 6e 64 65 78 20 30 20 61 74 20  eed) index 0 at 
8650: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 4f 74  level iLevel. Ot
8660: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20  herwise,.    ** 
8670: 69 66 20 69 4e 65 78 74 20 69 73 20 6c 65 73 73  if iNext is less
8680: 20 74 68 61 6e 20 46 54 53 33 5f 4d 45 52 47 45   than FTS3_MERGE
8690: 5f 43 4f 55 4e 54 2c 20 61 6c 6c 6f 63 61 74 65  _COUNT, allocate
86a0: 20 69 6e 64 65 78 20 69 4e 65 78 74 2e 0a 20 20   index iNext..  
86b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4e 65    */.    if( iNe
86c0: 78 74 3e 3d 46 54 53 33 5f 4d 45 52 47 45 5f 43  xt>=FTS3_MERGE_C
86d0: 4f 55 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63  OUNT ){.      rc
86e0: 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65   = fts3SegmentMe
86f0: 72 67 65 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  rge(p, iLangid, 
8700: 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 3b  iIndex, iLevel);
8710: 0a 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20  .      *piIdx = 
8720: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
8730: 20 20 20 20 2a 70 69 49 64 78 20 3d 20 69 4e 65      *piIdx = iNe
8740: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
8750: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8760: 2a 0a 2a 2a 20 54 68 65 20 25 5f 73 65 67 6d 65  *.** The %_segme
8770: 6e 74 73 20 74 61 62 6c 65 20 69 73 20 64 65 63  nts table is dec
8780: 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lared as follows
8790: 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
87a0: 20 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74   TABLE %_segment
87b0: 73 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45  s(blockid INTEGE
87c0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
87d0: 6c 6f 63 6b 20 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a  lock BLOB).**.**
87e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
87f0: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61  eads data from a
8800: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
8810: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
8820: 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 73 70 65 63  ble. The.** spec
8830: 69 66 69 63 20 72 6f 77 20 69 73 20 69 64 65 6e  ific row is iden
8840: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 69 42  tified by the iB
8850: 6c 6f 63 6b 69 64 20 70 61 72 61 6d 65 74 65 72  lockid parameter
8860: 2e 20 49 66 20 70 61 42 6c 6f 62 20 69 73 20 6e  . If paBlob is n
8870: 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  ot.** NULL, then
8880: 20 61 20 62 75 66 66 65 72 20 69 73 20 61 6c 6c   a buffer is all
8890: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
88a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
88b0: 64 20 70 6f 70 75 6c 61 74 65 64 0a 2a 2a 20 77  d populated.** w
88c0: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
88d0: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 73 74 6f   of the blob sto
88e0: 72 65 64 20 69 6e 20 74 68 65 20 22 62 6c 6f 63  red in the "bloc
88f0: 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  k" column of the
8900: 20 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20   .** identified 
8910: 74 61 62 6c 65 20 72 6f 77 20 69 73 2e 20 57 68  table row is. Wh
8920: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 42  ether or not paB
8930: 6c 6f 62 20 69 73 20 4e 55 4c 4c 2c 20 2a 70 6e  lob is NULL, *pn
8940: 42 6c 6f 62 20 69 73 20 73 65 74 0a 2a 2a 20 74  Blob is set.** t
8950: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
8960: 65 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20  e blob in bytes 
8970: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
8980: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
8990: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 74  ror occurs, or t
89a0: 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
89b0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 70  t contain the sp
89c0: 65 63 69 66 69 65 64 20 72 6f 77 2c 0a 2a 2a 20  ecified row,.** 
89d0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
89e0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
89f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
8a00: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
8a10: 65 64 2e 20 49 66 0a 2a 2a 20 70 61 42 6c 6f 62  ed. If.** paBlob
8a20: 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
8a30: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 73  en it is the res
8a40: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
8a50: 68 65 20 63 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20  he caller to.** 
8a60: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
8a70: 74 68 65 20 72 65 74 75 72 6e 65 64 20 62 75 66  the returned buf
8a80: 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  fer..**.** This 
8a90: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6c 65 61  function may lea
8aa0: 76 65 20 61 6e 20 6f 70 65 6e 20 73 71 6c 69 74  ve an open sqlit
8ab0: 65 33 5f 62 6c 6f 62 2a 20 68 61 6e 64 6c 65 20  e3_blob* handle 
8ac0: 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 33 54 61  in the.** Fts3Ta
8ad0: 62 6c 65 2e 70 53 65 67 6d 65 6e 74 73 20 76 61  ble.pSegments va
8ae0: 72 69 61 62 6c 65 2e 20 54 68 69 73 20 68 61 6e  riable. This han
8af0: 64 6c 65 20 69 73 20 72 65 75 73 65 64 20 62 79  dle is reused by
8b00: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
8b10: 73 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e  s.** to this fun
8b20: 63 74 69 6f 6e 2e 20 54 68 65 20 68 61 6e 64 6c  ction. The handl
8b30: 65 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 20  e may be closed 
8b40: 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a  by calling the.*
8b50: 2a 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  * sqlite3Fts3Seg
8b60: 6d 65 6e 74 73 43 6c 6f 73 65 28 29 20 66 75 6e  mentsClose() fun
8b70: 63 74 69 6f 6e 2e 20 52 65 75 73 69 6e 67 20 61  ction. Reusing a
8b80: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20   blob handle is 
8b90: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
8ba0: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
8bb0: 6e 74 2c 20 62 75 74 20 74 68 65 20 62 6c 6f 62  nt, but the blob
8bc0: 20 68 61 6e 64 6c 65 20 73 68 6f 75 6c 64 20 61   handle should a
8bd0: 6c 77 61 79 73 20 62 65 20 63 6c 6f 73 65 64 0a  lways be closed.
8be0: 2a 2a 20 62 65 66 6f 72 65 20 63 6f 6e 74 72 6f  ** before contro
8bf0: 6c 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  l is returned to
8c00: 20 74 68 65 20 75 73 65 72 20 28 74 6f 20 70 72   the user (to pr
8c10: 65 76 65 6e 74 20 61 20 6c 6f 63 6b 20 62 65 69  event a lock bei
8c20: 6e 67 20 68 65 6c 64 0a 2a 2a 20 6f 6e 20 74 68  ng held.** on th
8c30: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
8c40: 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  for longer than 
8c50: 6e 65 63 65 73 73 61 72 79 29 2e 20 54 68 75 73  necessary). Thus
8c60: 2c 20 61 6e 79 20 76 69 72 74 75 61 6c 20 74 61  , any virtual ta
8c70: 62 6c 65 0a 2a 2a 20 6d 65 74 68 6f 64 20 28 78  ble.** method (x
8c80: 46 69 6c 74 65 72 20 65 74 63 2e 29 20 74 68 61  Filter etc.) tha
8c90: 74 20 6d 61 79 20 64 69 72 65 63 74 6c 79 20 6f  t may directly o
8ca0: 72 20 69 6e 64 69 72 65 63 74 6c 79 20 63 61 6c  r indirectly cal
8cb0: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
8cc0: 2a 2a 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c  ** must call sql
8cd0: 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
8ce0: 43 6c 6f 73 65 28 29 20 62 65 66 6f 72 65 20 72  Close() before r
8cf0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
8d00: 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
8d10: 42 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54 61 62  Block(.  Fts3Tab
8d20: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
8d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
8d40: 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
8d50: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
8d60: 20 69 42 6c 6f 63 6b 69 64 2c 20 20 20 20 20 20   iBlockid,      
8d70: 20 20 20 2f 2a 20 41 63 63 65 73 73 20 74 68 65     /* Access the
8d80: 20 72 6f 77 20 77 69 74 68 20 62 6c 6f 63 6b 69   row with blocki
8d90: 64 3d 24 69 42 6c 6f 63 6b 69 64 20 2a 2f 0a 20  d=$iBlockid */. 
8da0: 20 63 68 61 72 20 2a 2a 70 61 42 6c 6f 62 2c 20   char **paBlob, 
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 62 20 64 61   /* OUT: Blob da
8dd0: 74 61 20 69 6e 20 6d 61 6c 6c 6f 63 27 64 20 62  ta in malloc'd b
8de0: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  uffer */.  int *
8df0: 70 6e 42 6c 6f 62 2c 20 20 20 20 20 20 20 20 20  pnBlob,         
8e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
8e10: 54 3a 20 53 69 7a 65 20 6f 66 20 62 6c 6f 62 20  T: Size of blob 
8e20: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  data */.  int *p
8e30: 6e 4c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  nLoad           
8e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8e50: 3a 20 42 79 74 65 73 20 61 63 74 75 61 6c 6c 79  : Bytes actually
8e60: 20 6c 6f 61 64 65 64 20 2a 2f 0a 29 7b 0a 20 20   loaded */.){.  
8e70: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
8ea0: 2f 0a 0a 20 20 2f 2a 20 70 6e 42 6c 6f 62 20 6d  /..  /* pnBlob m
8eb0: 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e  ust be non-NULL.
8ec0: 20 70 61 42 6c 6f 62 20 6d 61 79 20 62 65 20 4e   paBlob may be N
8ed0: 55 4c 4c 20 6f 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e  ULL or non-NULL.
8ee0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 6e   */.  assert( pn
8ef0: 42 6c 6f 62 29 3b 0a 0a 20 20 69 66 28 20 70 2d  Blob);..  if( p-
8f00: 3e 70 53 65 67 6d 65 6e 74 73 20 29 7b 0a 20 20  >pSegments ){.  
8f10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
8f20: 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 2d 3e 70 53  lob_reopen(p->pS
8f30: 65 67 6d 65 6e 74 73 2c 20 69 42 6c 6f 63 6b 69  egments, iBlocki
8f40: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
8f50: 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d   if( 0==p->zSegm
8f60: 65 6e 74 73 54 62 6c 20 29 7b 0a 20 20 20 20 20  entsTbl ){.     
8f70: 20 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c   p->zSegmentsTbl
8f80: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8f90: 74 66 28 22 25 73 5f 73 65 67 6d 65 6e 74 73 22  tf("%s_segments"
8fa0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
8fb0: 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65     if( 0==p->zSe
8fc0: 67 6d 65 6e 74 73 54 62 6c 20 29 20 72 65 74 75  gmentsTbl ) retu
8fd0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
8ff0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
9000: 6e 28 0a 20 20 20 20 20 20 20 70 2d 3e 64 62 2c  n(.       p->db,
9010: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 53 65 67   p->zDb, p->zSeg
9020: 6d 65 6e 74 73 54 62 6c 2c 20 22 62 6c 6f 63 6b  mentsTbl, "block
9030: 22 2c 20 69 42 6c 6f 63 6b 69 64 2c 20 30 2c 20  ", iBlockid, 0, 
9040: 26 70 2d 3e 70 53 65 67 6d 65 6e 74 73 0a 20 20  &p->pSegments.  
9050: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
9060: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9070: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
9080: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
9090: 74 65 73 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73  tes(p->pSegments
90a0: 29 3b 0a 20 20 20 20 2a 70 6e 42 6c 6f 62 20 3d  );.    *pnBlob =
90b0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28 20   nByte;.    if( 
90c0: 70 61 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  paBlob ){.      
90d0: 63 68 61 72 20 2a 61 42 79 74 65 20 3d 20 73 71  char *aByte = sq
90e0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
90f0: 74 65 20 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50  te + FTS3_NODE_P
9100: 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 20 20 69  ADDING);.      i
9110: 66 28 20 21 61 42 79 74 65 20 29 7b 0a 20 20 20  f( !aByte ){.   
9120: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9130: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
9140: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
9150: 20 70 6e 4c 6f 61 64 20 26 26 20 6e 42 79 74 65   pnLoad && nByte
9160: 3e 28 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  >(FTS3_NODE_CHUN
9170: 4b 5f 54 48 52 45 53 48 4f 4c 44 29 20 29 7b 0a  K_THRESHOLD) ){.
9180: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
9190: 3d 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  = FTS3_NODE_CHUN
91a0: 4b 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20  KSIZE;.         
91b0: 20 2a 70 6e 4c 6f 61 64 20 3d 20 6e 42 79 74 65   *pnLoad = nByte
91c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
91d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
91e0: 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 53  _blob_read(p->pS
91f0: 65 67 6d 65 6e 74 73 2c 20 61 42 79 74 65 2c 20  egments, aByte, 
9200: 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20  nByte, 0);.     
9210: 20 20 20 6d 65 6d 73 65 74 28 26 61 42 79 74 65     memset(&aByte
9220: 5b 6e 42 79 74 65 5d 2c 20 30 2c 20 46 54 53 33  [nByte], 0, FTS3
9230: 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a  _NODE_PADDING);.
9240: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
9250: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
9270: 72 65 65 28 61 42 79 74 65 29 3b 0a 20 20 20 20  ree(aByte);.    
9280: 20 20 20 20 20 20 61 42 79 74 65 20 3d 20 30 3b        aByte = 0;
9290: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
92a0: 20 7d 0a 20 20 20 20 20 20 2a 70 61 42 6c 6f 62   }.      *paBlob
92b0: 20 3d 20 61 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = aByte;.    }.
92c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
92d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
92e0: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
92f0: 20 61 74 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73   at p->pSegments
9300: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
9310: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
9320: 6f 76 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ove.** the sqlit
9330: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
9340: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  ) function for d
9350: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
9360: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
9370: 6e 74 73 43 6c 6f 73 65 28 46 74 73 33 54 61 62  ntsClose(Fts3Tab
9380: 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  le *p){.  sqlite
9390: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e  3_blob_close(p->
93a0: 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20 20 70 2d  pSegments);.  p-
93b0: 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a  >pSegments = 0;.
93c0: 7d 0a 20 20 20 20 0a 73 74 61 74 69 63 20 69 6e  }.    .static in
93d0: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  t fts3SegReaderI
93e0: 6e 63 72 52 65 61 64 28 46 74 73 33 53 65 67 52  ncrRead(Fts3SegR
93f0: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b  eader *pReader){
9400: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9430: 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
9440: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
9470: 65 20 2a 2f 0a 0a 20 20 6e 52 65 61 64 20 3d 20  e */..  nRead = 
9480: 4d 49 4e 28 70 52 65 61 64 65 72 2d 3e 6e 4e 6f  MIN(pReader->nNo
9490: 64 65 20 2d 20 70 52 65 61 64 65 72 2d 3e 6e 50  de - pReader->nP
94a0: 6f 70 75 6c 61 74 65 2c 20 46 54 53 33 5f 4e 4f  opulate, FTS3_NO
94b0: 44 45 5f 43 48 55 4e 4b 53 49 5a 45 29 3b 0a 20  DE_CHUNKSIZE);. 
94c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
94d0: 6f 62 5f 72 65 61 64 28 0a 20 20 20 20 20 20 70  ob_read(.      p
94e0: 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a  Reader->pBlob, .
94f0: 20 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e        &pReader->
9500: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
9510: 50 6f 70 75 6c 61 74 65 5d 2c 0a 20 20 20 20 20  Populate],.     
9520: 20 6e 52 65 61 64 2c 0a 20 20 20 20 20 20 70 52   nRead,.      pR
9530: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
9540: 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
9550: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9560: 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75    pReader->nPopu
9570: 6c 61 74 65 20 2b 3d 20 6e 52 65 61 64 3b 0a 20  late += nRead;. 
9580: 20 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64     memset(&pRead
9590: 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65  er->aNode[pReade
95a0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c 20 30  r->nPopulate], 0
95b0: 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  , FTS3_NODE_PADD
95c0: 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 52  ING);.    if( pR
95d0: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
95e0: 3d 3d 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  ==pReader->nNode
95f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9600: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65  3_blob_close(pRe
9610: 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  ader->pBlob);.  
9620: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c      pReader->pBl
9630: 6f 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 52  ob = 0;.      pR
9640: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
9650: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
9660: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9670: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
9680: 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28  egReaderRequire(
9690: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
96a0: 52 65 61 64 65 72 2c 20 63 68 61 72 20 2a 70 46  Reader, char *pF
96b0: 72 6f 6d 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  rom, int nByte){
96c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
96d0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
96e0: 20 21 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62   !pReader->pBlob
96f0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 46 72   .       || (pFr
9700: 6f 6d 3e 3d 70 52 65 61 64 65 72 2d 3e 61 4e 6f  om>=pReader->aNo
9710: 64 65 20 26 26 20 70 46 72 6f 6d 3c 26 70 52 65  de && pFrom<&pRe
9720: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
9730: 64 65 72 2d 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29  der->nNode]).  )
9740: 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 65 61 64  ;.  while( pRead
9750: 65 72 2d 3e 70 42 6c 6f 62 20 26 26 20 72 63 3d  er->pBlob && rc=
9760: 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
9770: 20 26 26 20 20 28 70 46 72 6f 6d 20 2d 20 70 52   &&  (pFrom - pR
9780: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e  eader->aNode + n
9790: 42 79 74 65 29 3e 70 52 65 61 64 65 72 2d 3e 6e  Byte)>pReader->n
97a0: 50 6f 70 75 6c 61 74 65 0a 20 20 29 7b 0a 20 20  Populate.  ){.  
97b0: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
97c0: 61 64 65 72 49 6e 63 72 52 65 61 64 28 70 52 65  aderIncrRead(pRe
97d0: 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ader);.  }.  ret
97e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
97f0: 20 53 65 74 20 61 6e 20 46 74 73 33 53 65 67 52   Set an Fts3SegR
9800: 65 61 64 65 72 20 63 75 72 73 6f 72 20 74 6f 20  eader cursor to 
9810: 70 6f 69 6e 74 20 61 74 20 45 4f 46 2e 0a 2a 2f  point at EOF..*/
9820: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9830: 33 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66  3SegReaderSetEof
9840: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
9850: 70 53 65 67 29 7b 0a 20 20 69 66 28 20 21 66 74  pSeg){.  if( !ft
9860: 73 33 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f  s3SegReaderIsRoo
9870: 74 4f 6e 6c 79 28 70 53 65 67 29 20 29 7b 0a 20  tOnly(pSeg) ){. 
9880: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9890: 70 53 65 67 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20  pSeg->aNode);.  
98a0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
98b0: 6c 6f 73 65 28 70 53 65 67 2d 3e 70 42 6c 6f 62  lose(pSeg->pBlob
98c0: 29 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 42 6c  );.    pSeg->pBl
98d0: 6f 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  ob = 0;.  }.  pS
98e0: 65 67 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d  eg->aNode = 0;.}
98f0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
9900: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
9910: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9920: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65  gument to the ne
9930: 78 74 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  xt term in the.*
9940: 2a 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 73 75  * segment. If su
9950: 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
9960: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
9970: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
9980: 6e 65 78 74 20 74 65 72 6d 2c 0a 2a 2a 20 53 51  next term,.** SQ
9990: 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 74 68 65 72  LITE_DONE. Other
99a0: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
99b0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
99c0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
99d0: 67 52 65 61 64 65 72 4e 65 78 74 28 0a 20 20 46  gReaderNext(.  F
99e0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20  ts3Table *p, .  
99f0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
9a00: 52 65 61 64 65 72 2c 0a 20 20 69 6e 74 20 62 49  Reader,.  int bI
9a10: 6e 63 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ncr.){.  int rc;
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9a40: 72 6e 20 63 6f 64 65 20 6f 66 20 76 61 72 69 6f  rn code of vario
9a50: 75 73 20 73 75 62 2d 72 6f 75 74 69 6e 65 73 20  us sub-routines 
9a60: 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4e 65 78 74  */.  char *pNext
9a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a80: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 76       /* Cursor v
9a90: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
9aa0: 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ac0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9ad0: 69 6e 20 74 65 72 6d 20 70 72 65 66 69 78 20 2a  in term prefix *
9ae0: 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b  /.  int nSuffix;
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9b10: 20 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20 73   bytes in term s
9b20: 75 66 66 69 78 20 2a 2f 0a 0a 20 20 69 66 28 20  uffix */..  if( 
9b30: 21 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69  !pReader->aDocli
9b40: 73 74 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  st ){.    pNext 
9b50: 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65  = pReader->aNode
9b60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9b70: 4e 65 78 74 20 3d 20 26 70 52 65 61 64 65 72 2d  Next = &pReader-
9b80: 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65  >aDoclist[pReade
9b90: 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20  r->nDoclist];.  
9ba0: 7d 0a 0a 20 20 69 66 28 20 21 70 4e 65 78 74 20  }..  if( !pNext 
9bb0: 7c 7c 20 70 4e 65 78 74 3e 3d 26 70 52 65 61 64  || pNext>=&pRead
9bc0: 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65  er->aNode[pReade
9bd0: 72 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20  r->nNode] ){..  
9be0: 20 20 69 66 28 20 66 74 73 33 53 65 67 52 65 61    if( fts3SegRea
9bf0: 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65  derIsPending(pRe
9c00: 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20 46  ader) ){.      F
9c10: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  ts3HashElem *pEl
9c20: 65 6d 20 3d 20 2a 28 70 52 65 61 64 65 72 2d 3e  em = *(pReader->
9c30: 70 70 4e 65 78 74 45 6c 65 6d 29 3b 0a 20 20 20  ppNextElem);.   
9c40: 20 20 20 69 66 28 20 70 45 6c 65 6d 3d 3d 30 20     if( pElem==0 
9c50: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  ){.        pRead
9c60: 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20  er->aNode = 0;. 
9c70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9c80: 20 20 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20      PendingList 
9c90: 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69 6e  *pList = (Pendin
9ca0: 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73 68  gList *)fts3Hash
9cb0: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
9cc0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54       pReader->zT
9cd0: 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 66 74  erm = (char *)ft
9ce0: 73 33 48 61 73 68 4b 65 79 28 70 45 6c 65 6d 29  s3HashKey(pElem)
9cf0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
9d00: 72 2d 3e 6e 54 65 72 6d 20 3d 20 66 74 73 33 48  r->nTerm = fts3H
9d10: 61 73 68 4b 65 79 73 69 7a 65 28 70 45 6c 65 6d  ashKeysize(pElem
9d20: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  );.        pRead
9d30: 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 70 52 65 61  er->nNode = pRea
9d40: 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20  der->nDoclist = 
9d50: 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 31  pList->nData + 1
9d60: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
9d70: 72 2d 3e 61 4e 6f 64 65 20 3d 20 70 52 65 61 64  r->aNode = pRead
9d80: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70  er->aDoclist = p
9d90: 4c 69 73 74 2d 3e 61 44 61 74 61 3b 0a 20 20 20  List->aData;.   
9da0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70       pReader->pp
9db0: 4e 65 78 74 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20  NextElem++;.    
9dc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61      assert( pRea
9dd0: 64 65 72 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20  der->aNode );.  
9de0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
9df0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9e00: 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 53 65 67    }..    fts3Seg
9e10: 52 65 61 64 65 72 53 65 74 45 6f 66 28 70 52 65  ReaderSetEof(pRe
9e20: 61 64 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ader);..    /* I
9e30: 66 20 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e  f iCurrentBlock>
9e40: 3d 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20  =iLeafEndBlock, 
9e50: 74 68 69 73 20 69 73 20 61 6e 20 45 4f 46 20 63  this is an EOF c
9e60: 6f 6e 64 69 74 69 6f 6e 2e 20 41 6c 6c 20 6c 65  ondition. All le
9e70: 61 66 20 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  af .    ** block
9e80: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9e90: 65 65 6e 20 74 72 61 76 65 72 73 65 64 2e 20 20  een traversed.  
9ea0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
9eb0: 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74  Reader->iCurrent
9ec0: 42 6c 6f 63 6b 3c 3d 70 52 65 61 64 65 72 2d 3e  Block<=pReader->
9ed0: 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 29 3b  iLeafEndBlock );
9ee0: 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65 72  .    if( pReader
9ef0: 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e  ->iCurrentBlock>
9f00: 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45  =pReader->iLeafE
9f10: 6e 64 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ndBlock ){.     
9f20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9f30: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  K;.    }..    rc
9f40: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65   = sqlite3Fts3Re
9f50: 61 64 42 6c 6f 63 6b 28 0a 20 20 20 20 20 20 20  adBlock(.       
9f60: 20 70 2c 20 2b 2b 70 52 65 61 64 65 72 2d 3e 69   p, ++pReader->i
9f70: 43 75 72 72 65 6e 74 42 6c 6f 63 6b 2c 20 26 70  CurrentBlock, &p
9f80: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 26  Reader->aNode, &
9f90: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 2c 20  pReader->nNode, 
9fa0: 0a 20 20 20 20 20 20 20 20 28 62 49 6e 63 72 20  .        (bIncr 
9fb0: 3f 20 26 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  ? &pReader->nPop
9fc0: 75 6c 61 74 65 20 3a 20 30 29 0a 20 20 20 20 29  ulate : 0).    )
9fd0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
9fe0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
9ff0: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
a000: 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d   pReader->pBlob=
a010: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 49  =0 );.    if( bI
a020: 6e 63 72 20 26 26 20 70 52 65 61 64 65 72 2d 3e  ncr && pReader->
a030: 6e 50 6f 70 75 6c 61 74 65 3c 70 52 65 61 64 65  nPopulate<pReade
a040: 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20  r->nNode ){.    
a050: 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62    pReader->pBlob
a060: 20 3d 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3b   = p->pSegments;
a070: 0a 20 20 20 20 20 20 70 2d 3e 70 53 65 67 6d 65  .      p->pSegme
a080: 6e 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nts = 0;.    }. 
a090: 20 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61 64     pNext = pRead
a0a0: 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 0a 0a  er->aNode;.  }..
a0b0: 20 20 61 73 73 65 72 74 28 20 21 66 74 73 33 53    assert( !fts3S
a0c0: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
a0d0: 67 28 70 52 65 61 64 65 72 29 20 29 3b 0a 0a 20  g(pReader) );.. 
a0e0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
a0f0: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
a100: 65 72 2c 20 70 4e 65 78 74 2c 20 46 54 53 33 5f  er, pNext, FTS3_
a110: 56 41 52 49 4e 54 5f 4d 41 58 2a 32 29 3b 0a 20  VARINT_MAX*2);. 
a120: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a130: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
a140: 20 20 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20    .  /* Because 
a150: 6f 66 20 74 68 65 20 46 54 53 33 5f 4e 4f 44 45  of the FTS3_NODE
a160: 5f 50 41 44 44 49 4e 47 20 62 79 74 65 73 20 6f  _PADDING bytes o
a170: 66 20 70 61 64 64 69 6e 67 2c 20 74 68 65 20 66  f padding, the f
a180: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 0a 20 20 2a  ollowing is .  *
a190: 2a 20 73 61 66 65 20 28 6e 6f 20 72 69 73 6b 20  * safe (no risk 
a1a0: 6f 66 20 6f 76 65 72 72 65 61 64 29 20 65 76 65  of overread) eve
a1b0: 6e 20 69 66 20 74 68 65 20 6e 6f 64 65 20 64 61  n if the node da
a1c0: 74 61 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  ta is corrupted.
a1d0: 20 2a 2f 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73   */.  pNext += s
a1e0: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
a1f0: 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 50  int32(pNext, &nP
a200: 72 65 66 69 78 29 3b 0a 20 20 70 4e 65 78 74 20  refix);.  pNext 
a210: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
a220: 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c  tVarint32(pNext,
a230: 20 26 6e 53 75 66 66 69 78 29 3b 0a 20 20 69 66   &nSuffix);.  if
a240: 28 20 6e 50 72 65 66 69 78 3c 30 20 7c 7c 20 6e  ( nPrefix<0 || n
a250: 53 75 66 66 69 78 3c 3d 30 20 0a 20 20 20 7c 7c  Suffix<=0 .   ||
a260: 20 26 70 4e 65 78 74 5b 6e 53 75 66 66 69 78 5d   &pNext[nSuffix]
a270: 3e 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65  >&pReader->aNode
a280: 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d  [pReader->nNode]
a290: 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
a2a0: 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  n FTS_CORRUPT_VT
a2b0: 41 42 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  AB;.  }..  if( n
a2c0: 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3e 70  Prefix+nSuffix>p
a2d0: 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c  Reader->nTermAll
a2e0: 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e  oc ){.    int nN
a2f0: 65 77 20 3d 20 28 6e 50 72 65 66 69 78 2b 6e 53  ew = (nPrefix+nS
a300: 75 66 66 69 78 29 2a 32 3b 0a 20 20 20 20 63 68  uffix)*2;.    ch
a310: 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ar *zNew = sqlit
a320: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 52 65 61 64  e3_realloc(pRead
a330: 65 72 2d 3e 7a 54 65 72 6d 2c 20 6e 4e 65 77 29  er->zTerm, nNew)
a340: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20  ;.    if( !zNew 
a350: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a360: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a370: 20 20 7d 0a 20 20 20 20 70 52 65 61 64 65 72 2d    }.    pReader-
a380: 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20  >zTerm = zNew;. 
a390: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 72     pReader->nTer
a3a0: 6d 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  mAlloc = nNew;. 
a3b0: 20 7d 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53   }..  rc = fts3S
a3c0: 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28  egReaderRequire(
a3d0: 70 52 65 61 64 65 72 2c 20 70 4e 65 78 74 2c 20  pReader, pNext, 
a3e0: 6e 53 75 66 66 69 78 2b 46 54 53 33 5f 56 41 52  nSuffix+FTS3_VAR
a3f0: 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 69 66 28 20  INT_MAX);.  if( 
a400: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a410: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 65  return rc;..  me
a420: 6d 63 70 79 28 26 70 52 65 61 64 65 72 2d 3e 7a  mcpy(&pReader->z
a430: 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 70  Term[nPrefix], p
a440: 4e 65 78 74 2c 20 6e 53 75 66 66 69 78 29 3b 0a  Next, nSuffix);.
a450: 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d    pReader->nTerm
a460: 20 3d 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66   = nPrefix+nSuff
a470: 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 6e  ix;.  pNext += n
a480: 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78 74 20  Suffix;.  pNext 
a490: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
a4a0: 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c  tVarint32(pNext,
a4b0: 20 26 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c   &pReader->nDocl
a4c0: 69 73 74 29 3b 0a 20 20 70 52 65 61 64 65 72 2d  ist);.  pReader-
a4d0: 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 4e 65 78  >aDoclist = pNex
a4e0: 74 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 70 4f  t;.  pReader->pO
a4f0: 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 0a  ffsetList = 0;..
a500: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
a510: 74 68 65 20 64 6f 63 6c 69 73 74 20 64 6f 65 73  the doclist does
a520: 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20 65   not appear to e
a530: 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65  xtend past the e
a540: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 62  nd of the.  ** b
a550: 2d 74 72 65 65 20 6e 6f 64 65 2e 20 41 6e 64 20  -tree node. And 
a560: 74 68 61 74 20 74 68 65 20 66 69 6e 61 6c 20 62  that the final b
a570: 79 74 65 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  yte of the docli
a580: 73 74 20 69 73 20 30 78 30 30 2e 20 49 66 20 65  st is 0x00. If e
a590: 69 74 68 65 72 20 0a 20 20 2a 2a 20 6f 66 20 74  ither .  ** of t
a5a0: 68 65 73 65 20 73 74 61 74 65 6d 65 6e 74 73 20  hese statements 
a5b0: 69 73 20 75 6e 74 72 75 65 2c 20 74 68 65 6e 20  is untrue, then 
a5c0: 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
a5d0: 72 65 20 69 73 20 63 6f 72 72 75 70 74 2e 0a 20  re is corrupt.. 
a5e0: 20 2a 2f 0a 20 20 69 66 28 20 26 70 52 65 61 64   */.  if( &pRead
a5f0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65  er->aDoclist[pRe
a600: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3e  ader->nDoclist]>
a610: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
a620: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20  pReader->nNode] 
a630: 0a 20 20 20 7c 7c 20 28 70 52 65 61 64 65 72 2d  .   || (pReader-
a640: 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d 30 20 26 26  >nPopulate==0 &&
a650: 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69   pReader->aDocli
a660: 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63  st[pReader->nDoc
a670: 6c 69 73 74 2d 31 5d 29 0a 20 20 29 7b 0a 20 20  list-1]).  ){.  
a680: 20 20 72 65 74 75 72 6e 20 46 54 53 5f 43 4f 52    return FTS_COR
a690: 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 7d 0a 20  RUPT_VTAB;.  }. 
a6a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a6b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
a6c0: 74 68 65 20 53 65 67 52 65 61 64 65 72 20 74 6f  the SegReader to
a6d0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
a6e0: 72 73 74 20 64 6f 63 69 64 20 69 6e 20 74 68 65  rst docid in the
a6f0: 20 64 6f 63 6c 69 73 74 20 61 73 73 6f 63 69 61   doclist associa
a700: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
a710: 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f  current term..*/
a720: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
a730: 53 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f  SegReaderFirstDo
a740: 63 69 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70  cid(Fts3Table *p
a750: 54 61 62 2c 20 46 74 73 33 53 65 67 52 65 61 64  Tab, Fts3SegRead
a760: 65 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20  er *pReader){.  
a770: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a780: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  OK;.  assert( pR
a790: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20  eader->aDoclist 
a7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 52  );.  assert( !pR
a7b0: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
a7c0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  st );.  if( pTab
a7d0: 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 66 74  ->bDescIdx && ft
a7e0: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
a7f0: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b  ding(pReader) ){
a800: 0a 20 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30  .    u8 bEof = 0
a810: 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69  ;.    pReader->i
a820: 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Docid = 0;.    p
a830: 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c  Reader->nOffsetL
a840: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ist = 0;.    sql
a850: 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50  ite3Fts3DoclistP
a860: 72 65 76 28 30 2c 0a 20 20 20 20 20 20 20 20 70  rev(0,.        p
a870: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
a880: 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c  , pReader->nDocl
a890: 69 73 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 70  ist, &pReader->p
a8a0: 4f 66 66 73 65 74 4c 69 73 74 2c 20 0a 20 20 20  OffsetList, .   
a8b0: 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e 69       &pReader->i
a8c0: 44 6f 63 69 64 2c 20 26 70 52 65 61 64 65 72 2d  Docid, &pReader-
a8d0: 3e 6e 4f 66 66 73 65 74 4c 69 73 74 2c 20 26 62  >nOffsetList, &b
a8e0: 45 6f 66 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  Eof.    );.  }el
a8f0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  se{.    rc = fts
a900: 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69 72  3SegReaderRequir
a910: 65 28 70 52 65 61 64 65 72 2c 20 70 52 65 61 64  e(pReader, pRead
a920: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 46 54  er->aDoclist, FT
a930: 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a  S3_VARINT_MAX);.
a940: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a950: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
a960: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 46 74  nt n = sqlite3Ft
a970: 73 33 47 65 74 56 61 72 69 6e 74 28 70 52 65 61  s3GetVarint(pRea
a980: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 26  der->aDoclist, &
a990: 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 29  pReader->iDocid)
a9a0: 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d  ;.      pReader-
a9b0: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 26  >pOffsetList = &
a9c0: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
a9d0: 74 5b 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t[n];.    }.  }.
a9e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a9f0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
aa00: 65 20 53 65 67 52 65 61 64 65 72 20 74 6f 20 70  e SegReader to p
aa10: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  oint to the next
aa20: 20 64 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f   docid in the do
aa30: 63 6c 69 73 74 0a 2a 2a 20 61 73 73 6f 63 69 61  clist.** associa
aa40: 74 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  ted with the cur
aa50: 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2a 20 0a 2a  rent term..** .*
aa60: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 73 20 70  * If arguments p
aa70: 70 4f 66 66 73 65 74 4c 69 73 74 20 61 6e 64 20  pOffsetList and 
aa80: 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 61 72 65  pnOffsetList are
aa90: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
aaa0: 0a 2a 2a 20 2a 70 70 4f 66 66 73 65 74 4c 69 73  .** *ppOffsetLis
aab0: 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  t is set to poin
aac0: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  t to the first c
aad0: 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 20 6c 69 73  olumn-offset lis
aae0: 74 0a 2a 2a 20 69 6e 20 74 68 65 20 64 6f 63 6c  t.** in the docl
aaf0: 69 73 74 20 65 6e 74 72 79 20 28 69 2e 65 2e 20  ist entry (i.e. 
ab00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 61 73 74  immediately past
ab10: 20 74 68 65 20 64 6f 63 69 64 20 76 61 72 69 6e   the docid varin
ab20: 74 29 2e 0a 2a 2a 20 2a 70 6e 4f 66 66 73 65 74  t)..** *pnOffset
ab30: 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20 74  List is set to t
ab40: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
ab50: 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6f   set of column-o
ab60: 66 66 73 65 74 0a 2a 2a 20 6c 69 73 74 73 2c 20  ffset.** lists, 
ab70: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  not including th
ab80: 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  e nul-terminator
ab90: 20 62 79 74 65 2e 20 46 6f 72 20 65 78 61 6d 70   byte. For examp
aba0: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le:.*/.static in
abb0: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  t fts3SegReaderN
abc0: 65 78 74 44 6f 63 69 64 28 0a 20 20 46 74 73 33  extDocid(.  Fts3
abd0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 0a 20 20 46  Table *pTab,.  F
abe0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
abf0: 65 61 64 65 72 2c 20 20 20 20 20 20 20 20 20 2f  eader,         /
ac00: 2a 20 52 65 61 64 65 72 20 74 6f 20 61 64 76 61  * Reader to adva
ac10: 6e 63 65 20 74 6f 20 6e 65 78 74 20 64 6f 63 69  nce to next doci
ac20: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  d */.  char **pp
ac30: 4f 66 66 73 65 74 4c 69 73 74 2c 20 20 20 20 20  OffsetList,     
ac40: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
ac50: 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
ac60: 74 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  t position-list 
ac70: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 66 66 73  */.  int *pnOffs
ac80: 65 74 4c 69 73 74 20 20 20 20 20 20 20 20 20 20  etList          
ac90: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4c 65 6e       /* OUT: Len
aca0: 67 74 68 20 6f 66 20 2a 70 70 4f 66 66 73 65 74  gth of *ppOffset
acb0: 4c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  List in bytes */
acc0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
acd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
ace0: 20 2a 70 20 3d 20 70 52 65 61 64 65 72 2d 3e 70   *p = pReader->p
acf0: 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 63 68  OffsetList;.  ch
ad00: 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20 61 73 73  ar c = 0;..  ass
ad10: 65 72 74 28 20 70 20 29 3b 0a 0a 20 20 69 66 28  ert( p );..  if(
ad20: 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20   pTab->bDescIdx 
ad30: 26 26 20 66 74 73 33 53 65 67 52 65 61 64 65 72  && fts3SegReader
ad40: 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65  IsPending(pReade
ad50: 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 70  r) ){.    /* A p
ad60: 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 73 65 67  ending-terms seg
ad70: 2d 72 65 61 64 65 72 20 66 6f 72 20 61 6e 20 46  -reader for an F
ad80: 54 53 34 20 74 61 62 6c 65 20 74 68 61 74 20 75  TS4 table that u
ad90: 73 65 73 20 6f 72 64 65 72 3d 64 65 73 63 2e 0a  ses order=desc..
ada0: 20 20 20 20 2a 2a 20 50 65 6e 64 69 6e 67 2d 74      ** Pending-t
adb0: 65 72 6d 73 20 64 6f 63 6c 69 73 74 73 20 61 72  erms doclists ar
adc0: 65 20 61 6c 77 61 79 73 20 62 75 69 6c 74 20 75  e always built u
add0: 70 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  p in ascending o
ade0: 72 64 65 72 2c 20 73 6f 0a 20 20 20 20 2a 2a 20  rder, so.    ** 
adf0: 77 65 20 68 61 76 65 20 74 6f 20 69 74 65 72 61  we have to itera
ae00: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 6d 20  te through them 
ae10: 62 61 63 6b 77 61 72 64 73 20 68 65 72 65 2e 20  backwards here. 
ae20: 2a 2f 0a 20 20 20 20 75 38 20 62 45 6f 66 20 3d  */.    u8 bEof =
ae30: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 70 4f 66   0;.    if( ppOf
ae40: 66 73 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20  fsetList ){.    
ae50: 20 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20    *ppOffsetList 
ae60: 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73  = pReader->pOffs
ae70: 65 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 2a 70  etList;.      *p
ae80: 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52  nOffsetList = pR
ae90: 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69  eader->nOffsetLi
aea0: 73 74 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  st - 1;.    }.  
aeb0: 20 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63    sqlite3Fts3Doc
aec0: 6c 69 73 74 50 72 65 76 28 30 2c 0a 20 20 20 20  listPrev(0,.    
aed0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f      pReader->aDo
aee0: 63 6c 69 73 74 2c 20 70 52 65 61 64 65 72 2d 3e  clist, pReader->
aef0: 6e 44 6f 63 6c 69 73 74 2c 20 26 70 2c 20 26 70  nDoclist, &p, &p
af00: 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 2c 0a  Reader->iDocid,.
af10: 20 20 20 20 20 20 20 20 26 70 52 65 61 64 65 72          &pReader
af20: 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 2c 20 26  ->nOffsetList, &
af30: 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  bEof.    );.    
af40: 69 66 28 20 62 45 6f 66 20 29 7b 0a 20 20 20 20  if( bEof ){.    
af50: 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73    pReader->pOffs
af60: 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  etList = 0;.    
af70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65  }else{.      pRe
af80: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
af90: 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = p;.    }.  }
afa0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
afb0: 70 45 6e 64 20 3d 20 26 70 52 65 61 64 65 72 2d  pEnd = &pReader-
afc0: 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65  >aDoclist[pReade
afd0: 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 0a 20  r->nDoclist];.. 
afe0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 70 20     /* Pointer p 
aff0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
b000: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79   at the first by
b010: 74 65 20 6f 66 20 61 6e 20 6f 66 66 73 65 74 20  te of an offset 
b020: 6c 69 73 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a  list. The.    **
b030: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
b040: 20 61 64 76 61 6e 63 65 73 20 69 74 20 74 6f 20   advances it to 
b050: 70 6f 69 6e 74 20 6f 6e 65 20 62 79 74 65 20 70  point one byte p
b060: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20  ast the end of. 
b070: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 6f     ** the same o
b080: 66 66 73 65 74 20 6c 69 73 74 2e 20 2a 2f 0a 20  ffset list. */. 
b090: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
b0a0: 20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66   .      /* The f
b0b0: 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65 20 6f 66  ollowing line of
b0c0: 20 63 6f 64 65 20 28 61 6e 64 20 74 68 65 20 22   code (and the "
b0d0: 70 2b 2b 22 20 62 65 6c 6f 77 20 74 68 65 20 77  p++" below the w
b0e0: 68 69 6c 65 28 29 20 6c 6f 6f 70 29 20 69 73 0a  hile() loop) is.
b0f0: 20 20 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c        ** normall
b100: 79 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  y all that is re
b110: 71 75 69 72 65 64 20 74 6f 20 6d 6f 76 65 20 70  quired to move p
b120: 6f 69 6e 74 65 72 20 70 20 74 6f 20 74 68 65 20  ointer p to the 
b130: 64 65 73 69 72 65 64 20 0a 20 20 20 20 20 20 2a  desired .      *
b140: 2a 20 70 6f 73 69 74 69 6f 6e 2e 20 54 68 65 20  * position. The 
b150: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20  exception is if 
b160: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 62 65 69  this node is bei
b170: 6e 67 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64  ng loaded from d
b180: 69 73 6b 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  isk.      ** inc
b190: 72 65 6d 65 6e 74 61 6c 6c 79 20 61 6e 64 20 70  rementally and p
b1a0: 6f 69 6e 74 65 72 20 22 70 22 20 6e 6f 77 20 70  ointer "p" now p
b1b0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
b1c0: 73 74 20 62 79 74 65 20 70 61 73 73 65 64 0a 20  st byte passed. 
b1d0: 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 70 75       ** the popu
b1e0: 6c 61 74 65 64 20 70 61 72 74 20 6f 66 20 70 52  lated part of pR
b1f0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 5d 2e 0a  eader->aNode[]..
b200: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77        */.      w
b210: 68 69 6c 65 28 20 2a 70 20 7c 20 63 20 29 20 63  hile( *p | c ) c
b220: 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a   = *p++ & 0x80;.
b230: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
b240: 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20 20  ==0 );.  .      
b250: 69 66 28 20 70 52 65 61 64 65 72 2d 3e 70 42 6c  if( pReader->pBl
b260: 6f 62 3d 3d 30 20 7c 7c 20 70 3c 26 70 52 65 61  ob==0 || p<&pRea
b270: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
b280: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 20 29  er->nPopulate] )
b290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 63   break;.      rc
b2a0: 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
b2b0: 49 6e 63 72 52 65 61 64 28 70 52 65 61 64 65 72  IncrRead(pReader
b2c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
b2d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
b2e0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
b2f0: 20 20 70 2b 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a    p++;.  .    /*
b300: 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
b310: 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75  pulate the outpu
b320: 74 20 76 61 72 69 61 62 6c 65 73 20 77 69 74 68  t variables with
b330: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
b340: 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 69 7a  d the.    ** siz
b350: 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  e of the previou
b360: 73 20 6f 66 66 73 65 74 2d 6c 69 73 74 2e 0a 20  s offset-list.. 
b370: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 70     */.    if( pp
b380: 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20 20  OffsetList ){.  
b390: 20 20 20 20 2a 70 70 4f 66 66 73 65 74 4c 69 73      *ppOffsetLis
b3a0: 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66  t = pReader->pOf
b3b0: 66 73 65 74 4c 69 73 74 3b 0a 20 20 20 20 20 20  fsetList;.      
b3c0: 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  *pnOffsetList = 
b3d0: 28 69 6e 74 29 28 70 20 2d 20 70 52 65 61 64 65  (int)(p - pReade
b3e0: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 2d  r->pOffsetList -
b3f0: 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   1);.    }..    
b400: 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26  while( p<pEnd &&
b410: 20 2a 70 3d 3d 30 20 29 20 70 2b 2b 3b 0a 20 20   *p==0 ) p++;.  
b420: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
b430: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 65 6e 74   are no more ent
b440: 72 69 65 73 20 69 6e 20 74 68 65 20 64 6f 63 6c  ries in the docl
b450: 69 73 74 2c 20 73 65 74 20 70 4f 66 66 73 65 74  ist, set pOffset
b460: 4c 69 73 74 20 74 6f 0a 20 20 20 20 2a 2a 20 4e  List to.    ** N
b470: 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ULL. Otherwise, 
b480: 73 65 74 20 46 74 73 33 53 65 67 52 65 61 64 65  set Fts3SegReade
b490: 72 2e 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20  r.iDocid to the 
b4a0: 6e 65 78 74 20 64 6f 63 69 64 20 61 6e 64 0a 20  next docid and. 
b4b0: 20 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61     ** Fts3SegRea
b4c0: 64 65 72 2e 70 4f 66 66 73 65 74 4c 69 73 74 20  der.pOffsetList 
b4d0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
b4e0: 6e 65 78 74 20 6f 66 66 73 65 74 20 6c 69 73 74  next offset list
b4f0: 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 72   before.    ** r
b500: 65 74 75 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f  eturning..    */
b510: 0a 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64  .    if( p>=pEnd
b520: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65   ){.      pReade
b530: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->pOffsetList =
b540: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
b550: 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
b560: 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70  gReaderRequire(p
b570: 52 65 61 64 65 72 2c 20 70 2c 20 46 54 53 33 5f  Reader, p, FTS3_
b580: 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20  VARINT_MAX);.   
b590: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b5a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b5b0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
b5c0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 70 52  elta;.        pR
b5d0: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
b5e0: 73 74 20 3d 20 70 20 2b 20 73 71 6c 69 74 65 33  st = p + sqlite3
b5f0: 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2c  Fts3GetVarint(p,
b600: 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20   &iDelta);.     
b610: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65     if( pTab->bDe
b620: 73 63 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  scIdx ){.       
b630: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63     pReader->iDoc
b640: 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id -= iDelta;.  
b650: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b660: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
b670: 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61  iDocid += iDelta
b680: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b690: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
b6a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b6b0: 4b 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74  K;.}...int sqlit
b6c0: 65 33 46 74 73 33 4d 73 72 4f 76 66 6c 28 0a 20  e3Fts3MsrOvfl(. 
b6d0: 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73   Fts3Cursor *pCs
b6e0: 72 2c 20 0a 20 20 46 74 73 33 4d 75 6c 74 69 53  r, .  Fts3MultiS
b6f0: 65 67 52 65 61 64 65 72 20 2a 70 4d 73 72 2c 0a  egReader *pMsr,.
b700: 20 20 69 6e 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b    int *pnOvfl.){
b710: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20  .  Fts3Table *p 
b720: 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70 43  = (Fts3Table*)pC
b730: 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
b740: 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 30 3b    int nOvfl = 0;
b750: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
b760: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b770: 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d  .  int pgsz = p-
b780: 3e 6e 50 67 73 7a 3b 0a 0a 20 20 61 73 73 65 72  >nPgsz;..  asser
b790: 74 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29  t( p->bHasStat )
b7a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 73 7a  ;.  assert( pgsz
b7b0: 3e 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 69 3d  >0 );..  for(ii=
b7c0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
b7d0: 20 26 26 20 69 69 3c 70 4d 73 72 2d 3e 6e 53 65   && ii<pMsr->nSe
b7e0: 67 6d 65 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  gment; ii++){.  
b7f0: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
b800: 2a 70 52 65 61 64 65 72 20 3d 20 70 4d 73 72 2d  *pReader = pMsr-
b810: 3e 61 70 53 65 67 6d 65 6e 74 5b 69 69 5d 3b 0a  >apSegment[ii];.
b820: 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65 67      if( !fts3Seg
b830: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
b840: 70 52 65 61 64 65 72 29 20 0a 20 20 20 20 20 26  pReader) .     &
b850: 26 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72  & !fts3SegReader
b860: 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52 65 61 64  IsRootOnly(pRead
b870: 65 72 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  er) .    ){.    
b880: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
b890: 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a  jj;.      for(jj
b8a0: 3d 70 52 65 61 64 65 72 2d 3e 69 53 74 61 72 74  =pReader->iStart
b8b0: 42 6c 6f 63 6b 3b 20 6a 6a 3c 3d 70 52 65 61 64  Block; jj<=pRead
b8c0: 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63  er->iLeafEndBloc
b8d0: 6b 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  k; jj++){.      
b8e0: 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20 20    int nBlob;.   
b8f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b900: 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70  3Fts3ReadBlock(p
b910: 2c 20 6a 6a 2c 20 30 2c 20 26 6e 42 6c 6f 62 2c  , jj, 0, &nBlob,
b920: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
b930: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b940: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b950: 69 66 28 20 28 6e 42 6c 6f 62 2b 33 35 29 3e 70  if( (nBlob+35)>p
b960: 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
b970: 20 6e 4f 76 66 6c 20 2b 3d 20 28 6e 42 6c 6f 62   nOvfl += (nBlob
b980: 20 2b 20 33 34 29 2f 70 67 73 7a 3b 0a 20 20 20   + 34)/pgsz;.   
b990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b9a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 4f 76     }.  }.  *pnOv
b9b0: 66 6c 20 3d 20 6e 4f 76 66 6c 3b 0a 20 20 72 65  fl = nOvfl;.  re
b9c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b9d0: 2a 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63  * Free all alloc
b9e0: 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ations associate
b9f0: 64 20 77 69 74 68 20 74 68 65 20 69 74 65 72 61  d with the itera
ba00: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
ba10: 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67  e .** second arg
ba20: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
ba30: 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
ba40: 64 65 72 46 72 65 65 28 46 74 73 33 53 65 67 52  derFree(Fts3SegR
ba50: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b  eader *pReader){
ba60: 0a 20 20 69 66 28 20 70 52 65 61 64 65 72 20 26  .  if( pReader &
ba70: 26 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72  & !fts3SegReader
ba80: 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65  IsPending(pReade
ba90: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
baa0: 33 5f 66 72 65 65 28 70 52 65 61 64 65 72 2d 3e  3_free(pReader->
bab0: 7a 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  zTerm);.    if( 
bac0: 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73  !fts3SegReaderIs
bad0: 52 6f 6f 74 4f 6e 6c 79 28 70 52 65 61 64 65 72  RootOnly(pReader
bae0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
baf0: 65 33 5f 66 72 65 65 28 70 52 65 61 64 65 72 2d  e3_free(pReader-
bb00: 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 73  >aNode);.      s
bb10: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
bb20: 65 28 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62  e(pReader->pBlob
bb30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
bb40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 61  qlite3_free(pRea
bb50: 64 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  der);.}../*.** A
bb60: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
bb70: 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 2e 0a  gReader object..
bb80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
bb90: 73 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 0a  s3SegReaderNew(.
bba0: 20 20 69 6e 74 20 69 41 67 65 2c 20 20 20 20 20    int iAge,     
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 22 61 67    /* Segment "ag
bbd0: 65 22 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 6f  e". */.  int bLo
bbe0: 6f 6b 75 70 2c 20 20 20 20 20 20 20 20 20 20 20  okup,           
bbf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
bc00: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e   for a lookup on
bc10: 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ly */.  sqlite3_
bc20: 69 6e 74 36 34 20 69 53 74 61 72 74 4c 65 61 66  int64 iStartLeaf
bc30: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
bc40: 20 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73   leaf to travers
bc50: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
bc60: 6e 74 36 34 20 69 45 6e 64 4c 65 61 66 2c 20 20  nt64 iEndLeaf,  
bc70: 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20         /* Final 
bc80: 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73 65  leaf to traverse
bc90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
bca0: 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20  t64 iEndBlock,  
bcb0: 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 62        /* Final b
bcc0: 6c 6f 63 6b 20 6f 66 20 73 65 67 6d 65 6e 74 20  lock of segment 
bcd0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
bce0: 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  *zRoot,         
bcf0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
bd00: 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e  ontaining root n
bd10: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ode */.  int nRo
bd20: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
bd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
bd40: 20 6f 66 20 62 75 66 66 65 72 20 63 6f 6e 74 61   of buffer conta
bd50: 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20  ining root node 
bd60: 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
bd70: 65 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20  er **ppReader   
bd80: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c       /* OUT: All
bd90: 6f 63 61 74 65 64 20 46 74 73 33 53 65 67 52 65  ocated Fts3SegRe
bda0: 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ader */.){.  Fts
bdb0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
bdc0: 64 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  der;         /* 
bdd0: 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
bde0: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
bdf0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
be00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
be10: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
be20: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65 67 6d 65  o allocate segme
be30: 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  nt root node */.
be40: 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
be50: 74 4c 65 61 66 3c 3d 69 45 6e 64 4c 65 61 66 20  tLeaf<=iEndLeaf 
be60: 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 4c  );.  if( iStartL
be70: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 45  eaf==0 ){.    nE
be80: 78 74 72 61 20 3d 20 6e 52 6f 6f 74 20 2b 20 46  xtra = nRoot + F
be90: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
bea0: 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 61 64 65 72  ;.  }..  pReader
beb0: 20 3d 20 28 46 74 73 33 53 65 67 52 65 61 64 65   = (Fts3SegReade
bec0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
bed0: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 53 65  oc(sizeof(Fts3Se
bee0: 67 52 65 61 64 65 72 29 20 2b 20 6e 45 78 74 72  gReader) + nExtr
bef0: 61 29 3b 0a 20 20 69 66 28 20 21 70 52 65 61 64  a);.  if( !pRead
bf00: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
bf10: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bf20: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 52 65 61   }.  memset(pRea
bf30: 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  der, 0, sizeof(F
bf40: 74 73 33 53 65 67 52 65 61 64 65 72 29 29 3b 0a  ts3SegReader));.
bf50: 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78 20    pReader->iIdx 
bf60: 3d 20 69 41 67 65 3b 0a 20 20 70 52 65 61 64 65  = iAge;.  pReade
bf70: 72 2d 3e 62 4c 6f 6f 6b 75 70 20 3d 20 62 4c 6f  r->bLookup = bLo
bf80: 6f 6b 75 70 3b 0a 20 20 70 52 65 61 64 65 72 2d  okup;.  pReader-
bf90: 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d 20 69  >iStartBlock = i
bfa0: 53 74 61 72 74 4c 65 61 66 3b 0a 20 20 70 52 65  StartLeaf;.  pRe
bfb0: 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c  ader->iLeafEndBl
bfc0: 6f 63 6b 20 3d 20 69 45 6e 64 4c 65 61 66 3b 0a  ock = iEndLeaf;.
bfd0: 20 20 70 52 65 61 64 65 72 2d 3e 69 45 6e 64 42    pReader->iEndB
bfe0: 6c 6f 63 6b 20 3d 20 69 45 6e 64 42 6c 6f 63 6b  lock = iEndBlock
bff0: 3b 0a 0a 20 20 69 66 28 20 6e 45 78 74 72 61 20  ;..  if( nExtra 
c000: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 6e  ){.    /* The en
c010: 74 69 72 65 20 73 65 67 6d 65 6e 74 20 69 73 20  tire segment is 
c020: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
c030: 6f 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  ot node. */.    
c040: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d  pReader->aNode =
c050: 20 28 63 68 61 72 20 2a 29 26 70 52 65 61 64 65   (char *)&pReade
c060: 72 5b 31 5d 3b 0a 20 20 20 20 70 52 65 61 64 65  r[1];.    pReade
c070: 72 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 52 6f 6f 74  r->nNode = nRoot
c080: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 52 65  ;.    memcpy(pRe
c090: 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 7a 52 6f  ader->aNode, zRo
c0a0: 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20  ot, nRoot);.    
c0b0: 6d 65 6d 73 65 74 28 26 70 52 65 61 64 65 72 2d  memset(&pReader-
c0c0: 3e 61 4e 6f 64 65 5b 6e 52 6f 6f 74 5d 2c 20 30  >aNode[nRoot], 0
c0d0: 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  , FTS3_NODE_PADD
c0e0: 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ING);.  }else{. 
c0f0: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72     pReader->iCur
c100: 72 65 6e 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61  rentBlock = iSta
c110: 72 74 4c 65 61 66 2d 31 3b 0a 20 20 7d 0a 20 20  rtLeaf-1;.  }.  
c120: 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52 65 61  *ppReader = pRea
c130: 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  der;.  return SQ
c140: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c150: 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70  * This is a comp
c160: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
c170: 75 73 65 64 20 61 73 20 61 20 71 73 6f 72 74 28  used as a qsort(
c180: 29 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20  ) callback when 
c190: 73 6f 72 74 69 6e 67 0a 2a 2a 20 61 6e 20 61 72  sorting.** an ar
c1a0: 72 61 79 20 6f 66 20 70 65 6e 64 69 6e 67 20 74  ray of pending t
c1b0: 65 72 6d 73 20 62 79 20 74 65 72 6d 2e 20 54 68  erms by term. Th
c1c0: 69 73 20 6f 63 63 75 72 73 20 61 73 20 70 61 72  is occurs as par
c1d0: 74 20 6f 66 20 66 6c 75 73 68 69 6e 67 0a 2a 2a  t of flushing.**
c1e0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
c1f0: 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
c200: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  ms hash table to
c210: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
c220: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
c230: 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42 79 54 65  3CompareElemByTe
c240: 72 6d 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 6c  rm(const void *l
c250: 68 73 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  hs, const void *
c260: 72 68 73 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31  rhs){.  char *z1
c270: 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 28 2a   = fts3HashKey(*
c280: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
c290: 29 6c 68 73 29 3b 0a 20 20 63 68 61 72 20 2a 7a  )lhs);.  char *z
c2a0: 32 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 28  2 = fts3HashKey(
c2b0: 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  *(Fts3HashElem *
c2c0: 2a 29 72 68 73 29 3b 0a 20 20 69 6e 74 20 6e 31  *)rhs);.  int n1
c2d0: 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73 69   = fts3HashKeysi
c2e0: 7a 65 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65  ze(*(Fts3HashEle
c2f0: 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 69 6e 74  m **)lhs);.  int
c300: 20 6e 32 20 3d 20 66 74 73 33 48 61 73 68 4b 65   n2 = fts3HashKe
c310: 79 73 69 7a 65 28 2a 28 46 74 73 33 48 61 73 68  ysize(*(Fts3Hash
c320: 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 0a 20  Elem **)rhs);.. 
c330: 20 69 6e 74 20 6e 20 3d 20 28 6e 31 3c 6e 32 20   int n = (n1<n2 
c340: 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69 6e  ? n1 : n2);.  in
c350: 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 7a 31 2c  t c = memcmp(z1,
c360: 20 7a 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 63   z2, n);.  if( c
c370: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e  ==0 ){.    c = n
c380: 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65  1 - n2;.  }.  re
c390: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
c3a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
c3b0: 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
c3c0: 74 65 20 61 6e 20 46 74 73 33 53 65 67 52 65 61  te an Fts3SegRea
c3d0: 64 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65  der that iterate
c3e0: 73 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 20 73  s through.** a s
c3f0: 75 62 73 65 74 20 6f 66 20 74 68 65 20 74 65 72  ubset of the ter
c400: 6d 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ms stored in the
c410: 20 46 74 73 33 54 61 62 6c 65 2e 70 65 6e 64 69   Fts3Table.pendi
c420: 6e 67 54 65 72 6d 73 20 61 72 72 61 79 2e 0a 2a  ngTerms array..*
c430: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 50 72  *.** If the isPr
c440: 65 66 69 78 49 74 65 72 20 70 61 72 61 6d 65 74  efixIter paramet
c450: 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  er is zero, then
c460: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 53 65   the returned Se
c470: 67 52 65 61 64 65 72 20 69 74 65 72 61 74 65 73  gReader iterates
c480: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 65 61 63 68  .** through each
c490: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 70 65 6e   term in the pen
c4a0: 64 69 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c 65  ding-terms table
c4b0: 2e 20 4f 72 2c 20 69 66 20 69 73 50 72 65 66 69  . Or, if isPrefi
c4c0: 78 49 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 6e 2d  xIter is.** non-
c4d0: 7a 65 72 6f 2c 20 69 74 20 69 74 65 72 61 74 65  zero, it iterate
c4e0: 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 74  s through each t
c4f0: 65 72 6d 20 61 6e 64 20 69 74 73 20 70 72 65 66  erm and its pref
c500: 69 78 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ixes. For exampl
c510: 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 70 65 6e  e, if.** the pen
c520: 64 69 6e 67 20 74 65 72 6d 73 20 68 61 73 68 20  ding terms hash 
c530: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  table contains t
c540: 68 65 20 74 65 72 6d 73 20 22 73 71 6c 69 74 65  he terms "sqlite
c550: 22 2c 20 22 6d 79 73 71 6c 22 20 61 6e 64 0a 2a  ", "mysql" and.*
c560: 2a 20 22 66 69 72 65 62 69 72 64 22 2c 20 74 68  * "firebird", th
c570: 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  en the iterator 
c580: 76 69 73 69 74 73 20 74 68 65 20 66 6f 6c 6c 6f  visits the follo
c590: 77 69 6e 67 20 27 74 65 72 6d 73 27 20 28 69 6e  wing 'terms' (in
c5a0: 20 74 68 65 20 6f 72 64 65 72 0a 2a 2a 20 73 68   the order.** sh
c5b0: 6f 77 6e 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 20  own):.**.**   f 
c5c0: 66 69 20 66 69 72 20 66 69 72 65 20 66 69 72 65  fi fir fire fire
c5d0: 62 20 66 69 72 65 62 69 20 66 69 72 65 62 69 72  b firebi firebir
c5e0: 20 66 69 72 65 62 69 72 64 0a 2a 2a 20 20 20 6d   firebird.**   m
c5f0: 20 6d 79 20 6d 79 73 20 6d 79 73 71 20 6d 79 73   my mys mysq mys
c600: 71 6c 0a 2a 2a 20 20 20 73 20 73 71 20 73 71 6c  ql.**   s sq sql
c610: 20 73 71 6c 69 20 73 71 6c 69 74 20 73 71 6c 69   sqli sqlit sqli
c620: 74 65 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 61 73  te.**.** Whereas
c630: 20 69 66 20 69 73 50 72 65 66 69 78 49 74 65 72   if isPrefixIter
c640: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 74 65   is zero, the te
c650: 72 6d 73 20 76 69 73 69 74 65 64 20 61 72 65 3a  rms visited are:
c660: 0a 2a 2a 0a 2a 2a 20 20 20 66 69 72 65 62 69 72  .**.**   firebir
c670: 64 20 6d 79 73 71 6c 20 73 71 6c 69 74 65 0a 2a  d mysql sqlite.*
c680: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
c690: 33 53 65 67 52 65 61 64 65 72 50 65 6e 64 69 6e  3SegReaderPendin
c6a0: 67 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  g(.  Fts3Table *
c6b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
c6c0: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
c6d0: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
c6e0: 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20    int iIndex,   
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 70    /* Index for p
c710: 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  ->aIndex */.  co
c720: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c740: 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   Term to search 
c750: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  for */.  int nTe
c760: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
c770: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c780: 20 6f 66 20 62 75 66 66 65 72 20 7a 54 65 72 6d   of buffer zTerm
c790: 20 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 66 69   */.  int bPrefi
c7a0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
c7b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
c7c0: 72 20 61 20 70 72 65 66 69 78 20 69 74 65 72 61  r a prefix itera
c7d0: 74 6f 72 20 2a 2f 0a 20 20 46 74 73 33 53 65 67  tor */.  Fts3Seg
c7e0: 52 65 61 64 65 72 20 2a 2a 70 70 52 65 61 64 65  Reader **ppReade
c7f0: 72 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  r        /* OUT:
c800: 20 53 65 67 52 65 61 64 65 72 20 66 6f 72 20 70   SegReader for p
c810: 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 2a 2f 0a  ending-terms */.
c820: 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  ){.  Fts3SegRead
c830: 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20 30 3b  er *pReader = 0;
c840: 20 20 20 20 20 2f 2a 20 46 74 73 33 53 65 67 52       /* Fts3SegR
c850: 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  eader object to 
c860: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73 33  return */.  Fts3
c870: 48 61 73 68 45 6c 65 6d 20 2a 70 45 3b 20 20 20  HashElem *pE;   
c880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c890: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
c8a0: 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45 6c   */.  Fts3HashEl
c8b0: 65 6d 20 2a 2a 61 45 6c 65 6d 20 3d 20 30 3b 20  em **aElem = 0; 
c8c0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
c8d0: 66 20 74 65 72 6d 20 68 61 73 68 20 65 6e 74 72  f term hash entr
c8e0: 69 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20  ies to scan */. 
c8f0: 20 69 6e 74 20 6e 45 6c 65 6d 20 3d 20 30 3b 20   int nElem = 0; 
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
c920: 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 20 20  y at aElem */.  
c930: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c940: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
c950: 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
c960: 2f 0a 20 20 46 74 73 33 48 61 73 68 20 2a 70 48  /.  Fts3Hash *pH
c970: 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20  ash;..  pHash = 
c980: 26 70 2d 3e 61 49 6e 64 65 78 5b 69 49 6e 64 65  &p->aIndex[iInde
c990: 78 5d 2e 68 50 65 6e 64 69 6e 67 3b 0a 20 20 69  x].hPending;.  i
c9a0: 66 28 20 62 50 72 65 66 69 78 20 29 7b 0a 20 20  f( bPrefix ){.  
c9b0: 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30    int nAlloc = 0
c9c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63  /* Size of alloc
c9e0: 61 74 65 64 20 61 72 72 61 79 20 61 74 20 61 45  ated array at aE
c9f0: 6c 65 6d 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  lem */..    for(
ca00: 70 45 3d 66 74 73 33 48 61 73 68 46 69 72 73 74  pE=fts3HashFirst
ca10: 28 70 48 61 73 68 29 3b 20 70 45 3b 20 70 45 3d  (pHash); pE; pE=
ca20: 66 74 73 33 48 61 73 68 4e 65 78 74 28 70 45 29  fts3HashNext(pE)
ca30: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
ca40: 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 66 74  Key = (char *)ft
ca50: 73 33 48 61 73 68 4b 65 79 28 70 45 29 3b 0a 20  s3HashKey(pE);. 
ca60: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
ca70: 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28  fts3HashKeysize(
ca80: 70 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  pE);.      if( n
ca90: 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 6e 4b 65 79  Term==0 || (nKey
caa0: 3e 3d 6e 54 65 72 6d 20 26 26 20 30 3d 3d 6d 65  >=nTerm && 0==me
cab0: 6d 63 6d 70 28 7a 4b 65 79 2c 20 7a 54 65 72 6d  mcmp(zKey, zTerm
cac0: 2c 20 6e 54 65 72 6d 29 29 20 29 7b 0a 20 20 20  , nTerm)) ){.   
cad0: 20 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3d 3d       if( nElem==
cae0: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
caf0: 20 20 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d      Fts3HashElem
cb00: 20 2a 2a 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20   **aElem2;.     
cb10: 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31       nAlloc += 1
cb20: 36 3b 0a 20 20 20 20 20 20 20 20 20 20 61 45 6c  6;.          aEl
cb30: 65 6d 32 20 3d 20 28 46 74 73 33 48 61 73 68 45  em2 = (Fts3HashE
cb40: 6c 65 6d 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  lem **)sqlite3_r
cb50: 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
cb60: 20 20 20 20 20 20 61 45 6c 65 6d 2c 20 6e 41 6c        aElem, nAl
cb70: 6c 6f 63 2a 73 69 7a 65 6f 66 28 46 74 73 33 48  loc*sizeof(Fts3H
cb80: 61 73 68 45 6c 65 6d 20 2a 29 0a 20 20 20 20 20  ashElem *).     
cb90: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
cba0: 20 20 69 66 28 20 21 61 45 6c 65 6d 32 20 29 7b    if( !aElem2 ){
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
cbc0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 6c 65              nEle
cbe0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  m = 0;.         
cbf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
cc00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
cc10: 61 45 6c 65 6d 20 3d 20 61 45 6c 65 6d 32 3b 0a  aElem = aElem2;.
cc20: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
cc30: 20 20 20 61 45 6c 65 6d 5b 6e 45 6c 65 6d 2b 2b     aElem[nElem++
cc40: 5d 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 7d 0a  ] = pE;.      }.
cc50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
cc60: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
cc70: 65 72 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  erm matches the 
cc80: 70 72 65 66 69 78 2c 20 73 6f 72 74 20 74 68 65  prefix, sort the
cc90: 20 46 74 73 33 48 61 73 68 45 6c 65 6d 0a 20 20   Fts3HashElem.  
cca0: 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20    ** objects in 
ccb0: 74 65 72 6d 20 6f 72 64 65 72 20 75 73 69 6e 67  term order using
ccc0: 20 71 73 6f 72 74 28 29 2e 20 54 68 69 73 20 75   qsort(). This u
ccd0: 73 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6d  ses the same com
cce0: 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2a 20 63  parison.    ** c
ccf0: 61 6c 6c 62 61 63 6b 20 61 73 20 69 73 20 75 73  allback as is us
cd00: 65 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67  ed when flushing
cd10: 20 74 65 72 6d 73 20 74 6f 20 64 69 73 6b 2e 0a   terms to disk..
cd20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
cd30: 45 6c 65 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Elem>1 ){.      
cd40: 71 73 6f 72 74 28 61 45 6c 65 6d 2c 20 6e 45 6c  qsort(aElem, nEl
cd50: 65 6d 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 48  em, sizeof(Fts3H
cd60: 61 73 68 45 6c 65 6d 20 2a 29 2c 20 66 74 73 33  ashElem *), fts3
cd70: 43 6f 6d 70 61 72 65 45 6c 65 6d 42 79 54 65 72  CompareElemByTer
cd80: 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  m);.    }..  }el
cd90: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 71  se{.    /* The q
cda0: 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65  uery is a simple
cdb0: 20 74 65 72 6d 20 6c 6f 6f 6b 75 70 20 74 68 61   term lookup tha
cdc0: 74 20 6d 61 74 63 68 65 73 20 61 74 20 6d 6f 73  t matches at mos
cdd0: 74 20 6f 6e 65 20 74 65 72 6d 20 69 6e 0a 20 20  t one term in.  
cde0: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 20    ** the index. 
cdf0: 41 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  All that is requ
ce00: 69 72 65 64 20 69 73 20 61 20 73 74 72 61 69 67  ired is a straig
ce10: 68 74 20 68 61 73 68 2d 6c 6f 6f 6b 75 70 2e 20  ht hash-lookup. 
ce20: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42  .    **.    ** B
ce30: 65 63 61 75 73 65 20 74 68 65 20 73 74 61 63 6b  ecause the stack
ce40: 20 61 64 64 72 65 73 73 20 6f 66 20 70 45 20 6d   address of pE m
ce50: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 76  ay be accessed v
ce60: 69 61 20 74 68 65 20 61 45 6c 65 6d 20 70 6f 69  ia the aElem poi
ce70: 6e 74 65 72 0a 20 20 20 20 2a 2a 20 62 65 6c 6f  nter.    ** belo
ce80: 77 2c 20 74 68 65 20 22 46 74 73 33 48 61 73 68  w, the "Fts3Hash
ce90: 45 6c 65 6d 20 2a 70 45 22 20 6d 75 73 74 20 62  Elem *pE" must b
cea0: 65 20 64 65 63 6c 61 72 65 64 20 73 6f 20 74 68  e declared so th
ceb0: 61 74 20 69 74 20 69 73 20 76 61 6c 69 64 0a 20  at it is valid. 
cec0: 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69     ** within thi
ced0: 73 20 65 6e 74 69 72 65 20 66 75 6e 63 74 69 6f  s entire functio
cee0: 6e 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 69 73  n, not just this
cef0: 20 22 65 6c 73 65 7b 2e 2e 2e 7d 22 20 62 6c 6f   "else{...}" blo
cf00: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
cf10: 45 20 3d 20 66 74 73 33 48 61 73 68 46 69 6e 64  E = fts3HashFind
cf20: 45 6c 65 6d 28 70 48 61 73 68 2c 20 7a 54 65 72  Elem(pHash, zTer
cf30: 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  m, nTerm);.    i
cf40: 66 28 20 70 45 20 29 7b 0a 20 20 20 20 20 20 61  f( pE ){.      a
cf50: 45 6c 65 6d 20 3d 20 26 70 45 3b 0a 20 20 20 20  Elem = &pE;.    
cf60: 20 20 6e 45 6c 65 6d 20 3d 20 31 3b 0a 20 20 20    nElem = 1;.   
cf70: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 45   }.  }..  if( nE
cf80: 6c 65 6d 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  lem>0 ){.    int
cf90: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
cfa0: 46 74 73 33 53 65 67 52 65 61 64 65 72 29 20 2b  Fts3SegReader) +
cfb0: 20 28 6e 45 6c 65 6d 2b 31 29 2a 73 69 7a 65 6f   (nElem+1)*sizeo
cfc0: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  f(Fts3HashElem *
cfd0: 29 3b 0a 20 20 20 20 70 52 65 61 64 65 72 20 3d  );.    pReader =
cfe0: 20 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20   (Fts3SegReader 
cff0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
d000: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
d010: 20 21 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20   !pReader ){.   
d020: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
d030: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
d040: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52  .      memset(pR
d050: 65 61 64 65 72 2c 20 30 2c 20 6e 42 79 74 65 29  eader, 0, nByte)
d060: 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d  ;.      pReader-
d070: 3e 69 49 64 78 20 3d 20 30 78 37 46 46 46 46 46  >iIdx = 0x7FFFFF
d080: 46 46 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65  FF;.      pReade
d090: 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 20 3d 20  r->ppNextElem = 
d0a0: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
d0b0: 29 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20 20  )&pReader[1];.  
d0c0: 20 20 20 20 6d 65 6d 63 70 79 28 70 52 65 61 64      memcpy(pRead
d0d0: 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 2c 20  er->ppNextElem, 
d0e0: 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2a 73 69 7a  aElem, nElem*siz
d0f0: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
d100: 20 2a 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   *));.    }.  }.
d110: 0a 20 20 69 66 28 20 62 50 72 65 66 69 78 20 29  .  if( bPrefix )
d120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
d130: 65 65 28 61 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20  ee(aElem);.  }. 
d140: 20 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52 65   *ppReader = pRe
d150: 61 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 72  ader;.  return r
d160: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  c;.}../*.** Comp
d170: 61 72 65 20 74 68 65 20 65 6e 74 72 69 65 73 20  are the entries 
d180: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 77  pointed to by tw
d190: 6f 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  o Fts3SegReader 
d1a0: 73 74 72 75 63 74 75 72 65 73 2e 20 0a 2a 2a 20  structures. .** 
d1b0: 43 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73  Comparison is as
d1c0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
d1d0: 20 20 31 29 20 45 4f 46 20 69 73 20 67 72 65 61    1) EOF is grea
d1e0: 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46  ter than not EOF
d1f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 54 68 65  ..**.**   2) The
d200: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 73 20 28   current terms (
d210: 69 66 20 61 6e 79 29 20 61 72 65 20 63 6f 6d 70  if any) are comp
d220: 61 72 65 64 20 75 73 69 6e 67 20 6d 65 6d 63 6d  ared using memcm
d230: 70 28 29 2e 20 49 66 20 6f 6e 65 0a 2a 2a 20 20  p(). If one.**  
d240: 20 20 20 20 74 65 72 6d 20 69 73 20 61 20 70 72      term is a pr
d250: 65 66 69 78 20 6f 66 20 61 6e 6f 74 68 65 72 2c  efix of another,
d260: 20 74 68 65 20 6c 6f 6e 67 65 72 20 74 65 72 6d   the longer term
d270: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
d280: 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 72 67 65  he.**      large
d290: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79  r..**.**   3) By
d2a0: 20 73 65 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e   segment age. An
d2b0: 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e 74 20 69   older segment i
d2c0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 61 72  s considered lar
d2d0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
d2e0: 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
d2f0: 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64 65  Cmp(Fts3SegReade
d300: 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67  r *pLhs, Fts3Seg
d310: 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20  Reader *pRhs){. 
d320: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
d330: 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52  Lhs->aNode && pR
d340: 68 73 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20 20  hs->aNode ){.   
d350: 20 69 6e 74 20 72 63 32 20 3d 20 70 4c 68 73 2d   int rc2 = pLhs-
d360: 3e 6e 54 65 72 6d 20 2d 20 70 52 68 73 2d 3e 6e  >nTerm - pRhs->n
d370: 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 72 63  Term;.    if( rc
d380: 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  2<0 ){.      rc 
d390: 3d 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a  = memcmp(pLhs->z
d3a0: 54 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72  Term, pRhs->zTer
d3b0: 6d 2c 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 29 3b  m, pLhs->nTerm);
d3c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d3d0: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4c    rc = memcmp(pL
d3e0: 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d  hs->zTerm, pRhs-
d3f0: 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 6e 54  >zTerm, pRhs->nT
d400: 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  erm);.    }.    
d410: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
d420: 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
d430: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
d440: 72 63 20 3d 20 28 70 4c 68 73 2d 3e 61 4e 6f 64  rc = (pLhs->aNod
d450: 65 3d 3d 30 29 20 2d 20 28 70 52 68 73 2d 3e 61  e==0) - (pRhs->a
d460: 4e 6f 64 65 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20  Node==0);.  }.  
d470: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
d480: 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64 78   rc = pRhs->iIdx
d490: 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20   - pLhs->iIdx;. 
d4a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
d4b0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
d4c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 64 69  c;.}../*.** A di
d4d0: 66 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 69 73  fferent comparis
d4e0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  on function for 
d4f0: 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63 74  SegReader struct
d500: 75 72 65 73 2e 20 49 6e 20 74 68 69 73 0a 2a 2a  ures. In this.**
d510: 20 76 65 72 73 69 6f 6e 2c 20 69 74 20 69 73 20   version, it is 
d520: 61 73 73 75 6d 65 64 20 74 68 61 74 20 65 61 63  assumed that eac
d530: 68 20 53 65 67 52 65 61 64 65 72 20 70 6f 69 6e  h SegReader poin
d540: 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 69  ts to an entry i
d550: 6e 0a 2a 2a 20 61 20 64 6f 63 6c 69 73 74 20 66  n.** a doclist f
d560: 6f 72 20 69 64 65 6e 74 69 63 61 6c 20 74 65 72  or identical ter
d570: 6d 73 2e 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69  ms. Comparison i
d580: 73 20 6d 61 64 65 20 61 73 20 66 6f 6c 6c 6f 77  s made as follow
d590: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f  s:.**.**   1) EO
d5a0: 46 20 28 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73  F (end of doclis
d5b0: 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 29 20  t in this case) 
d5c0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
d5d0: 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20  not EOF..**.**  
d5e0: 20 32 29 20 42 79 20 63 75 72 72 65 6e 74 20 64   2) By current d
d5f0: 6f 63 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29  ocid..**.**   3)
d600: 20 42 79 20 73 65 67 6d 65 6e 74 20 61 67 65 2e   By segment age.
d610: 20 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e   An older segmen
d620: 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  t is considered 
d630: 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  larger..*/.stati
d640: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
d650: 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 28 46 74  derDoclistCmp(Ft
d660: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68  s3SegReader *pLh
d670: 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  s, Fts3SegReader
d680: 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72   *pRhs){.  int r
d690: 63 20 3d 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73  c = (pLhs->pOffs
d6a0: 65 74 4c 69 73 74 3d 3d 30 29 2d 28 70 52 68 73  etList==0)-(pRhs
d6b0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
d6c0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
d6d0: 7b 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e  {.    if( pLhs->
d6e0: 69 44 6f 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44  iDocid==pRhs->iD
d6f0: 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20 72 63  ocid ){.      rc
d700: 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20   = pRhs->iIdx - 
d710: 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20  pLhs->iIdx;.    
d720: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
d730: 3d 20 28 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20  = (pLhs->iDocid 
d740: 3e 20 70 52 68 73 2d 3e 69 44 6f 63 69 64 29 20  > pRhs->iDocid) 
d750: 3f 20 31 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a  ? 1 : -1;.    }.
d760: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
d770: 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52 68  hs->aNode && pRh
d780: 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65  s->aNode );.  re
d790: 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
d7a0: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
d7b0: 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76  derDoclistCmpRev
d7c0: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
d7d0: 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65 61  pLhs, Fts3SegRea
d7e0: 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e  der *pRhs){.  in
d7f0: 74 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70 4f  t rc = (pLhs->pO
d800: 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28 70  ffsetList==0)-(p
d810: 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  Rhs->pOffsetList
d820: 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ==0);.  if( rc==
d830: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 68  0 ){.    if( pLh
d840: 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73 2d  s->iDocid==pRhs-
d850: 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 20  >iDocid ){.     
d860: 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64 78   rc = pRhs->iIdx
d870: 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20   - pLhs->iIdx;. 
d880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d890: 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f 63  rc = (pLhs->iDoc
d8a0: 69 64 20 3c 20 70 52 68 73 2d 3e 69 44 6f 63 69  id < pRhs->iDoci
d8b0: 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20 20  d) ? 1 : -1;.   
d8c0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
d8d0: 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20   pLhs->aNode && 
d8e0: 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20  pRhs->aNode );. 
d8f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d900: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
d910: 20 74 65 72 6d 20 74 68 61 74 20 74 68 65 20 46   term that the F
d920: 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ts3SegReader obj
d930: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
d940: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
d950: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 77 69  .** points to wi
d960: 74 68 20 74 68 65 20 74 65 72 6d 20 73 70 65 63  th the term spec
d970: 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e  ified by argumen
d980: 74 73 20 7a 54 65 72 6d 20 61 6e 64 20 6e 54 65  ts zTerm and nTe
d990: 72 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rm. .**.** If th
d9a0: 65 20 70 53 65 67 20 69 74 65 72 61 74 6f 72 20  e pSeg iterator 
d9b0: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f  is already at EO
d9c0: 46 2c 20 72 65 74 75 72 6e 20 30 2e 20 4f 74 68  F, return 0. Oth
d9d0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a 2a  erwise, return.*
d9e0: 2a 20 2d 76 65 20 69 66 20 74 68 65 20 70 53 65  * -ve if the pSe
d9f0: 67 20 74 65 72 6d 20 69 73 20 6c 65 73 73 20 74  g term is less t
da00: 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c  han zTerm/nTerm,
da10: 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 74 65   0 if the two te
da20: 72 6d 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c  rms are.** equal
da30: 2c 20 6f 72 20 2b 76 65 20 69 66 20 74 68 65 20  , or +ve if the 
da40: 70 53 65 67 20 74 65 72 6d 20 69 73 20 67 72 65  pSeg term is gre
da50: 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f  ater than zTerm/
da60: 6e 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  nTerm..*/.static
da70: 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64   int fts3SegRead
da80: 65 72 54 65 72 6d 43 6d 70 28 0a 20 20 46 74 73  erTermCmp(.  Fts
da90: 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
daa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
dab0: 53 65 67 6d 65 6e 74 20 72 65 61 64 65 72 20 6f  Segment reader o
dac0: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
dad0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
dae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
daf0: 72 6d 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f  rm to compare to
db00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20   */.  int nTerm 
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
db30: 20 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20 62   term zTerm in b
db40: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
db50: 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20   res = 0;.  if( 
db60: 70 53 65 67 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20  pSeg->aNode ){. 
db70: 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 54 65     if( pSeg->nTe
db80: 72 6d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  rm>nTerm ){.    
db90: 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70    res = memcmp(p
dba0: 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72  Seg->zTerm, zTer
dbb0: 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d  m, nTerm);.    }
dbc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
dbd0: 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a  = memcmp(pSeg->z
dbe0: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 70 53 65  Term, zTerm, pSe
dbf0: 67 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d  g->nTerm);.    }
dc00: 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
dc10: 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
dc20: 53 65 67 2d 3e 6e 54 65 72 6d 2d 6e 54 65 72 6d  Seg->nTerm-nTerm
dc30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
dc40: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
dc50: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70 53 65  ** Argument apSe
dc60: 67 6d 65 6e 74 20 69 73 20 61 6e 20 61 72 72 61  gment is an arra
dc70: 79 20 6f 66 20 6e 53 65 67 6d 65 6e 74 20 65 6c  y of nSegment el
dc80: 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 6b 6e  ements. It is kn
dc90: 6f 77 6e 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  own that.** the 
dca0: 66 69 6e 61 6c 20 28 6e 53 65 67 6d 65 6e 74 2d  final (nSegment-
dcb0: 6e 53 75 73 70 65 63 74 29 20 6d 65 6d 62 65 72  nSuspect) member
dcc0: 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
dcd0: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 2a 2a   sorted order.**
dce0: 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74   (according to t
dcf0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
dd00: 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 29  nction provided)
dd10: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
dd20: 73 68 75 66 66 6c 65 73 0a 2a 2a 20 74 68 65 20  shuffles.** the 
dd30: 61 72 72 61 79 20 61 72 6f 75 6e 64 20 75 6e 74  array around unt
dd40: 69 6c 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 61  il all entries a
dd50: 72 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  re in sorted ord
dd60: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
dd70: 69 64 20 66 74 73 33 53 65 67 52 65 61 64 65 72  id fts3SegReader
dd80: 53 6f 72 74 28 0a 20 20 46 74 73 33 53 65 67 52  Sort(.  Fts3SegR
dd90: 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e  eader **apSegmen
dda0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
ddb0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
ddc0: 74 6f 20 73 6f 72 74 20 65 6e 74 72 69 65 73 20  to sort entries 
ddd0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  of */.  int nSeg
dde0: 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ment,           
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
de10: 66 20 61 70 53 65 67 6d 65 6e 74 20 61 72 72 61  f apSegment arra
de20: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 73 70  y */.  int nSusp
de30: 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ect,            
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65        /* Unsorte
de60: 64 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f  d entry count */
de70: 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46  .  int (*xCmp)(F
de80: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20  ts3SegReader *, 
de90: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
dea0: 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
deb0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
dec0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
def0: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65  iable */..  asse
df00: 72 74 28 20 6e 53 75 73 70 65 63 74 3c 3d 6e 53  rt( nSuspect<=nS
df10: 65 67 6d 65 6e 74 20 29 3b 0a 0a 20 20 69 66 28  egment );..  if(
df20: 20 6e 53 75 73 70 65 63 74 3d 3d 6e 53 65 67 6d   nSuspect==nSegm
df30: 65 6e 74 20 29 20 6e 53 75 73 70 65 63 74 2d 2d  ent ) nSuspect--
df40: 3b 0a 20 20 66 6f 72 28 69 3d 6e 53 75 73 70 65  ;.  for(i=nSuspe
df50: 63 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ct-1; i>=0; i--)
df60: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
df70: 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 28 6e 53 65   for(j=i; j<(nSe
df80: 67 6d 65 6e 74 2d 31 29 3b 20 6a 2b 2b 29 7b 0a  gment-1); j++){.
df90: 20 20 20 20 20 20 46 74 73 33 53 65 67 52 65 61        Fts3SegRea
dfa0: 64 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20  der *pTmp;.     
dfb0: 20 69 66 28 20 78 43 6d 70 28 61 70 53 65 67 6d   if( xCmp(apSegm
dfc0: 65 6e 74 5b 6a 5d 2c 20 61 70 53 65 67 6d 65 6e  ent[j], apSegmen
dfd0: 74 5b 6a 2b 31 5d 29 3c 30 20 29 20 62 72 65 61  t[j+1])<0 ) brea
dfe0: 6b 3b 0a 20 20 20 20 20 20 70 54 6d 70 20 3d 20  k;.      pTmp = 
dff0: 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 3b 0a  apSegment[j+1];.
e000: 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b        apSegment[
e010: 6a 2b 31 5d 20 3d 20 61 70 53 65 67 6d 65 6e 74  j+1] = apSegment
e020: 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 70 53 65 67  [j];.      apSeg
e030: 6d 65 6e 74 5b 6a 5d 20 3d 20 70 54 6d 70 3b 0a  ment[j] = pTmp;.
e040: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64      }.  }..#ifnd
e050: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 43  ef NDEBUG.  /* C
e060: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 69  heck that the li
e070: 73 74 20 72 65 61 6c 6c 79 20 69 73 20 73 6f 72  st really is sor
e080: 74 65 64 20 6e 6f 77 2e 20 2a 2f 0a 20 20 66 6f  ted now. */.  fo
e090: 72 28 69 3d 30 3b 20 69 3c 28 6e 53 75 73 70 65  r(i=0; i<(nSuspe
e0a0: 63 74 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  ct-1); i++){.   
e0b0: 20 61 73 73 65 72 74 28 20 78 43 6d 70 28 61 70   assert( xCmp(ap
e0c0: 53 65 67 6d 65 6e 74 5b 69 5d 2c 20 61 70 53 65  Segment[i], apSe
e0d0: 67 6d 65 6e 74 5b 69 2b 31 5d 29 3c 30 20 29 3b  gment[i+1])<0 );
e0e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
e0f0: 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 72  * .** Insert a r
e100: 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25  ecord into the %
e110: 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e  _segments table.
e120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
e130: 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
e140: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
e170: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
e180: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42  sqlite3_int64 iB
e190: 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
e1a0: 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 66 6f 72 20  /* Block id for 
e1b0: 6e 65 77 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 63  new block */.  c
e1c0: 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20  har *z,         
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e1e0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
e1f0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 62  fer containing b
e200: 6c 6f 63 6b 20 64 61 74 61 20 2a 2f 0a 20 20 69  lock data */.  i
e210: 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e230: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
e240: 20 7a 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29   z in bytes */.)
e250: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
e260: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
e270: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
e280: 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45  p, SQL_INSERT_SE
e290: 47 4d 45 4e 54 53 2c 20 26 70 53 74 6d 74 2c 20  GMENTS, &pStmt, 
e2a0: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
e2b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
e2c0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
e2d0: 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 42 6c 6f  4(pStmt, 1, iBlo
e2e0: 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ck);.    sqlite3
e2f0: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
e300: 2c 20 32 2c 20 7a 2c 20 6e 2c 20 53 51 4c 49 54  , 2, z, n, SQLIT
e310: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
e320: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
e330: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
e340: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
e350: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e360: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e  rc;.}../* .** In
e370: 73 65 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e  sert a record in
e380: 74 6f 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  to the %_segdir 
e390: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
e3a0: 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 53 65   int fts3WriteSe
e3b0: 67 64 69 72 28 0a 20 20 46 74 73 33 54 61 62 6c  gdir(.  Fts3Tabl
e3c0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
e3d0: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
e3e0: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
e3f0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
e420: 72 20 22 6c 65 76 65 6c 22 20 66 69 65 6c 64 20  r "level" field 
e430: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
e460: 72 20 22 69 64 78 22 20 66 69 65 6c 64 20 2a 2f  r "idx" field */
e470: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
e480: 20 69 53 74 61 72 74 42 6c 6f 63 6b 2c 20 20 20   iStartBlock,   
e490: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
e4a0: 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 66 69  "start_block" fi
e4b0: 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
e4c0: 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 42  _int64 iLeafEndB
e4d0: 6c 6f 63 6b 2c 20 20 20 20 2f 2a 20 56 61 6c 75  lock,    /* Valu
e4e0: 65 20 66 6f 72 20 22 6c 65 61 76 65 73 5f 65 6e  e for "leaves_en
e4f0: 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a  d_block" field *
e500: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
e510: 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20  4 iEndBlock,    
e520: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
e530: 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
e540: 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52  ld */.  char *zR
e550: 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  oot,            
e560: 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 62 20          /* Blob 
e570: 76 61 6c 75 65 20 66 6f 72 20 22 72 6f 6f 74 22  value for "root"
e580: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
e590: 6e 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20  nRoot           
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e5b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
e5c0: 6e 20 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a  n buffer zRoot *
e5d0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
e5e0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
e5f0: 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74  t rc = fts3SqlSt
e600: 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54  mt(p, SQL_INSERT
e610: 5f 53 45 47 44 49 52 2c 20 26 70 53 74 6d 74 2c  _SEGDIR, &pStmt,
e620: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
e630: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e640: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
e650: 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76 65  (pStmt, 1, iLeve
e660: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
e670: 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
e680: 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73 71  2, iIdx);.    sq
e690: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
e6a0: 28 70 53 74 6d 74 2c 20 33 2c 20 69 53 74 61 72  (pStmt, 3, iStar
e6b0: 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c  tBlock);.    sql
e6c0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
e6d0: 70 53 74 6d 74 2c 20 34 2c 20 69 4c 65 61 66 45  pStmt, 4, iLeafE
e6e0: 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71  ndBlock);.    sq
e6f0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
e700: 28 70 53 74 6d 74 2c 20 35 2c 20 69 45 6e 64 42  (pStmt, 5, iEndB
e710: 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  lock);.    sqlit
e720: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
e730: 6d 74 2c 20 36 2c 20 7a 52 6f 6f 74 2c 20 6e 52  mt, 6, zRoot, nR
e740: 6f 6f 74 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  oot, SQLITE_STAT
e750: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
e760: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
e770: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
e780: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d  eset(pStmt);.  }
e790: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e7a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
e7b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
e7c0: 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66 20  mmon prefix (if 
e7d0: 61 6e 79 29 20 73 68 61 72 65 64 20 62 79 20 7a  any) shared by z
e7e0: 50 72 65 76 20 61 6e 64 0a 2a 2a 20 7a 4e 65 78  Prev and.** zNex
e7f0: 74 2c 20 69 6e 20 62 79 74 65 73 2e 20 46 6f 72  t, in bytes. For
e800: 20 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a 0a 2a 2a   example, .**.**
e810: 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d     fts3PrefixCom
e820: 70 72 65 73 73 28 22 61 62 63 22 2c 20 33 2c 20  press("abc", 3, 
e830: 22 61 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f  "abcdef", 6)   /
e840: 2f 20 72 65 74 75 72 6e 73 20 33 0a 2a 2a 20 20  / returns 3.**  
e850: 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
e860: 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22 61  ess("abX", 3, "a
e870: 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20  bcdef", 6)   // 
e880: 72 65 74 75 72 6e 73 20 32 0a 2a 2a 20 20 20 66  returns 2.**   f
e890: 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
e8a0: 73 28 22 61 62 58 22 2c 20 33 2c 20 22 58 62 63  s("abX", 3, "Xbc
e8b0: 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65  def", 6)   // re
e8c0: 74 75 72 6e 73 20 30 0a 2a 2f 0a 73 74 61 74 69  turns 0.*/.stati
e8d0: 63 20 69 6e 74 20 66 74 73 33 50 72 65 66 69 78  c int fts3Prefix
e8e0: 43 6f 6d 70 72 65 73 73 28 0a 20 20 63 6f 6e 73  Compress(.  cons
e8f0: 74 20 63 68 61 72 20 2a 7a 50 72 65 76 2c 20 20  t char *zPrev,  
e900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e910: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
e920: 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a   previous term *
e930: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 76 2c 20 20  /.  int nPrev,  
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
e960: 75 66 66 65 72 20 7a 50 72 65 76 20 69 6e 20 62  uffer zPrev in b
e970: 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ytes */.  const 
e980: 63 68 61 72 20 2a 7a 4e 65 78 74 2c 20 20 20 20  char *zNext,    
e990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
e9a0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
e9b0: 65 78 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ext term */.  in
e9c0: 74 20 6e 4e 65 78 74 20 20 20 20 20 20 20 20 20  t nNext         
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9e0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
e9f0: 7a 4e 65 78 74 20 69 6e 20 62 79 74 65 73 20 2a  zNext in bytes *
ea00: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
ea10: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ea20: 28 6e 4e 65 78 74 29 3b 0a 20 20 66 6f 72 28 6e  (nNext);.  for(n
ea30: 3d 30 3b 20 6e 3c 6e 50 72 65 76 20 26 26 20 7a  =0; n<nPrev && z
ea40: 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78 74 5b 6e  Prev[n]==zNext[n
ea50: 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65 74 75 72  ]; n++);.  retur
ea60: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n n;.}../*.** Ad
ea70: 64 20 74 65 72 6d 20 7a 54 65 72 6d 20 74 6f 20  d term zTerm to 
ea80: 74 68 65 20 53 65 67 6d 65 6e 74 4e 6f 64 65 2e  the SegmentNode.
ea90: 20 49 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   It is guarantee
eaa0: 64 20 74 68 61 74 20 7a 54 65 72 6d 20 69 73 20  d that zTerm is 
eab0: 6c 61 72 67 65 72 0a 2a 2a 20 28 61 63 63 6f 72  larger.** (accor
eac0: 64 69 6e 67 20 74 6f 20 6d 65 6d 63 6d 70 29 20  ding to memcmp) 
ead0: 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
eae0: 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  s term..*/.stati
eaf0: 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65 41 64  c int fts3NodeAd
eb00: 64 54 65 72 6d 28 0a 20 20 46 74 73 33 54 61 62  dTerm(.  Fts3Tab
eb10: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
eb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
eb30: 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
eb40: 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64   */.  SegmentNod
eb50: 65 20 2a 2a 70 70 54 72 65 65 2c 20 20 20 20 20  e **ppTree,     
eb60: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
eb70: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e   SegmentNode han
eb80: 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73  dle */ .  int is
eb90: 43 6f 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20  CopyTerm,       
eba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
ebb0: 65 20 69 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  e if zTerm/nTerm
ebc0: 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 2a 2f   is transient */
ebd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ebe0: 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
ebf0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
ec00: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
ec10: 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  ng term */.  int
ec20: 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec40: 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20  Size of term in 
ec50: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  bytes */.){.  Se
ec60: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65  gmentNode *pTree
ec70: 20 3d 20 2a 70 70 54 72 65 65 3b 0a 20 20 69 6e   = *ppTree;.  in
ec80: 74 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74 4e  t rc;.  SegmentN
ec90: 6f 64 65 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a  ode *pNew;..  /*
eca0: 20 46 69 72 73 74 20 74 72 79 20 74 6f 20 61 70   First try to ap
ecb0: 70 65 6e 64 20 74 68 65 20 74 65 72 6d 20 74 6f  pend the term to
ecc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
ecd0: 65 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  e. Return early 
ece0: 69 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 69 73  if .  ** this is
ecf0: 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
ed00: 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20    if( pTree ){. 
ed10: 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70     int nData = p
ed20: 54 72 65 65 2d 3e 6e 44 61 74 61 3b 20 20 20 20  Tree->nData;    
ed30: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
ed40: 20 6f 66 20 6e 6f 64 65 20 69 6e 20 62 79 74 65   of node in byte
ed50: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  s */.    int nRe
ed60: 71 20 3d 20 6e 44 61 74 61 3b 20 20 20 20 20 20  q = nData;      
ed70: 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
ed80: 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20 61  ed space after a
ed90: 64 64 69 6e 67 20 7a 54 65 72 6d 20 2a 2f 0a 20  dding zTerm */. 
eda0: 20 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20     int nPrefix; 
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
edd0: 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f  tes of prefix co
ede0: 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  mpression */.   
edf0: 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20   int nSuffix;   
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee10: 2a 20 53 75 66 66 69 78 20 6c 65 6e 67 74 68 20  * Suffix length 
ee20: 2a 2f 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20  */..    nPrefix 
ee30: 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
ee40: 72 65 73 73 28 70 54 72 65 65 2d 3e 7a 54 65 72  ress(pTree->zTer
ee50: 6d 2c 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 2c  m, pTree->nTerm,
ee60: 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
ee70: 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
ee80: 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20  erm-nPrefix;..  
ee90: 20 20 6e 52 65 71 20 2b 3d 20 73 71 6c 69 74 65    nReq += sqlite
eea0: 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
eeb0: 50 72 65 66 69 78 29 2b 73 71 6c 69 74 65 33 46  Prefix)+sqlite3F
eec0: 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75  ts3VarintLen(nSu
eed0: 66 66 69 78 29 2b 6e 53 75 66 66 69 78 3b 0a 20  ffix)+nSuffix;. 
eee0: 20 20 20 69 66 28 20 6e 52 65 71 3c 3d 70 2d 3e     if( nReq<=p->
eef0: 6e 4e 6f 64 65 53 69 7a 65 20 7c 7c 20 21 70 54  nNodeSize || !pT
ef00: 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20  ree->zTerm ){.. 
ef10: 20 20 20 20 20 69 66 28 20 6e 52 65 71 3e 70 2d       if( nReq>p-
ef20: 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20  >nNodeSize ){.  
ef30: 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73        /* An unus
ef40: 75 61 6c 20 63 61 73 65 3a 20 74 68 69 73 20 69  ual case: this i
ef50: 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
ef60: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
ef70: 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 20 20 20  the node.       
ef80: 20 2a 2a 20 61 6e 64 20 74 68 65 20 73 74 61 74   ** and the stat
ef90: 69 63 20 6e 6f 64 65 20 62 75 66 66 65 72 20 28  ic node buffer (
efa0: 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74  p->nNodeSize byt
efb0: 65 73 29 20 69 73 20 6e 6f 74 20 6c 61 72 67 65  es) is not large
efc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 6f 75  .        ** enou
efd0: 67 68 2e 20 55 73 65 20 61 20 73 65 70 61 72 61  gh. Use a separa
efe0: 74 65 6c 79 20 6d 61 6c 6c 6f 63 65 64 20 62 75  tely malloced bu
eff0: 66 66 65 72 20 69 6e 73 74 65 61 64 20 54 68 69  ffer instead Thi
f000: 73 20 77 61 73 74 65 73 0a 20 20 20 20 20 20 20  s wastes.       
f010: 20 2a 2a 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65   ** p->nNodeSize
f020: 20 62 79 74 65 73 2c 20 62 75 74 20 73 69 6e 63   bytes, but sinc
f030: 65 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  e this scenario 
f040: 6f 6e 6c 79 20 63 6f 6d 65 73 20 61 62 6f 75 74  only comes about
f050: 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
f060: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
f070: 6e 74 61 69 6e 20 74 77 6f 20 74 65 72 6d 73 20  ntain two terms 
f080: 74 68 61 74 20 73 68 61 72 65 20 61 20 70 72 65  that share a pre
f090: 66 69 78 20 6f 66 20 61 6c 6d 6f 73 74 20 32 4b  fix of almost 2K
f0a0: 42 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  B, .        ** t
f0b0: 68 69 73 20 69 73 20 6e 6f 74 20 65 78 70 65 63  his is not expec
f0c0: 74 65 64 20 74 6f 20 62 65 20 61 20 73 65 72 69  ted to be a seri
f0d0: 6f 75 73 20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20  ous problem. .  
f0e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f0f0: 20 61 73 73 65 72 74 28 20 70 54 72 65 65 2d 3e   assert( pTree->
f100: 61 44 61 74 61 3d 3d 28 63 68 61 72 20 2a 29 26  aData==(char *)&
f110: 70 54 72 65 65 5b 31 5d 20 29 3b 0a 20 20 20 20  pTree[1] );.    
f120: 20 20 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61      pTree->aData
f130: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
f140: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 71 29 3b  e3_malloc(nReq);
f150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 54  .        if( !pT
f160: 72 65 65 2d 3e 61 44 61 74 61 20 29 7b 0a 20 20  ree->aData ){.  
f170: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f180: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
f190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
f1a0: 20 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d        if( pTree-
f1b0: 3e 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  >zTerm ){.      
f1c0: 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
f1d0: 20 70 72 65 66 69 78 2d 6c 65 6e 67 74 68 20 66   prefix-length f
f1e0: 69 65 6c 64 20 66 6f 72 20 66 69 72 73 74 20 74  ield for first t
f1f0: 65 72 6d 20 69 6e 20 61 20 6e 6f 64 65 20 2a 2f  erm in a node */
f200: 0a 20 20 20 20 20 20 20 20 6e 44 61 74 61 20 2b  .        nData +
f210: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
f220: 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61  Varint(&pTree->a
f230: 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72  Data[nData], nPr
f240: 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  efix);.      }..
f250: 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73        nData += s
f260: 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
f270: 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74  int(&pTree->aDat
f280: 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69  a[nData], nSuffi
f290: 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  x);.      memcpy
f2a0: 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e  (&pTree->aData[n
f2b0: 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50  Data], &zTerm[nP
f2c0: 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29  refix], nSuffix)
f2d0: 3b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e  ;.      pTree->n
f2e0: 44 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e  Data = nData + n
f2f0: 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70 54  Suffix;.      pT
f300: 72 65 65 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a  ree->nEntry++;..
f310: 20 20 20 20 20 20 69 66 28 20 69 73 43 6f 70 79        if( isCopy
f320: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
f330: 69 66 28 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c  if( pTree->nMall
f340: 6f 63 3c 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  oc<nTerm ){.    
f350: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
f360: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
f370: 6f 63 28 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f  oc(pTree->zMallo
f380: 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20  c, nTerm*2);.   
f390: 20 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77         if( !zNew
f3a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f3b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
f3c0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
f3d0: 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 65 65  .          pTree
f3e0: 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72  ->nMalloc = nTer
f3f0: 6d 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  m*2;.          p
f400: 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  Tree->zMalloc = 
f410: 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zNew;.        }.
f420: 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a          pTree->z
f430: 54 65 72 6d 20 3d 20 70 54 72 65 65 2d 3e 7a 4d  Term = pTree->zM
f440: 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20 6d  alloc;.        m
f450: 65 6d 63 70 79 28 70 54 72 65 65 2d 3e 7a 54 65  emcpy(pTree->zTe
f460: 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
f470: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65  );.        pTree
f480: 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b  ->nTerm = nTerm;
f490: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f4a0: 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65        pTree->zTe
f4b0: 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65  rm = (char *)zTe
f4c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65  rm;.        pTre
f4d0: 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d  e->nTerm = nTerm
f4e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f4f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f510: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
f520: 77 73 20 74 6f 20 68 65 72 65 2c 20 69 74 20 77  ws to here, it w
f530: 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
f540: 74 6f 20 61 70 70 65 6e 64 20 7a 54 65 72 6d 20  to append zTerm 
f550: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  to the.  ** curr
f560: 65 6e 74 20 6e 6f 64 65 2e 20 43 72 65 61 74 65  ent node. Create
f570: 20 61 20 6e 65 77 20 6e 6f 64 65 20 28 61 20 72   a new node (a r
f580: 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
f590: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
f5a0: 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  )..  ** If this 
f5b0: 69 73 20 74 68 65 20 66 69 72 73 74 20 6e 6f 64  is the first nod
f5c0: 65 20 69 6e 20 74 68 65 20 74 72 65 65 2c 20 74  e in the tree, t
f5d0: 68 65 20 74 65 72 6d 20 69 73 20 61 64 64 65 64  he term is added
f5e0: 20 74 6f 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a   to it..  **.  *
f5f0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
f600: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 64 64   term is not add
f610: 65 64 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 6f  ed to the new no
f620: 64 65 2c 20 69 74 20 69 73 20 6c 65 66 74 20 65  de, it is left e
f630: 6d 70 74 79 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f  mpty for.  ** no
f640: 77 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  w. Instead, the 
f650: 74 65 72 6d 20 69 73 20 69 6e 73 65 72 74 65 64  term is inserted
f660: 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
f670: 20 6f 66 20 70 54 72 65 65 2e 20 49 66 20 70 54   of pTree. If pT
f680: 72 65 65 20 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  ree .  ** has no
f690: 20 70 61 72 65 6e 74 2c 20 6f 6e 65 20 69 73 20   parent, one is 
f6a0: 63 72 65 61 74 65 64 20 68 65 72 65 2e 0a 20 20  created here..  
f6b0: 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 28 53 65 67  */.  pNew = (Seg
f6c0: 6d 65 6e 74 4e 6f 64 65 20 2a 29 73 71 6c 69 74  mentNode *)sqlit
f6d0: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
f6e0: 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 20 2b 20  (SegmentNode) + 
f6f0: 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20  p->nNodeSize);. 
f700: 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
f710: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f720: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
f730: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
f740: 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29  eof(SegmentNode)
f750: 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 44 61 74 61  );.  pNew->nData
f760: 20 3d 20 31 20 2b 20 46 54 53 33 5f 56 41 52 49   = 1 + FTS3_VARI
f770: 4e 54 5f 4d 41 58 3b 0a 20 20 70 4e 65 77 2d 3e  NT_MAX;.  pNew->
f780: 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29  aData = (char *)
f790: 26 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20 69 66 28  &pNew[1];..  if(
f7a0: 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65   pTree ){.    Se
f7b0: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65  gmentNode *pPare
f7c0: 6e 74 20 3d 20 70 54 72 65 65 2d 3e 70 50 61 72  nt = pTree->pPar
f7d0: 65 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  ent;.    rc = ft
f7e0: 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c  s3NodeAddTerm(p,
f7f0: 20 26 70 50 61 72 65 6e 74 2c 20 69 73 43 6f 70   &pParent, isCop
f800: 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  yTerm, zTerm, nT
f810: 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  erm);.    if( pT
f820: 72 65 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  ree->pParent==0 
f830: 29 7b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e  ){.      pTree->
f840: 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
f850: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72  t;.    }.    pTr
f860: 65 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e 65  ee->pRight = pNe
f870: 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65  w;.    pNew->pLe
f880: 66 74 6d 6f 73 74 20 3d 20 70 54 72 65 65 2d 3e  ftmost = pTree->
f890: 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 70  pLeftmost;.    p
f8a0: 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  New->pParent = p
f8b0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e 65 77  Parent;.    pNew
f8c0: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65  ->zMalloc = pTre
f8d0: 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  e->zMalloc;.    
f8e0: 70 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20  pNew->nMalloc = 
f8f0: 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a  pTree->nMalloc;.
f900: 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c      pTree->zMall
f910: 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  oc = 0;.  }else{
f920: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  .    pNew->pLeft
f930: 6d 6f 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  most = pNew;.   
f940: 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64   rc = fts3NodeAd
f950: 64 54 65 72 6d 28 70 2c 20 26 70 4e 65 77 2c 20  dTerm(p, &pNew, 
f960: 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72  isCopyTerm, zTer
f970: 6d 2c 20 6e 54 65 72 6d 29 3b 20 0a 20 20 7d 0a  m, nTerm); .  }.
f980: 0a 20 20 2a 70 70 54 72 65 65 20 3d 20 70 4e 65  .  *ppTree = pNe
f990: 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  w;.  return rc;.
f9a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
f9b0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66 74 73  function for fts
f9c0: 33 4e 6f 64 65 57 72 69 74 65 28 29 2e 0a 2a 2f  3NodeWrite()..*/
f9d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
f9e0: 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 0a  TreeFinishNode(.
f9f0: 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
fa00: 54 72 65 65 2c 20 0a 20 20 69 6e 74 20 69 48 65  Tree, .  int iHe
fa10: 69 67 68 74 2c 20 0a 20 20 73 71 6c 69 74 65 33  ight, .  sqlite3
fa20: 5f 69 6e 74 36 34 20 69 4c 65 66 74 43 68 69 6c  _int64 iLeftChil
fa30: 64 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74 61 72  d.){.  int nStar
fa40: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 48 65  t;.  assert( iHe
fa50: 69 67 68 74 3e 3d 31 20 26 26 20 69 48 65 69 67  ight>=1 && iHeig
fa60: 68 74 3c 31 32 38 20 29 3b 0a 20 20 6e 53 74 61  ht<128 );.  nSta
fa70: 72 74 20 3d 20 46 54 53 33 5f 56 41 52 49 4e 54  rt = FTS3_VARINT
fa80: 5f 4d 41 58 20 2d 20 73 71 6c 69 74 65 33 46 74  _MAX - sqlite3Ft
fa90: 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 4c 65 66  s3VarintLen(iLef
faa0: 74 43 68 69 6c 64 29 3b 0a 20 20 70 54 72 65 65  tChild);.  pTree
fab0: 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 20  ->aData[nStart] 
fac0: 3d 20 28 63 68 61 72 29 69 48 65 69 67 68 74 3b  = (char)iHeight;
fad0: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  .  sqlite3Fts3Pu
fae0: 74 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e  tVarint(&pTree->
faf0: 61 44 61 74 61 5b 6e 53 74 61 72 74 2b 31 5d 2c  aData[nStart+1],
fb00: 20 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20   iLeftChild);.  
fb10: 72 65 74 75 72 6e 20 6e 53 74 61 72 74 3b 0a 7d  return nStart;.}
fb20: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
fb30: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 65  e buffer for the
fb40: 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 70 54   segment node pT
fb50: 72 65 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ree and all of i
fb60: 74 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 0a  ts peers to the.
fb70: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
fb80: 6e 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  n call this func
fb90: 74 69 6f 6e 20 72 65 63 75 72 73 69 76 65 6c 79  tion recursively
fba0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 61   to write the pa
fbb0: 72 65 6e 74 20 6f 66 20 0a 2a 2a 20 70 54 72 65  rent of .** pTre
fbc0: 65 20 61 6e 64 20 69 74 73 20 70 65 65 72 73 20  e and its peers 
fbd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
fbe0: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
fbf0: 69 66 20 70 54 72 65 65 20 69 73 20 61 20 72 6f  if pTree is a ro
fc00: 6f 74 20 6e 6f 64 65 2c 20 64 6f 20 6e 6f 74 20  ot node, do not 
fc10: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
fc20: 64 61 74 61 62 61 73 65 2e 20 49 6e 73 74 65 61  database. Instea
fc30: 64 2c 0a 2a 2a 20 73 65 74 20 6f 75 74 70 75 74  d,.** set output
fc40: 20 76 61 72 69 61 62 6c 65 73 20 2a 70 61 52 6f   variables *paRo
fc50: 6f 74 20 61 6e 64 20 2a 70 6e 52 6f 6f 74 20 74  ot and *pnRoot t
fc60: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f  o contain the ro
fc70: 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  ot node..**.** I
fc80: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
fc90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
fca0: 6e 65 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76  ned and output v
fcb0: 61 72 69 61 62 6c 65 20 2a 70 69 4c 61 73 74 20  ariable *piLast 
fcc0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  is.** set to the
fcd0: 20 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64   largest blockid
fce0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
fcf0: 64 61 74 61 62 61 73 65 20 28 6f 72 20 7a 65 72  database (or zer
fd00: 6f 20 69 66 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b  o if no.** block
fd10: 73 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 74  s were written t
fd20: 6f 20 74 68 65 20 64 62 29 2e 20 4f 74 68 65 72  o the db). Other
fd30: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
fd40: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
fd50: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
fd60: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f  tatic int fts3No
fd70: 64 65 57 72 69 74 65 28 0a 20 20 46 74 73 33 54  deWrite(.  Fts3T
fd80: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
fd90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
fda0: 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
fdb0: 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e  le */.  SegmentN
fdc0: 6f 64 65 20 2a 70 54 72 65 65 2c 20 20 20 20 20  ode *pTree,     
fdd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
fde0: 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f  ntNode handle */
fdf0: 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20  .  int iHeight, 
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe10: 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20     /* Height of 
fe20: 74 68 69 73 20 6e 6f 64 65 20 69 6e 20 74 72 65  this node in tre
fe30: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
fe40: 6e 74 36 34 20 69 4c 65 61 66 2c 20 20 20 20 20  nt64 iLeaf,     
fe50: 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
fe60: 69 64 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66  id of first leaf
fe70: 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   node */.  sqlit
fe80: 65 33 5f 69 6e 74 36 34 20 69 46 72 65 65 2c 20  e3_int64 iFree, 
fe90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
fea0: 6f 63 6b 20 69 64 20 6f 66 20 6e 65 78 74 20 66  ock id of next f
feb0: 72 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65  ree slot in %_se
fec0: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  gments */.  sqli
fed0: 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c 61 73  te3_int64 *piLas
fee0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t,          /* O
fef0: 55 54 3a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20  UT: Block id of 
ff00: 6c 61 73 74 20 65 6e 74 72 79 20 77 72 69 74 74  last entry writt
ff10: 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  en */.  char **p
ff20: 61 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  aRoot,          
ff30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
ff40: 44 61 74 61 20 66 6f 72 20 72 6f 6f 74 20 6e 6f  Data for root no
ff50: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  de */.  int *pnR
ff60: 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
ff70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
ff80: 53 69 7a 65 20 6f 66 20 72 6f 6f 74 20 6e 6f 64  Size of root nod
ff90: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  e in bytes */.){
ffa0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ffb0: 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
ffc0: 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b  Tree->pParent ){
ffd0: 0a 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64  .    /* Root nod
ffe0: 65 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a  e of the tree. *
fff0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74  /.    int nStart
10000 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73   = fts3TreeFinis
10010 68 4e 6f 64 65 28 70 54 72 65 65 2c 20 69 48 65  hNode(pTree, iHe
10020 69 67 68 74 2c 20 69 4c 65 61 66 29 3b 0a 20 20  ight, iLeaf);.  
10030 20 20 2a 70 69 4c 61 73 74 20 3d 20 69 46 72 65    *piLast = iFre
10040 65 2d 31 3b 0a 20 20 20 20 2a 70 6e 52 6f 6f 74  e-1;.    *pnRoot
10050 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 20   = pTree->nData 
10060 2d 20 6e 53 74 61 72 74 3b 0a 20 20 20 20 2a 70  - nStart;.    *p
10070 61 52 6f 6f 74 20 3d 20 26 70 54 72 65 65 2d 3e  aRoot = &pTree->
10080 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 3b 0a 20  aData[nStart];. 
10090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 65 67 6d   }else{.    Segm
100a0 65 6e 74 4e 6f 64 65 20 2a 70 49 74 65 72 3b 0a  entNode *pIter;.
100b0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
100c0 34 20 69 4e 65 78 74 46 72 65 65 20 3d 20 69 46  4 iNextFree = iF
100d0 72 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ree;.    sqlite3
100e0 5f 69 6e 74 36 34 20 69 4e 65 78 74 4c 65 61 66  _int64 iNextLeaf
100f0 20 3d 20 69 4c 65 61 66 3b 0a 20 20 20 20 66 6f   = iLeaf;.    fo
10100 72 28 70 49 74 65 72 3d 70 54 72 65 65 2d 3e 70  r(pIter=pTree->p
10110 4c 65 66 74 6d 6f 73 74 3b 20 70 49 74 65 72 20  Leftmost; pIter 
10120 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
10130 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
10140 52 69 67 68 74 29 7b 0a 20 20 20 20 20 20 69 6e  Right){.      in
10150 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54  t nStart = fts3T
10160 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 49  reeFinishNode(pI
10170 74 65 72 2c 20 69 48 65 69 67 68 74 2c 20 69 4e  ter, iHeight, iN
10180 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  extLeaf);.      
10190 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 70 49 74  int nWrite = pIt
101a0 65 72 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61  er->nData - nSta
101b0 72 74 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20  rt;.  .      rc 
101c0 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
101d0 6e 74 28 70 2c 20 69 4e 65 78 74 46 72 65 65 2c  nt(p, iNextFree,
101e0 20 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 6e   &pIter->aData[n
101f0 53 74 61 72 74 5d 2c 20 6e 57 72 69 74 65 29 3b  Start], nWrite);
10200 0a 20 20 20 20 20 20 69 4e 65 78 74 46 72 65 65  .      iNextFree
10210 2b 2b 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 4c  ++;.      iNextL
10220 65 61 66 20 2b 3d 20 28 70 49 74 65 72 2d 3e 6e  eaf += (pIter->n
10230 45 6e 74 72 79 2b 31 29 3b 0a 20 20 20 20 7d 0a  Entry+1);.    }.
10240 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
10260 73 73 65 72 74 28 20 69 4e 65 78 74 4c 65 61 66  ssert( iNextLeaf
10270 3d 3d 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20  ==iFree );.     
10280 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72   rc = fts3NodeWr
10290 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  ite(.          p
102a0 2c 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74  , pTree->pParent
102b0 2c 20 69 48 65 69 67 68 74 2b 31 2c 20 69 46 72  , iHeight+1, iFr
102c0 65 65 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 70  ee, iNextFree, p
102d0 69 4c 61 73 74 2c 20 70 61 52 6f 6f 74 2c 20 70  iLast, paRoot, p
102e0 6e 52 6f 6f 74 0a 20 20 20 20 20 20 29 3b 0a 20  nRoot.      );. 
102f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
10300 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10310 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
10320 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
10330 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
10340 74 72 65 65 20 70 54 72 65 65 2e 0a 2a 2f 0a 73  tree pTree..*/.s
10350 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4e  tatic void fts3N
10360 6f 64 65 46 72 65 65 28 53 65 67 6d 65 6e 74 4e  odeFree(SegmentN
10370 6f 64 65 20 2a 70 54 72 65 65 29 7b 0a 20 20 69  ode *pTree){.  i
10380 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20  f( pTree ){.    
10390 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 20 3d  SegmentNode *p =
103a0 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73   pTree->pLeftmos
103b0 74 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64 65 46  t;.    fts3NodeF
103c0 72 65 65 28 70 2d 3e 70 50 61 72 65 6e 74 29 3b  ree(p->pParent);
103d0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b  .    while( p ){
103e0 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f  .      SegmentNo
103f0 64 65 20 2a 70 52 69 67 68 74 20 3d 20 70 2d 3e  de *pRight = p->
10400 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
10410 28 20 70 2d 3e 61 44 61 74 61 21 3d 28 63 68 61  ( p->aData!=(cha
10420 72 20 2a 29 26 70 5b 31 5d 20 29 7b 0a 20 20 20  r *)&p[1] ){.   
10430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
10440 65 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  e(p->aData);.   
10450 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
10460 74 28 20 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  t( pRight==0 || 
10470 70 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  p->zMalloc==0 );
10480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
10490 72 65 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  ree(p->zMalloc);
104a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
104b0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 70 20  ree(p);.      p 
104c0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  = pRight;.    }.
104d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
104e0 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 73   a term to the s
104f0 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 6e  egment being con
10500 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
10510 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62  SegmentWriter ob
10520 6a 65 63 74 0a 2a 2a 20 2a 70 70 57 72 69 74 65  ject.** *ppWrite
10530 72 2e 20 57 68 65 6e 20 61 64 64 69 6e 67 20 74  r. When adding t
10540 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f  he first term to
10550 20 61 20 73 65 67 6d 65 6e 74 2c 20 2a 70 70 57   a segment, *ppW
10560 72 69 74 65 72 20 73 68 6f 75 6c 64 0a 2a 2a 20  riter should.** 
10570 62 65 20 70 61 73 73 65 64 20 4e 55 4c 4c 2e 20  be passed NULL. 
10580 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  This function wi
10590 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ll allocate a ne
105a0 77 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  w SegmentWriter 
105b0 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 72 65  object.** and re
105c0 74 75 72 6e 20 69 74 20 76 69 61 20 74 68 65 20  turn it via the 
105d0 69 6e 70 75 74 2f 6f 75 74 70 75 74 20 76 61 72  input/output var
105e0 69 61 62 6c 65 20 2a 70 70 57 72 69 74 65 72 20  iable *ppWriter 
105f0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
10600 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
10610 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
10620 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
10630 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
10640 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
10650 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
10660 57 72 69 74 65 72 41 64 64 28 0a 20 20 46 74 73  WriterAdd(.  Fts
10670 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10690 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
106a0 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  ndle */.  Segmen
106b0 74 57 72 69 74 65 72 20 2a 2a 70 70 57 72 69 74  tWriter **ppWrit
106c0 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  er,       /* IN/
106d0 4f 55 54 3a 20 53 65 67 6d 65 6e 74 57 72 69 74  OUT: SegmentWrit
106e0 65 72 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20  er handle */ .  
106f0 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20  int isCopyTerm, 
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10710 2f 2a 20 54 72 75 65 20 69 66 20 62 75 66 66 65  /* True if buffe
10720 72 20 7a 54 65 72 6d 20 6d 75 73 74 20 62 65 20  r zTerm must be 
10730 63 6f 70 69 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  copied */.  cons
10740 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20  t char *zTerm,  
10750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10760 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
10770 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
10780 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
107b0 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a   term in bytes *
107c0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
107d0 61 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20  aDoclist,       
107e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
107f0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
10800 69 6e 67 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20  ing doclist */. 
10810 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20   int nDoclist   
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10830 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c   /* Size of docl
10840 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
10850 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  ){.  int nPrefix
10860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10870 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10880 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62  term prefix in b
10890 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ytes */.  int nS
108a0 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  uffix;          
108b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
108c0 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78  e of term suffix
108d0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
108e0 6e 74 20 6e 52 65 71 3b 20 20 20 20 20 20 20 20  nt nReq;        
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10900 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
10910 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65  s required on le
10920 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  af page */.  int
10930 20 6e 44 61 74 61 3b 0a 20 20 53 65 67 6d 65 6e   nData;.  Segmen
10940 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
10950 20 3d 20 2a 70 70 57 72 69 74 65 72 3b 0a 0a 20   = *ppWriter;.. 
10960 20 69 66 28 20 21 70 57 72 69 74 65 72 20 29 7b   if( !pWriter ){
10970 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
10980 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
10990 53 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  Stmt;..    /* Al
109a0 6c 6f 63 61 74 65 20 74 68 65 20 53 65 67 6d 65  locate the Segme
109b0 6e 74 57 72 69 74 65 72 20 73 74 72 75 63 74 75  ntWriter structu
109c0 72 65 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65  re */.    pWrite
109d0 72 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74  r = (SegmentWrit
109e0 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  er *)sqlite3_mal
109f0 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65  loc(sizeof(Segme
10a00 6e 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20  ntWriter));.    
10a10 69 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72  if( !pWriter ) r
10a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10a30 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  EM;.    memset(p
10a40 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
10a50 66 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29  f(SegmentWriter)
10a60 29 3b 0a 20 20 20 20 2a 70 70 57 72 69 74 65 72  );.    *ppWriter
10a70 20 3d 20 70 57 72 69 74 65 72 3b 0a 0a 20 20 20   = pWriter;..   
10a80 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
10a90 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
10aa0 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61 74  o accumulate dat
10ab0 61 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72  a */.    pWriter
10ac0 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20  ->aData = (char 
10ad0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
10ae0 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a  (p->nNodeSize);.
10af0 20 20 20 20 69 66 28 20 21 70 57 72 69 74 65 72      if( !pWriter
10b00 2d 3e 61 44 61 74 61 20 29 20 72 65 74 75 72 6e  ->aData ) return
10b10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10b20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a     pWriter->nSiz
10b30 65 20 3d 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  e = p->nNodeSize
10b40 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
10b50 68 65 20 6e 65 78 74 20 66 72 65 65 20 62 6c 6f  he next free blo
10b60 63 6b 69 64 20 69 6e 20 74 68 65 20 25 5f 73 65  ckid in the %_se
10b70 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a  gments table */.
10b80 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
10b90 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54  Stmt(p, SQL_NEXT
10ba0 5f 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70  _SEGMENTS_ID, &p
10bb0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
10bc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10bd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
10be0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
10bf0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
10c00 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 70 57  tmt) ){.      pW
10c10 72 69 74 65 72 2d 3e 69 46 72 65 65 20 3d 20 73  riter->iFree = s
10c20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
10c30 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  t64(pStmt, 0);. 
10c40 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46       pWriter->iF
10c50 69 72 73 74 20 3d 20 70 57 72 69 74 65 72 2d 3e  irst = pWriter->
10c60 69 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  iFree;.    }.   
10c70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
10c80 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
10c90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10ca0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
10cb0 20 7d 0a 20 20 6e 44 61 74 61 20 3d 20 70 57 72   }.  nData = pWr
10cc0 69 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 0a 20 20  iter->nData;..  
10cd0 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72  nPrefix = fts3Pr
10ce0 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 57 72  efixCompress(pWr
10cf0 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 57 72  iter->zTerm, pWr
10d00 69 74 65 72 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65  iter->nTerm, zTe
10d10 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e 53  rm, nTerm);.  nS
10d20 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50  uffix = nTerm-nP
10d30 72 65 66 69 78 3b 0a 0a 20 20 2f 2a 20 46 69 67  refix;..  /* Fig
10d40 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
10d50 20 62 79 74 65 73 20 61 72 65 20 72 65 71 75 69   bytes are requi
10d60 72 65 64 20 62 79 20 74 68 69 73 20 6e 65 77 20  red by this new 
10d70 65 6e 74 72 79 20 2a 2f 0a 20 20 6e 52 65 71 20  entry */.  nReq 
10d80 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
10d90 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 20  intLen(nPrefix) 
10da0 2b 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63  +    /* varint c
10db0 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
10dc0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c   size */.    sql
10dd0 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
10de0 6e 28 6e 53 75 66 66 69 78 29 20 2b 20 20 20 20  n(nSuffix) +    
10df0 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63       /* varint c
10e00 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69 78  ontaining suffix
10e10 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6e 53 75   size */.    nSu
10e20 66 66 69 78 20 2b 20 20 20 20 20 20 20 20 20 20  ffix +          
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75 66       /* Term suf
10e50 66 69 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  fix */.    sqlit
10e60 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
10e70 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20  nDoclist) +     
10e80 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f     /* Size of do
10e90 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6e 44 6f  clist */.    nDo
10ea0 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
10ed0 64 61 74 61 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  data */..  if( n
10ee0 44 61 74 61 3e 30 20 26 26 20 6e 44 61 74 61 2b  Data>0 && nData+
10ef0 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a  nReq>p->nNodeSiz
10f00 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
10f10 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ..    /* The cur
10f20 72 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65 20 69  rent leaf node i
10f30 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74  s full. Write it
10f40 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
10f50 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20  base. */.    rc 
10f60 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
10f70 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69  nt(p, pWriter->i
10f80 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d  Free++, pWriter-
10f90 3e 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  >aData, nData);.
10fa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10fb0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
10fc0 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  c;..    /* Add t
10fd0 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
10fe0 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  to the interior 
10ff0 6e 6f 64 65 20 74 72 65 65 2e 20 54 68 65 20 74  node tree. The t
11000 65 72 6d 20 61 64 64 65 64 20 74 6f 0a 20 20 20  erm added to.   
11010 20 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72   ** the interior
11020 20 74 72 65 65 20 6d 75 73 74 3a 0a 20 20 20 20   tree must:.    
11030 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62  **.    **   a) b
11040 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  e greater than t
11050 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
11060 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  on the leaf node
11070 20 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20   just written.  
11080 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65    **      to the
11090 20 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c   database (still
110a0 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 57   available in pW
110b0 72 69 74 65 72 2d 3e 7a 54 65 72 6d 29 2c 20 61  riter->zTerm), a
110c0 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  nd.    **.    **
110d0 20 20 20 62 29 20 62 65 20 6c 65 73 73 20 74 68     b) be less th
110e0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
110f0 68 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74 6f  he term about to
11100 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
11110 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20 20   new.    **     
11120 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65 72   leaf node (zTer
11130 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a  m/nTerm)..    **
11140 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72  .    ** In other
11150 20 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74 20   words, it must 
11160 62 65 20 74 68 65 20 70 72 65 66 69 78 20 6f 66  be the prefix of
11170 20 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c 6f   zTerm 1 byte lo
11180 6e 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  nger than.    **
11190 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66   the common pref
111a0 69 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20 7a  ix (if any) of z
111b0 54 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65 72  Term and pWriter
111c0 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a  ->zTerm..    */.
111d0 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65      assert( nPre
111e0 66 69 78 3c 6e 54 65 72 6d 20 29 3b 0a 20 20 20  fix<nTerm );.   
111f0 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64   rc = fts3NodeAd
11200 64 54 65 72 6d 28 70 2c 20 26 70 57 72 69 74 65  dTerm(p, &pWrite
11210 72 2d 3e 70 54 72 65 65 2c 20 69 73 43 6f 70 79  r->pTree, isCopy
11220 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 50 72  Term, zTerm, nPr
11230 65 66 69 78 2b 31 29 3b 0a 20 20 20 20 69 66 28  efix+1);.    if(
11240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11250 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
11260 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   nData = 0;.    
11270 70 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d  pWriter->nTerm =
11280 20 30 3b 0a 0a 20 20 20 20 6e 50 72 65 66 69 78   0;..    nPrefix
11290 20 3d 20 30 3b 0a 20 20 20 20 6e 53 75 66 66 69   = 0;.    nSuffi
112a0 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e  x = nTerm;.    n
112b0 52 65 71 20 3d 20 31 20 2b 20 20 20 20 20 20 20  Req = 1 +       
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74         /* varint
112e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66   containing pref
112f0 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ix size */.     
11300 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
11310 6e 74 4c 65 6e 28 6e 54 65 72 6d 29 20 2b 20 20  ntLen(nTerm) +  
11320 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74         /* varint
11330 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66   containing suff
11340 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ix size */.     
11350 20 6e 54 65 72 6d 20 2b 20 20 20 20 20 20 20 20   nTerm +        
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73         /* Term s
11380 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 73  uffix */.      s
11390 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
113a0 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20  Len(nDoclist) + 
113b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
113c0 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  doclist */.     
113d0 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20   nDoclist;      
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73         /* Doclis
11400 74 20 64 61 74 61 20 2a 2f 0a 20 20 7d 0a 0a 20  t data */.  }.. 
11410 20 2f 2a 20 49 66 20 74 68 65 20 62 75 66 66 65   /* If the buffe
11420 72 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f  r currently allo
11430 63 61 74 65 64 20 69 73 20 74 6f 6f 20 73 6d 61  cated is too sma
11440 6c 6c 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72  ll for this entr
11450 79 2c 20 72 65 61 6c 6c 6f 63 0a 20 20 2a 2a 20  y, realloc.  ** 
11460 74 68 65 20 62 75 66 66 65 72 20 74 6f 20 6d 61  the buffer to ma
11470 6b 65 20 69 74 20 6c 61 72 67 65 20 65 6e 6f 75  ke it large enou
11480 67 68 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  gh..  */.  if( n
11490 52 65 71 3e 70 57 72 69 74 65 72 2d 3e 6e 53 69  Req>pWriter->nSi
114a0 7a 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ze ){.    char *
114b0 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  aNew = sqlite3_r
114c0 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e  ealloc(pWriter->
114d0 61 44 61 74 61 2c 20 6e 52 65 71 29 3b 0a 20 20  aData, nReq);.  
114e0 20 20 69 66 28 20 21 61 4e 65 77 20 29 20 72 65    if( !aNew ) re
114f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11500 4d 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  M;.    pWriter->
11510 61 44 61 74 61 20 3d 20 61 4e 65 77 3b 0a 20 20  aData = aNew;.  
11520 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65    pWriter->nSize
11530 20 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a 20 20 61   = nReq;.  }.  a
11540 73 73 65 72 74 28 20 6e 44 61 74 61 2b 6e 52 65  ssert( nData+nRe
11550 71 3c 3d 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a  q<=pWriter->nSiz
11560 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  e );..  /* Appen
11570 64 20 74 68 65 20 70 72 65 66 69 78 2d 63 6f 6d  d the prefix-com
11580 70 72 65 73 73 65 64 20 74 65 72 6d 20 61 6e 64  pressed term and
11590 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20   doclist to the 
115a0 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20 6e 44 61  buffer. */.  nDa
115b0 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ta += sqlite3Fts
115c0 33 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69  3PutVarint(&pWri
115d0 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ter->aData[nData
115e0 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e  ], nPrefix);.  n
115f0 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46  Data += sqlite3F
11600 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 57  ts3PutVarint(&pW
11610 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61  riter->aData[nDa
11620 74 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20  ta], nSuffix);. 
11630 20 6d 65 6d 63 70 79 28 26 70 57 72 69 74 65 72   memcpy(&pWriter
11640 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
11650 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c  &zTerm[nPrefix],
11660 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 6e 44 61   nSuffix);.  nDa
11670 74 61 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20  ta += nSuffix;. 
11680 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65   nData += sqlite
11690 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
116a0 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e  pWriter->aData[n
116b0 44 61 74 61 5d 2c 20 6e 44 6f 63 6c 69 73 74 29  Data], nDoclist)
116c0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69  ;.  memcpy(&pWri
116d0 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ter->aData[nData
116e0 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  ], aDoclist, nDo
116f0 63 6c 69 73 74 29 3b 0a 20 20 70 57 72 69 74 65  clist);.  pWrite
11700 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61  r->nData = nData
11710 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20   + nDoclist;..  
11720 2f 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  /* Save the curr
11730 65 6e 74 20 74 65 72 6d 20 73 6f 20 74 68 61 74  ent term so that
11740 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 20   it can be used 
11750 74 6f 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65  to prefix-compre
11760 73 73 20 74 68 65 20 6e 65 78 74 2e 0a 20 20 2a  ss the next..  *
11770 2a 20 49 66 20 74 68 65 20 69 73 43 6f 70 79 54  * If the isCopyT
11780 65 72 6d 20 70 61 72 61 6d 65 74 65 72 20 69 73  erm parameter is
11790 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
117a0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
117b0 6f 20 62 79 0a 20 20 2a 2a 20 7a 54 65 72 6d 20  o by.  ** zTerm 
117c0 69 73 20 74 72 61 6e 73 69 65 6e 74 2c 20 73 6f  is transient, so
117d0 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   take a copy of 
117e0 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 20 4f  the term data. O
117f0 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74 0a 20  therwise, just. 
11800 20 2a 2a 20 73 74 6f 72 65 20 61 20 63 6f 70 79   ** store a copy
11810 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2e   of the pointer.
11820 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f  .  */.  if( isCo
11830 70 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66  pyTerm ){.    if
11840 28 20 6e 54 65 72 6d 3e 70 57 72 69 74 65 72 2d  ( nTerm>pWriter-
11850 3e 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >nMalloc ){.    
11860 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73    char *zNew = s
11870 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
11880 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c  Writer->zMalloc,
11890 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20   nTerm*2);.     
118a0 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20   if( !zNew ){.  
118b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
118c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
118d0 20 7d 0a 20 20 20 20 20 20 70 57 72 69 74 65 72   }.      pWriter
118e0 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72  ->nMalloc = nTer
118f0 6d 2a 32 3b 0a 20 20 20 20 20 20 70 57 72 69 74  m*2;.      pWrit
11900 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e  er->zMalloc = zN
11910 65 77 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  ew;.      pWrite
11920 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b  r->zTerm = zNew;
11930 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
11940 74 28 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  t( pWriter->zTer
11950 6d 3d 3d 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c  m==pWriter->zMal
11960 6c 6f 63 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  loc );.    memcp
11970 79 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d  y(pWriter->zTerm
11980 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
11990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
119a0 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28  riter->zTerm = (
119b0 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20  char *)zTerm;.  
119c0 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65  }.  pWriter->nTe
119d0 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 72  rm = nTerm;..  r
119e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
119f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
11a00 61 6c 6c 20 64 61 74 61 20 61 73 73 6f 63 69 61  all data associa
11a10 74 65 64 20 77 69 74 68 20 74 68 65 20 53 65 67  ted with the Seg
11a20 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63  mentWriter objec
11a30 74 20 70 57 72 69 74 65 72 20 74 6f 20 74 68 65  t pWriter to the
11a40 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
11a50 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
11a60 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
11a70 20 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20   all terms have 
11a80 62 65 65 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  been added.** to
11a90 20 74 68 65 20 73 65 67 6d 65 6e 74 20 75 73 69   the segment usi
11aa0 6e 67 20 66 74 73 33 53 65 67 57 72 69 74 65 72  ng fts3SegWriter
11ab0 41 64 64 28 29 2e 20 49 66 20 73 75 63 63 65 73  Add(). If succes
11ac0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
11ad0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
11ae0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
11af0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
11b00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
11b10 74 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73  ts3SegWriterFlus
11b20 68 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  h(.  Fts3Table *
11b30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
11b40 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
11b50 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
11b60 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
11b70 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
11b80 20 20 2f 2a 20 53 65 67 6d 65 6e 74 57 72 69 74    /* SegmentWrit
11b90 65 72 20 74 6f 20 66 6c 75 73 68 20 74 6f 20 74  er to flush to t
11ba0 68 65 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 69  he db */.  int i
11bb0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
11bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
11bd0 6c 75 65 20 66 6f 72 20 27 6c 65 76 65 6c 27 20  lue for 'level' 
11be0 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64  column of %_segd
11bf0 69 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ir */.  int iIdx
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
11c20 20 66 6f 72 20 27 69 64 78 27 20 63 6f 6c 75 6d   for 'idx' colum
11c30 6e 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f  n of %_segdir */
11c40 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c60 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11c70 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 57  code */.  if( pW
11c80 72 69 74 65 72 2d 3e 70 54 72 65 65 20 29 7b 0a  riter->pTree ){.
11c90 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
11ca0 34 20 69 4c 61 73 74 20 3d 20 30 3b 20 20 20 20  4 iLast = 0;    
11cb0 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 62 6c 6f    /* Largest blo
11cc0 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74 6f  ck id written to
11cd0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
11ce0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11cf0 4c 61 73 74 4c 65 61 66 3b 20 20 20 20 20 20 2f  LastLeaf;      /
11d00 2a 20 4c 61 72 67 65 73 74 20 6c 65 61 66 20 62  * Largest leaf b
11d10 6c 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20  lock id written 
11d20 74 6f 20 64 62 20 2a 2f 0a 20 20 20 20 63 68 61  to db */.    cha
11d30 72 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55 4c 4c 3b  r *zRoot = NULL;
11d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
11d50 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
11d60 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20  containing root 
11d70 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  node */.    int 
11d80 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20  nRoot = 0;      
11d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
11da0 65 20 6f 66 20 62 75 66 66 65 72 20 7a 52 6f 6f  e of buffer zRoo
11db0 74 20 2a 2f 0a 0a 20 20 20 20 69 4c 61 73 74 4c  t */..    iLastL
11dc0 65 61 66 20 3d 20 70 57 72 69 74 65 72 2d 3e 69  eaf = pWriter->i
11dd0 46 72 65 65 3b 0a 20 20 20 20 72 63 20 3d 20 66  Free;.    rc = f
11de0 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
11df0 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65  p, pWriter->iFre
11e00 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61 44  e++, pWriter->aD
11e10 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44  ata, pWriter->nD
11e20 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ata);.    if( rc
11e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11e40 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f       rc = fts3No
11e50 64 65 57 72 69 74 65 28 70 2c 20 70 57 72 69 74  deWrite(p, pWrit
11e60 65 72 2d 3e 70 54 72 65 65 2c 20 31 2c 0a 20 20  er->pTree, 1,.  
11e70 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
11e80 3e 69 46 69 72 73 74 2c 20 70 57 72 69 74 65 72  >iFirst, pWriter
11e90 2d 3e 69 46 72 65 65 2c 20 26 69 4c 61 73 74 2c  ->iFree, &iLast,
11ea0 20 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f 6f 74 29   &zRoot, &nRoot)
11eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
11ee0 57 72 69 74 65 53 65 67 64 69 72 28 0a 20 20 20  WriteSegdir(.   
11ef0 20 20 20 20 20 20 20 70 2c 20 69 4c 65 76 65 6c         p, iLevel
11f00 2c 20 69 49 64 78 2c 20 70 57 72 69 74 65 72 2d  , iIdx, pWriter-
11f10 3e 69 46 69 72 73 74 2c 20 69 4c 61 73 74 4c 65  >iFirst, iLastLe
11f20 61 66 2c 20 69 4c 61 73 74 2c 20 7a 52 6f 6f 74  af, iLast, zRoot
11f30 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a  , nRoot);.    }.
11f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11f50 54 68 65 20 65 6e 74 69 72 65 20 74 72 65 65 20  The entire tree 
11f60 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74  fits on the root
11f70 20 6e 6f 64 65 2e 20 57 72 69 74 65 20 69 74 20   node. Write it 
11f80 74 6f 20 74 68 65 20 73 65 67 64 69 72 20 74 61  to the segdir ta
11f90 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ble. */.    rc =
11fa0 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72   fts3WriteSegdir
11fb0 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c 65  (.        p, iLe
11fc0 76 65 6c 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c  vel, iIdx, 0, 0,
11fd0 20 30 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61   0, pWriter->aDa
11fe0 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  ta, pWriter->nDa
11ff0 74 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ta);.  }.  retur
12000 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
12010 65 6c 65 61 73 65 20 61 6c 6c 20 6d 65 6d 6f 72  elease all memor
12020 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 53 65  y held by the Se
12030 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65  gmentWriter obje
12040 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
12050 20 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d   .** first argum
12060 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
12070 6f 69 64 20 66 74 73 33 53 65 67 57 72 69 74 65  oid fts3SegWrite
12080 72 46 72 65 65 28 53 65 67 6d 65 6e 74 57 72 69  rFree(SegmentWri
12090 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
120a0 20 69 66 28 20 70 57 72 69 74 65 72 20 29 7b 0a   if( pWriter ){.
120b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
120c0 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 29  (pWriter->aData)
120d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
120e0 65 65 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c  ee(pWriter->zMal
120f0 6c 6f 63 29 3b 0a 20 20 20 20 66 74 73 33 4e 6f  loc);.    fts3No
12100 64 65 46 72 65 65 28 70 57 72 69 74 65 72 2d 3e  deFree(pWriter->
12110 70 54 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  pTree);.    sqli
12120 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
12130 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12140 54 68 65 20 66 69 72 73 74 20 76 61 6c 75 65 20  The first value 
12150 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61  in the apVal[] a
12160 72 72 61 79 20 69 73 20 61 73 73 75 6d 65 64 20  rray is assumed 
12170 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e  to contain an in
12180 74 65 67 65 72 2e 0a 2a 2a 20 54 68 69 73 20 66  teger..** This f
12190 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
121a0 20 74 68 65 72 65 20 65 78 69 73 74 20 61 6e 79   there exist any
121b0 20 64 6f 63 75 6d 65 6e 74 73 20 77 69 74 68 20   documents with 
121c0 64 6f 63 69 64 20 76 61 6c 75 65 73 20 74 68 61  docid values tha
121d0 74 0a 2a 2a 20 61 72 65 20 64 69 66 66 65 72 65  t.** are differe
121e0 6e 74 20 66 72 6f 6d 20 74 68 61 74 20 69 6e 74  nt from that int
121f0 65 67 65 72 2e 20 69 2e 65 2e 20 69 66 20 64 65  eger. i.e. if de
12200 6c 65 74 69 6e 67 20 74 68 65 20 64 6f 63 75 6d  leting the docum
12210 65 6e 74 20 77 69 74 68 20 64 6f 63 69 64 0a 2a  ent with docid.*
12220 2a 20 70 52 6f 77 69 64 20 77 6f 75 6c 64 20 6d  * pRowid would m
12230 65 61 6e 20 74 68 65 20 46 54 53 33 20 74 61 62  ean the FTS3 tab
12240 6c 65 20 77 65 72 65 20 65 6d 70 74 79 2e 0a 2a  le were empty..*
12250 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
12260 75 6c 2c 20 2a 70 69 73 45 6d 70 74 79 20 69 73  ul, *pisEmpty is
12270 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
12280 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
12290 74 79 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a  ty except for.**
122a0 20 64 6f 63 75 6d 65 6e 74 20 70 52 6f 77 69 64   document pRowid
122b0 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
122c0 77 69 73 65 2c 20 61 6e 64 20 53 51 4c 49 54 45  wise, and SQLITE
122d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
122e0 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   If an.** error 
122f0 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
12300 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
12310 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
12320 74 69 63 20 69 6e 74 20 66 74 73 33 49 73 45 6d  tic int fts3IsEm
12330 70 74 79 28 46 74 73 33 54 61 62 6c 65 20 2a 70  pty(Fts3Table *p
12340 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
12350 2a 70 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69  *pRowid, int *pi
12360 73 45 6d 70 74 79 29 7b 0a 20 20 73 71 6c 69 74  sEmpty){.  sqlit
12370 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
12380 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
12390 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 29  p->zContentTbl )
123a0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69 6e  {.    /* If usin
123b0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78  g the content=xx
123c0 78 20 6f 70 74 69 6f 6e 2c 20 61 73 73 75 6d 65  x option, assume
123d0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 65   the table is ne
123e0 76 65 72 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20  ver empty */.   
123f0 20 2a 70 69 73 45 6d 70 74 79 20 3d 20 30 3b 0a   *pisEmpty = 0;.
12400 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12410 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
12420 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
12430 74 28 70 2c 20 53 51 4c 5f 49 53 5f 45 4d 50 54  t(p, SQL_IS_EMPT
12440 59 2c 20 26 70 53 74 6d 74 2c 20 26 70 52 6f 77  Y, &pStmt, &pRow
12450 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  id);.    if( rc=
12460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12470 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
12480 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
12490 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
124a0 20 20 20 2a 70 69 73 45 6d 70 74 79 20 3d 20 73     *pisEmpty = s
124b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
124c0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
124d0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
124e0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
124f0 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tmt);.    }.  }.
12500 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12510 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e 4d 61 78  /*.** Set *pnMax
12520 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20   to the largest 
12530 73 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20 69 6e  segment level in
12540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
12550 72 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69  r the index.** i
12560 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65 67  Index..**.** Seg
12570 6d 65 6e 74 20 6c 65 76 65 6c 73 20 61 72 65 20  ment levels are 
12580 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 27 6c  stored in the 'l
12590 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel' column of 
125a0 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
125b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
125c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
125d0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
125e0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
125f0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
12600 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d  tic int fts3Segm
12610 65 6e 74 4d 61 78 4c 65 76 65 6c 28 46 74 73 33  entMaxLevel(Fts3
12620 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 49  Table *p, int iI
12630 6e 64 65 78 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  ndex, int *pnMax
12640 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
12650 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
12660 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49  rc;.  assert( iI
12670 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65  ndex>=0 && iInde
12680 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a  x<p->nIndex );..
12690 20 20 2f 2a 20 53 65 74 20 70 53 74 6d 74 20 74    /* Set pStmt t
126a0 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 76  o the compiled v
126b0 65 72 73 69 6f 6e 20 6f 66 3a 0a 20 20 2a 2a 0a  ersion of:.  **.
126c0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
126d0 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25 51  x(level) FROM %Q
126e0 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
126f0 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e  RE level BETWEEN
12700 20 3f 20 41 4e 44 20 3f 0a 20 20 2a 2a 0a 20 20   ? AND ?.  **.  
12710 2a 2a 20 28 31 30 32 34 20 69 73 20 61 63 74 75  ** (1024 is actu
12720 61 6c 6c 79 20 74 68 65 20 76 61 6c 75 65 20 6f  ally the value o
12730 66 20 6d 61 63 72 6f 20 46 54 53 33 5f 53 45 47  f macro FTS3_SEG
12740 44 49 52 5f 50 52 45 46 49 58 4c 45 56 45 4c 5f  DIR_PREFIXLEVEL_
12750 53 54 52 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  STR)..  */.  rc 
12760 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
12770 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44   SQL_SELECT_SEGD
12780 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 2c 20 26 70  IR_MAX_LEVEL, &p
12790 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
127a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
127b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 73 71 6c  return rc;.  sql
127c0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
127d0 74 6d 74 2c 20 31 2c 20 69 49 6e 64 65 78 2a 46  tmt, 1, iIndex*F
127e0 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
127f0 56 45 4c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  VEL);.  sqlite3_
12800 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
12810 32 2c 20 28 69 49 6e 64 65 78 2b 31 29 2a 46 54  2, (iIndex+1)*FT
12820 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
12830 45 4c 20 2d 20 31 29 3b 0a 20 20 69 66 28 20 53  EL - 1);.  if( S
12840 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
12850 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
12860 7b 0a 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73  {.    *pnMax = s
12870 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12880 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
12890 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
128a0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
128b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
128c0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
128d0 66 74 65 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c  fter merging mul
128e0 74 69 70 6c 65 20 73 65 67 6d 65 6e 74 73 20 69  tiple segments i
128f0 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72  nto a single lar
12900 67 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f  ge.** segment to
12910 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c   delete the old,
12920 20 6e 6f 77 20 72 65 64 75 6e 64 61 6e 74 2c 20   now redundant, 
12930 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e  segment b-trees.
12940 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a   Specifically,.*
12950 2a 20 69 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31  * it:.** .**   1
12960 29 20 44 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f  ) Deletes all %_
12970 73 65 67 6d 65 6e 74 73 20 65 6e 74 72 69 65 73  segments entries
12980 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74   for the segment
12990 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
129a0 68 20 0a 2a 2a 20 20 20 20 20 20 65 61 63 68 20  h .**      each 
129b0 6f 66 20 74 68 65 20 53 65 67 52 65 61 64 65 72  of the SegReader
129c0 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
129d0 61 72 72 61 79 20 70 61 73 73 65 64 20 61 73 20  array passed as 
129e0 74 68 65 20 74 68 69 72 64 20 0a 2a 2a 20 20 20  the third .**   
129f0 20 20 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64     argument, and
12a00 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65  .**.**   2) dele
12a10 74 65 73 20 61 6c 6c 20 25 5f 73 65 67 64 69 72  tes all %_segdir
12a20 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 6c 65   entries with le
12a30 76 65 6c 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61  vel iLevel, or a
12a40 6c 6c 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20  ll %_segdir.**  
12a50 20 20 20 20 65 6e 74 72 69 65 73 20 72 65 67 61      entries rega
12a60 72 64 6c 65 73 73 20 6f 66 20 6c 65 76 65 6c 20  rdless of level 
12a70 69 66 20 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a  if (iLevel<0)..*
12a80 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
12a90 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
12aa0 63 63 65 73 73 66 75 6c 2c 20 6f 74 68 65 72 77  ccessful, otherw
12ab0 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
12ac0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
12ad0 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65  tic int fts3Dele
12ae0 74 65 53 65 67 64 69 72 28 0a 20 20 46 74 73 33  teSegdir(.  Fts3
12af0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
12b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
12b10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
12b20 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61  dle */.  int iLa
12b30 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ngid,           
12b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67           /* Lang
12b50 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74  uage id */.  int
12b60 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20   iIndex,        
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b80 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e  Index for p->aIn
12b90 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  dex */.  int iLe
12ba0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
12bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
12bc0 6c 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e  l of %_segdir en
12bd0 74 72 69 65 73 20 74 6f 20 64 65 6c 65 74 65 20  tries to delete 
12be0 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
12bf0 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20  er **apSegment, 
12c00 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
12c10 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63   SegReader objec
12c20 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ts */.  int nRea
12c30 64 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  der             
12c40 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
12c50 6f 66 20 61 72 72 61 79 20 61 70 53 65 67 6d 65  of array apSegme
12c60 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
12c70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12c90 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
12ca0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12cc0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
12cd0 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
12ce0 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20  _stmt *pDelete; 
12cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
12d00 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c  statement to del
12d10 65 74 65 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 72  ete rows */..  r
12d20 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
12d30 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
12d40 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70  GMENTS_RANGE, &p
12d50 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 66 6f  Delete, 0);.  fo
12d60 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
12d70 45 5f 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64 65  E_OK && i<nReade
12d80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  r; i++){.    Fts
12d90 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
12da0 6d 65 6e 74 20 3d 20 61 70 53 65 67 6d 65 6e 74  ment = apSegment
12db0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65  [i];.    if( pSe
12dc0 67 6d 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c 6f  gment->iStartBlo
12dd0 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck ){.      sqli
12de0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
12df0 44 65 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 6d  Delete, 1, pSegm
12e00 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b  ent->iStartBlock
12e10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12e20 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
12e30 65 74 65 2c 20 32 2c 20 70 53 65 67 6d 65 6e 74  ete, 2, pSegment
12e40 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20  ->iEndBlock);.  
12e50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
12e60 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  (pDelete);.     
12e70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
12e80 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  set(pDelete);.  
12e90 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
12ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12eb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12ec0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  }..  assert( iLe
12ed0 76 65 6c 3e 3d 30 20 7c 7c 20 69 4c 65 76 65 6c  vel>=0 || iLevel
12ee0 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
12ef0 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 69 4c  _ALL );.  if( iL
12f00 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
12f10 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  RSOR_ALL ){.    
12f20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
12f30 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
12f40 45 47 44 49 52 5f 52 41 4e 47 45 2c 20 26 70 44  EGDIR_RANGE, &pD
12f50 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69  elete, 0);.    i
12f60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12f70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12f80 33 5f 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65  3_bind_int(pDele
12f90 74 65 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75  te, 1, getAbsolu
12fa0 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
12fb0 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b  id, iIndex, 0));
12fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
12fd0 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c  ind_int(pDelete,
12fe0 20 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20 67   2, .          g
12ff0 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28  etAbsoluteLevel(
13000 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
13010 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f  ex, FTS3_SEGDIR_
13020 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20 20  MAXLEVEL-1).    
13030 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c    );.    }.  }el
13040 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  se{.    rc = fts
13050 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
13060 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45  DELETE_SEGDIR_LE
13070 56 45 4c 2c 20 26 70 44 65 6c 65 74 65 2c 20 30  VEL, &pDelete, 0
13080 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
13090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
130a0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
130b0 6e 74 28 70 44 65 6c 65 74 65 2c 20 31 2c 20 67  nt(pDelete, 1, g
130c0 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28  etAbsoluteLevel(
130d0 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
130e0 65 78 2c 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20  ex,iLevel));.   
130f0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
13100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13110 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
13120 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 72 63  pDelete);.    rc
13130 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
13140 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a  (pDelete);.  }..
13150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13160 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
13170 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13180 65 64 2c 20 62 75 66 66 65 72 20 2a 70 70 4c 69  ed, buffer *ppLi
13190 73 74 20 28 73 69 7a 65 20 2a 70 6e 4c 69 73 74  st (size *pnList
131a0 20 62 79 74 65 73 29 20 63 6f 6e 74 61 69 6e 73   bytes) contains
131b0 20 0a 2a 2a 20 61 20 70 6f 73 69 74 69 6f 6e 20   .** a position 
131c0 6c 69 73 74 20 74 68 61 74 20 6d 61 79 20 28 6f  list that may (o
131d0 72 20 6d 61 79 20 6e 6f 74 29 20 66 65 61 74 75  r may not) featu
131e0 72 65 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75  re multiple colu
131f0 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  mns. This.** fun
13200 63 74 69 6f 6e 20 61 64 6a 75 73 74 73 20 74 68  ction adjusts th
13210 65 20 70 6f 69 6e 74 65 72 20 2a 70 70 4c 69 73  e pointer *ppLis
13220 74 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  t and the length
13230 20 2a 70 6e 4c 69 73 74 20 73 6f 20 74 68 61 74   *pnList so that
13240 20 74 68 65 79 0a 2a 2a 20 69 64 65 6e 74 69 66   they.** identif
13250 79 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  y the subset of 
13260 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
13270 74 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  t that correspon
13280 64 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 69 43 6f  ds to column iCo
13290 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  l..**.** If ther
132a0 65 20 61 72 65 20 6e 6f 20 65 6e 74 72 69 65 73  e are no entries
132b0 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 70 6f   in the input po
132c0 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  sition list for 
132d0 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65  column iCol, the
132e0 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74 20 69 73 20  n.** *pnList is 
132f0 73 65 74 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f  set to zero befo
13300 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
13310 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
13320 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20  3ColumnFilter(. 
13330 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69   /* Column to fi
13360 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 68 61  lter on */.  cha
13370 72 20 2a 2a 70 70 4c 69 73 74 2c 20 20 20 20 20  r **ppList,     
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13390 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  IN/OUT: Pointer 
133a0 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  to position list
133b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73   */.  int *pnLis
133c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
133d0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
133e0 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
133f0 2a 70 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73  *ppList in bytes
13400 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
13410 4c 69 73 74 20 3d 20 2a 70 70 4c 69 73 74 3b 0a  List = *ppList;.
13420 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 2a 70    int nList = *p
13430 6e 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70  nList;.  char *p
13440 45 6e 64 20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69  End = &pList[nLi
13450 73 74 5d 3b 0a 20 20 69 6e 74 20 69 43 75 72 72  st];.  int iCurr
13460 65 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ent = 0;.  char 
13470 2a 70 20 3d 20 70 4c 69 73 74 3b 0a 0a 20 20 61  *p = pList;..  a
13480 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
13490 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
134a0 20 20 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a      char c = 0;.
134b0 20 20 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e      while( p<pEn
134c0 64 20 26 26 20 28 63 20 7c 20 2a 70 29 26 30 78  d && (c | *p)&0x
134d0 46 45 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20  FE ) c = *p++ & 
134e0 30 78 38 30 3b 0a 20 20 0a 20 20 20 20 69 66 28  0x80;.  .    if(
134f0 20 69 43 6f 6c 3d 3d 69 43 75 72 72 65 6e 74 20   iCol==iCurrent 
13500 29 7b 0a 20 20 20 20 20 20 6e 4c 69 73 74 20 3d  ){.      nList =
13510 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69 73 74   (int)(p - pList
13520 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13530 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 69 73 74      }..    nList
13540 20 2d 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c   -= (int)(p - pL
13550 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ist);.    pList 
13560 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 6e 4c 69  = p;.    if( nLi
13570 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  st==0 ){.      b
13580 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13590 70 20 3d 20 26 70 4c 69 73 74 5b 31 5d 3b 0a 20  p = &pList[1];. 
135a0 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33 46     p += sqlite3F
135b0 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
135c0 2c 20 26 69 43 75 72 72 65 6e 74 29 3b 0a 20 20  , &iCurrent);.  
135d0 7d 0a 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20 70  }..  *ppList = p
135e0 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74 20  List;.  *pnList 
135f0 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nList;.}../*.*
13600 2a 20 43 61 63 68 65 20 64 61 74 61 20 69 6e 20  * Cache data in 
13610 74 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67  the Fts3MultiSeg
13620 52 65 61 64 65 72 2e 61 42 75 66 66 65 72 5b 5d  Reader.aBuffer[]
13630 20 62 75 66 66 65 72 20 28 6f 76 65 72 77 72 69   buffer (overwri
13640 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 65 78 69 73  ting any.** exis
13650 74 69 6e 67 20 64 61 74 61 29 2e 20 47 72 6f 77  ting data). Grow
13660 20 74 68 65 20 62 75 66 66 65 72 20 69 66 20 72   the buffer if r
13670 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
13680 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
13690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
136a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
136b0 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
136c0 63 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 74 72 79  countered.** try
136d0 69 6e 67 20 74 6f 20 72 65 73 69 7a 65 20 74 68  ing to resize th
136e0 65 20 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  e buffer, return
136f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
13700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
13710 33 4d 73 72 42 75 66 66 65 72 44 61 74 61 28 0a  3MsrBufferData(.
13720 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
13730 61 64 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20  ader *pMsr,     
13740 20 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65    /* Multi-segme
13750 6e 74 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65  nt-reader handle
13760 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69 73   */.  char *pLis
13770 74 2c 0a 20 20 69 6e 74 20 6e 4c 69 73 74 0a 29  t,.  int nList.)
13780 7b 0a 20 20 69 66 28 20 6e 4c 69 73 74 3e 70 4d  {.  if( nList>pM
13790 73 72 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20  sr->nBuffer ){. 
137a0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a 20     char *pNew;. 
137b0 20 20 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72     pMsr->nBuffer
137c0 20 3d 20 6e 4c 69 73 74 2a 32 3b 0a 20 20 20 20   = nList*2;.    
137d0 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
137e0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
137f0 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 4d  Msr->aBuffer, pM
13800 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20 20  sr->nBuffer);.  
13810 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 65    if( !pNew ) re
13820 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13830 4d 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 61 42 75  M;.    pMsr->aBu
13840 66 66 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  ffer = pNew;.  }
13850 0a 0a 20 20 6d 65 6d 63 70 79 28 70 4d 73 72 2d  ..  memcpy(pMsr-
13860 3e 61 42 75 66 66 65 72 2c 20 70 4c 69 73 74 2c  >aBuffer, pList,
13870 20 6e 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   nList);.  retur
13880 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13890 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
138a0 73 72 49 6e 63 72 4e 65 78 74 28 0a 20 20 46 74  srIncrNext(.  Ft
138b0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
138d0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
138e0 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d  andle */.  Fts3M
138f0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
13900 4d 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75  Msr,       /* Mu
13910 6c 74 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64  lti-segment-read
13920 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  er handle */.  s
13930 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
13940 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 2f  Docid,         /
13950 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20 76 61 6c  * OUT: Docid val
13960 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ue */.  char **p
13970 61 50 6f 73 6c 69 73 74 2c 20 20 20 20 20 20 20  aPoslist,       
13980 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
13990 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74  Pointer to posit
139a0 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ion list */.  in
139b0 74 20 2a 70 6e 50 6f 73 6c 69 73 74 20 20 20 20  t *pnPoslist    
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
139d0 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f   OUT: Size of po
139e0 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62  sition list in b
139f0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
13a00 20 6e 4d 65 72 67 65 20 3d 20 70 4d 73 72 2d 3e   nMerge = pMsr->
13a10 6e 41 64 76 61 6e 63 65 3b 0a 20 20 46 74 73 33  nAdvance;.  Fts3
13a20 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65  SegReader **apSe
13a30 67 6d 65 6e 74 20 3d 20 70 4d 73 72 2d 3e 61 70  gment = pMsr->ap
13a40 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28  Segment;.  int (
13a50 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65  *xCmp)(Fts3SegRe
13a60 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52  ader *, Fts3SegR
13a70 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20  eader *) = (.   
13a80 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66   p->bDescIdx ? f
13a90 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
13aa0 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33  istCmpRev : fts3
13ab0 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
13ac0 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  Cmp.  );..  if( 
13ad0 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  nMerge==0 ){.   
13ae0 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b   *paPoslist = 0;
13af0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13b00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77 68  TE_OK;.  }..  wh
13b10 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 46 74  ile( 1 ){.    Ft
13b20 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
13b30 67 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 70 4d  g;.    pSeg = pM
13b40 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 30 5d  sr->apSegment[0]
13b50 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ;..    if( pSeg-
13b60 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 20  >pOffsetList==0 
13b70 29 7b 0a 20 20 20 20 20 20 2a 70 61 50 6f 73 6c  ){.      *paPosl
13b80 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  ist = 0;.      b
13b90 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
13ba0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
13bb0 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74       char *pList
13bc0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73  ;.      int nLis
13bd0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  t;.      int j;.
13be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
13bf0 74 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53  t64 iDocid = apS
13c00 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69  egment[0]->iDoci
13c10 64 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66  d;..      rc = f
13c20 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
13c30 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65  Docid(p, apSegme
13c40 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26  nt[0], &pList, &
13c50 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 6a 20  nList);.      j 
13c60 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 1;.      while
13c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13c80 0a 20 20 20 20 20 20 20 20 26 26 20 6a 3c 6e 4d  .        && j<nM
13c90 65 72 67 65 0a 20 20 20 20 20 20 20 20 26 26 20  erge.        && 
13ca0 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f  apSegment[j]->pO
13cb0 66 66 73 65 74 4c 69 73 74 0a 20 20 20 20 20 20  ffsetList.      
13cc0 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a    && apSegment[j
13cd0 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69  ]->iDocid==iDoci
13ce0 64 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  d.      ){.     
13cf0 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
13d00 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70  eaderNextDocid(p
13d10 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20  , apSegment[j], 
13d20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  0, 0);.        j
13d30 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
13d40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13d50 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
13d60 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65  .      fts3SegRe
13d70 61 64 65 72 53 6f 72 74 28 70 4d 73 72 2d 3e 61  aderSort(pMsr->a
13d80 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65  pSegment, nMerge
13d90 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 20  , j, xCmp);..   
13da0 20 20 20 69 66 28 20 70 4d 73 72 2d 3e 69 43 6f     if( pMsr->iCo
13db0 6c 46 69 6c 74 65 72 3e 3d 30 20 29 7b 0a 20 20  lFilter>=0 ){.  
13dc0 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e        fts3Column
13dd0 46 69 6c 74 65 72 28 70 4d 73 72 2d 3e 69 43 6f  Filter(pMsr->iCo
13de0 6c 46 69 6c 74 65 72 2c 20 26 70 4c 69 73 74 2c  lFilter, &pList,
13df0 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
13e00 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 69  }..      if( nLi
13e10 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  st>0 ){.        
13e20 69 66 28 20 66 74 73 33 53 65 67 52 65 61 64 65  if( fts3SegReade
13e30 72 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67  rIsPending(apSeg
13e40 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ment[0]) ){.    
13e50 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4d        rc = fts3M
13e60 73 72 42 75 66 66 65 72 44 61 74 61 28 70 4d 73  srBufferData(pMs
13e70 72 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2b  r, pList, nList+
13e80 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
13e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13ea0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13eb0 20 20 20 20 20 20 20 2a 70 61 50 6f 73 6c 69 73         *paPoslis
13ec0 74 20 3d 20 70 4d 73 72 2d 3e 61 42 75 66 66 65  t = pMsr->aBuffe
13ed0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  r;.          ass
13ee0 65 72 74 28 20 28 70 4d 73 72 2d 3e 61 42 75 66  ert( (pMsr->aBuf
13ef0 66 65 72 5b 6e 4c 69 73 74 5d 20 26 20 30 78 46  fer[nList] & 0xF
13f00 45 29 3d 3d 30 78 30 30 20 29 3b 0a 20 20 20 20  E)==0x00 );.    
13f10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13f20 20 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20       *paPoslist 
13f30 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
13f40 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 44 6f   }.        *piDo
13f50 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20  cid = iDocid;.  
13f60 20 20 20 20 20 20 2a 70 6e 50 6f 73 6c 69 73 74        *pnPoslist
13f70 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
13f80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
13f90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
13fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13fb0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
13fc0 73 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74  s3SegReaderStart
13fd0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
13fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13ff0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
14000 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
14010 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
14020 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  der *pCsr,      
14030 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63   /* Cursor objec
14040 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
14050 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
14060 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73         /* Term s
14070 65 61 72 63 68 65 64 20 66 6f 72 20 28 6f 72 20  earched for (or 
14080 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  NULL) */.  int n
14090 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
140a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
140b0 6e 67 74 68 20 6f 66 20 7a 54 65 72 6d 20 69 6e  ngth of zTerm in
140c0 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
140d0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53 65 67  nt i;.  int nSeg
140e0 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e   = pCsr->nSegmen
140f0 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
14100 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 64 65  Fts3SegFilter de
14110 66 69 6e 65 73 20 61 20 73 70 65 63 69 66 69 63  fines a specific
14120 20 74 65 72 6d 20 28 6f 72 20 74 65 72 6d 20 70   term (or term p
14130 72 65 66 69 78 29 20 74 6f 20 73 65 61 72 63 68  refix) to search
14140 20 0a 20 20 2a 2a 20 66 6f 72 2c 20 74 68 65 6e   .  ** for, then
14150 20 61 64 76 61 6e 63 65 20 65 61 63 68 20 73 65   advance each se
14160 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75  gment iterator u
14170 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
14180 6f 20 61 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  o a term of.  **
14190 20 65 71 75 61 6c 20 6f 72 20 67 72 65 61 74 65   equal or greate
141a0 72 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  r value than the
141b0 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e   specified term.
141c0 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 6d   This prevents m
141d0 61 6e 79 0a 20 20 2a 2a 20 75 6e 6e 65 63 65 73  any.  ** unneces
141e0 73 61 72 79 20 6d 65 72 67 65 2f 73 6f 72 74 20  sary merge/sort 
141f0 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 74  operations for t
14200 68 65 20 63 61 73 65 20 77 68 65 72 65 20 73 69  he case where si
14210 6e 67 6c 65 20 73 65 67 6d 65 6e 74 0a 20 20 2a  ngle segment.  *
14220 2a 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f  * b-tree leaf no
14230 64 65 73 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65  des contain more
14240 20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a   than one term..
14250 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
14260 70 43 73 72 2d 3e 62 52 65 73 74 61 72 74 3d 3d  pCsr->bRestart==
14270 30 20 26 26 20 69 3c 70 43 73 72 2d 3e 6e 53 65  0 && i<pCsr->nSe
14280 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  gment; i++){.   
14290 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
142a0 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
142b0 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70  *pSeg = pCsr->ap
142c0 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20  Segment[i];.    
142d0 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  do {.      int r
142e0 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
142f0 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30  rNext(p, pSeg, 0
14300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
14320 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 77 68 69  urn rc;.    }whi
14330 6c 65 28 20 7a 54 65 72 6d 20 26 26 20 28 72 65  le( zTerm && (re
14340 73 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  s = fts3SegReade
14350 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a  rTermCmp(pSeg, z
14360 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 3c 30 20  Term, nTerm))<0 
14370 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67  );..    if( pSeg
14380 2d 3e 62 4c 6f 6f 6b 75 70 20 26 26 20 72 65 73  ->bLookup && res
14390 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  !=0 ){.      fts
143a0 33 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66  3SegReaderSetEof
143b0 28 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20  (pSeg);.    }.  
143c0 7d 0a 20 20 66 74 73 33 53 65 67 52 65 61 64 65  }.  fts3SegReade
143d0 72 53 6f 72 74 28 70 43 73 72 2d 3e 61 70 53 65  rSort(pCsr->apSe
143e0 67 6d 65 6e 74 2c 20 6e 53 65 67 2c 20 6e 53 65  gment, nSeg, nSe
143f0 67 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72  g, fts3SegReader
14400 43 6d 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Cmp);..  return 
14410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
14420 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
14430 52 65 61 64 65 72 53 74 61 72 74 28 0a 20 20 46  ReaderStart(.  F
14440 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14460 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
14470 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
14480 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
14490 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43  pCsr,       /* C
144a0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
144b0 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20    Fts3SegFilter 
144c0 2a 70 46 69 6c 74 65 72 20 20 20 20 20 20 20 20  *pFilter        
144d0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
144e0 73 20 6f 6e 20 72 61 6e 67 65 20 6f 66 20 69 74  s on range of it
144f0 65 72 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  eration */.){.  
14500 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 20 3d 20  pCsr->pFilter = 
14510 70 46 69 6c 74 65 72 3b 0a 20 20 72 65 74 75 72  pFilter;.  retur
14520 6e 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53  n fts3SegReaderS
14530 74 61 72 74 28 70 2c 20 70 43 73 72 2c 20 70 46  tart(p, pCsr, pF
14540 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46  ilter->zTerm, pF
14550 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 3b 0a 7d  ilter->nTerm);.}
14560 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
14570 33 4d 73 72 49 6e 63 72 53 74 61 72 74 28 0a 20  3MsrIncrStart(. 
14580 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
145b0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
145c0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
145d0 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a   *pCsr,       /*
145e0 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   Cursor object *
145f0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
14620 20 6d 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20 20   match on. */.  
14630 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
14640 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
14650 2f 2a 20 54 65 72 6d 20 74 6f 20 69 74 65 72 61  /* Term to itera
14660 74 65 20 74 68 72 6f 75 67 68 20 61 20 64 6f 63  te through a doc
14670 6c 69 73 74 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  list for */.  in
14680 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20  t nTerm         
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
146a0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
146b0 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a   in zTerm */.){.
146c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
146d0 63 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  c;.  int nSegmen
146e0 74 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65  t = pCsr->nSegme
146f0 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70  nt;.  int (*xCmp
14700 29 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  )(Fts3SegReader 
14710 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  *, Fts3SegReader
14720 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62   *) = (.    p->b
14730 44 65 73 63 49 64 78 20 3f 20 66 74 73 33 53 65  DescIdx ? fts3Se
14740 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
14750 70 52 65 76 20 3a 20 66 74 73 33 53 65 67 52 65  pRev : fts3SegRe
14760 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20  aderDoclistCmp. 
14770 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
14780 43 73 72 2d 3e 70 46 69 6c 74 65 72 3d 3d 30 20  Csr->pFilter==0 
14790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 65  );.  assert( zTe
147a0 72 6d 20 26 26 20 6e 54 65 72 6d 3e 30 20 29 3b  rm && nTerm>0 );
147b0 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65  ..  /* Advance e
147c0 61 63 68 20 73 65 67 6d 65 6e 74 20 69 74 65 72  ach segment iter
147d0 61 74 6f 72 20 75 6e 74 69 6c 20 69 74 20 70 6f  ator until it po
147e0 69 6e 74 73 20 74 6f 20 74 68 65 20 74 65 72 6d  ints to the term
147f0 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f   zTerm/nTerm. */
14800 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52  .  rc = fts3SegR
14810 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70 43  eaderStart(p, pC
14820 73 72 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  sr, zTerm, nTerm
14830 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14840 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
14850 72 63 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d  rc;..  /* Determ
14860 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 6f 66 20  ine how many of 
14870 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 63 74  the segments act
14880 75 61 6c 6c 79 20 70 6f 69 6e 74 20 74 6f 20 7a  ually point to z
14890 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20  Term/nTerm. */. 
148a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67   for(i=0; i<nSeg
148b0 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ment; i++){.    
148c0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
148d0 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65  Seg = pCsr->apSe
148e0 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  gment[i];.    if
148f0 28 20 21 70 53 65 67 2d 3e 61 4e 6f 64 65 20 7c  ( !pSeg->aNode |
14900 7c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 54  | fts3SegReaderT
14910 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65  ermCmp(pSeg, zTe
14920 72 6d 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20  rm, nTerm) ){.  
14930 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14940 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 6e 41 64  .  }.  pCsr->nAd
14950 76 61 6e 63 65 20 3d 20 69 3b 0a 0a 20 20 2f 2a  vance = i;..  /*
14960 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6f 66   Advance each of
14970 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 74 6f   the segments to
14980 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
14990 72 73 74 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20  rst docid. */.  
149a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
149b0 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b  >nAdvance; i++){
149c0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
149d0 67 52 65 61 64 65 72 46 69 72 73 74 44 6f 63 69  gReaderFirstDoci
149e0 64 28 70 2c 20 70 43 73 72 2d 3e 61 70 53 65 67  d(p, pCsr->apSeg
149f0 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66  ment[i]);.    if
14a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14a10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
14a20 0a 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72  .  fts3SegReader
14a30 53 6f 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67  Sort(pCsr->apSeg
14a40 6d 65 6e 74 2c 20 69 2c 20 69 2c 20 78 43 6d 70  ment, i, i, xCmp
14a50 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43  );..  assert( iC
14a60 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3c 70 2d 3e  ol<0 || iCol<p->
14a70 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70 43 73  nColumn );.  pCs
14a80 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72 20 3d 20  r->iColFilter = 
14a90 69 43 6f 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20  iCol;..  return 
14aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14ab0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
14ac0 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61  n is called on a
14ad0 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20   MultiSegReader 
14ae0 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 73 74  that has been st
14af0 61 72 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  arted using.** s
14b00 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63  qlite3Fts3MsrInc
14b10 72 53 74 61 72 74 28 29 2e 20 4f 6e 65 20 6f 72  rStart(). One or
14b20 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 4d   more calls to M
14b30 73 72 49 6e 63 72 4e 65 78 74 28 29 20 6d 61 79  srIncrNext() may
14b40 20 61 6c 73 6f 0a 2a 2a 20 68 61 76 65 20 62 65   also.** have be
14b50 65 6e 20 6d 61 64 65 2e 20 43 61 6c 6c 69 6e 67  en made. Calling
14b60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   this function p
14b70 75 74 73 20 74 68 65 20 4d 75 6c 74 69 53 65 67  uts the MultiSeg
14b80 52 65 61 64 65 72 20 69 6e 20 73 75 63 68 0a 2a  Reader in such.*
14b90 2a 20 61 20 73 74 61 74 65 20 74 68 61 74 20 69  * a state that i
14ba0 66 20 74 68 65 20 6e 65 78 74 20 74 77 6f 20 63  f the next two c
14bb0 61 6c 6c 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  alls are:.**.** 
14bc0 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
14bd0 52 65 61 64 65 72 53 74 61 72 74 28 29 0a 2a 2a  ReaderStart().**
14be0 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65     sqlite3Fts3Se
14bf0 67 52 65 61 64 65 72 53 74 65 70 28 29 0a 2a 2a  gReaderStep().**
14c00 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 65 6e 74  .** then the ent
14c10 69 72 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  ire doclist for 
14c20 74 68 65 20 74 65 72 6d 20 69 73 20 61 76 61 69  the term is avai
14c30 6c 61 62 6c 65 20 69 6e 20 0a 2a 2a 20 4d 75 6c  lable in .** Mul
14c40 74 69 53 65 67 52 65 61 64 65 72 2e 61 44 6f 63  tiSegReader.aDoc
14c50 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 0a 2a  list/nDoclist..*
14c60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
14c70 33 4d 73 72 49 6e 63 72 52 65 73 74 61 72 74 28  3MsrIncrRestart(
14c80 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
14c90 65 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  er *pCsr){.  int
14ca0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14cc0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
14cd0 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 2d  through segment-
14ce0 72 65 61 64 65 72 73 20 2a 2f 0a 0a 20 20 61 73  readers */..  as
14cf0 73 65 72 74 28 20 70 43 73 72 2d 3e 7a 54 65 72  sert( pCsr->zTer
14d00 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
14d10 28 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3d 3d 30  ( pCsr->nTerm==0
14d20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
14d30 73 72 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20  sr->aDoclist==0 
14d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  );.  assert( pCs
14d50 72 2d 3e 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 29  r->nDoclist==0 )
14d60 3b 0a 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61  ;..  pCsr->nAdva
14d70 6e 63 65 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d  nce = 0;.  pCsr-
14d80 3e 62 52 65 73 74 61 72 74 20 3d 20 31 3b 0a 20  >bRestart = 1;. 
14d90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
14da0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29  ->nSegment; i++)
14db0 7b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65  {.    pCsr->apSe
14dc0 67 6d 65 6e 74 5b 69 5d 2d 3e 70 4f 66 66 73 65  gment[i]->pOffse
14dd0 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70  tList = 0;.    p
14de0 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69  Csr->apSegment[i
14df0 5d 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d  ]->nOffsetList =
14e00 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70   0;.    pCsr->ap
14e10 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 69 44 6f 63  Segment[i]->iDoc
14e20 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  id = 0;.  }..  r
14e30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14e40 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
14e50 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65  Fts3SegReaderSte
14e60 70 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  p(.  Fts3Table *
14e70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14e80 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
14e90 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
14ea0 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
14eb0 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
14ec0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
14ed0 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ct */.){.  int r
14ee0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
14ef0 20 20 69 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d    int isIgnoreEm
14f00 70 74 79 20 3d 20 20 28 70 43 73 72 2d 3e 70 46  pty =  (pCsr->pF
14f10 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  ilter->flags & F
14f20 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f  TS3_SEGMENT_IGNO
14f30 52 45 5f 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74  RE_EMPTY);.  int
14f40 20 69 73 52 65 71 75 69 72 65 50 6f 73 20 3d 20   isRequirePos = 
14f50 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72    (pCsr->pFilter
14f60 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53  ->flags & FTS3_S
14f70 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50  EGMENT_REQUIRE_P
14f80 4f 53 29 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6c  OS);.  int isCol
14f90 46 69 6c 74 65 72 20 3d 20 20 20 20 28 70 43 73  Filter =    (pCs
14fa0 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67  r->pFilter->flag
14fb0 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54  s & FTS3_SEGMENT
14fc0 5f 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 29 3b  _COLUMN_FILTER);
14fd0 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 20  .  int isPrefix 
14fe0 3d 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70  =       (pCsr->p
14ff0 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  Filter->flags & 
15000 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45  FTS3_SEGMENT_PRE
15010 46 49 58 29 3b 0a 20 20 69 6e 74 20 69 73 53 63  FIX);.  int isSc
15020 61 6e 20 3d 20 20 20 20 20 20 20 20 20 28 70 43  an =         (pC
15030 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61  sr->pFilter->fla
15040 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
15050 54 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 69  T_SCAN);.  int i
15060 73 46 69 72 73 74 20 3d 20 20 20 20 20 20 20 20  sFirst =        
15070 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e  (pCsr->pFilter->
15080 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
15090 4d 45 4e 54 5f 46 49 52 53 54 29 3b 0a 0a 20 20  MENT_FIRST);..  
150a0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
150b0 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72  apSegment = pCsr
150c0 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69  ->apSegment;.  i
150d0 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43  nt nSegment = pC
150e0 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  sr->nSegment;.  
150f0 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70  Fts3SegFilter *p
15100 46 69 6c 74 65 72 20 3d 20 70 43 73 72 2d 3e 70  Filter = pCsr->p
15110 46 69 6c 74 65 72 3b 0a 20 20 69 6e 74 20 28 2a  Filter;.  int (*
15120 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61  xCmp)(Fts3SegRea
15130 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65  der *, Fts3SegRe
15140 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20  ader *) = (.    
15150 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74  p->bDescIdx ? ft
15160 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69  s3SegReaderDocli
15170 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53  stCmpRev : fts3S
15180 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43  egReaderDoclistC
15190 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  mp.  );..  if( p
151a0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30  Csr->nSegment==0
151b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
151c0 5f 4f 4b 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  _OK;..  do {.   
151d0 20 69 6e 74 20 6e 4d 65 72 67 65 3b 0a 20 20 20   int nMerge;.   
151e0 20 69 6e 74 20 69 3b 0a 20 20 0a 20 20 20 20 2f   int i;.  .    /
151f0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 66 69  * Advance the fi
15200 72 73 74 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e  rst pCsr->nAdvan
15210 63 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ce entries in th
15220 65 20 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72  e apSegment[] ar
15230 72 61 79 0a 20 20 20 20 2a 2a 20 66 6f 72 77 61  ray.    ** forwa
15240 72 64 2e 20 54 68 65 6e 20 73 6f 72 74 20 74 68  rd. Then sort th
15250 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20  e list in order 
15260 6f 66 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  of current term 
15270 61 67 61 69 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  again.  .    */.
15280 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15290 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69  Csr->nAdvance; i
152a0 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53  ++){.      Fts3S
152b0 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
152c0 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20   apSegment[i];. 
152d0 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62       if( pSeg->b
152e0 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Lookup ){.      
152f0 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
15300 65 74 45 6f 66 28 70 53 65 67 29 3b 0a 20 20 20  etEof(pSeg);.   
15310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15320 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
15330 61 64 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67  aderNext(p, pSeg
15340 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15350 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15360 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
15370 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  c;.    }.    fts
15380 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 61  3SegReaderSort(a
15390 70 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65  pSegment, nSegme
153a0 6e 74 2c 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e  nt, pCsr->nAdvan
153b0 63 65 2c 20 66 74 73 33 53 65 67 52 65 61 64 65  ce, fts3SegReade
153c0 72 43 6d 70 29 3b 0a 20 20 20 20 70 43 73 72 2d  rCmp);.    pCsr-
153d0 3e 6e 41 64 76 61 6e 63 65 20 3d 20 30 3b 0a 0a  >nAdvance = 0;..
153e0 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
153f0 65 20 73 65 67 2d 72 65 61 64 65 72 73 20 61 72  e seg-readers ar
15400 65 20 61 74 20 45 4f 46 2c 20 77 65 27 72 65 20  e at EOF, we're 
15410 66 69 6e 69 73 68 65 64 2e 20 72 65 74 75 72 6e  finished. return
15420 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20   SQLITE_OK. */. 
15430 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
15440 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
15450 69 66 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  if( apSegment[0]
15460 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65  ->aNode==0 ) bre
15470 61 6b 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e  ak;..    pCsr->n
15480 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74  Term = apSegment
15490 5b 30 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  [0]->nTerm;.    
154a0 70 43 73 72 2d 3e 7a 54 65 72 6d 20 3d 20 61 70  pCsr->zTerm = ap
154b0 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72  Segment[0]->zTer
154c0 6d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  m;..    /* If th
154d0 69 73 20 69 73 20 61 20 70 72 65 66 69 78 2d 73  is is a prefix-s
154e0 65 61 72 63 68 2c 20 61 6e 64 20 69 66 20 74 68  earch, and if th
154f0 65 20 74 65 72 6d 20 74 68 61 74 20 61 70 53 65  e term that apSe
15500 67 6d 65 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a  gment[0] points.
15510 20 20 20 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e      ** to does n
15520 6f 74 20 73 68 61 72 65 20 61 20 73 75 66 66 69  ot share a suffi
15530 78 20 77 69 74 68 20 70 46 69 6c 74 65 72 2d 3e  x with pFilter->
15540 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65  zTerm/nTerm, the
15550 6e 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65  n all .    ** re
15560 71 75 69 72 65 64 20 63 61 6c 6c 62 61 63 6b 73  quired callbacks
15570 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e   have been made.
15580 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 78   In this case ex
15590 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a  it early..    **
155a0 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c  .    ** Similarl
155b0 79 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  y, if this is a 
155c0 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  search for an ex
155d0 61 63 74 20 6d 61 74 63 68 2c 20 61 6e 64 20 74  act match, and t
155e0 68 65 20 66 69 72 73 74 20 74 65 72 6d 0a 20 20  he first term.  
155f0 20 20 2a 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20    ** of segment 
15600 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20  apSegment[0] is 
15610 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 65 78 69  not a match, exi
15620 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a  t early..    */.
15630 20 20 20 20 69 66 28 20 70 46 69 6c 74 65 72 2d      if( pFilter-
15640 3e 7a 54 65 72 6d 20 26 26 20 21 69 73 53 63 61  >zTerm && !isSca
15650 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  n ){.      if( p
15660 43 73 72 2d 3e 6e 54 65 72 6d 3c 70 46 69 6c 74  Csr->nTerm<pFilt
15670 65 72 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20  er->nTerm .     
15680 20 20 7c 7c 20 28 21 69 73 50 72 65 66 69 78 20    || (!isPrefix 
15690 26 26 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3e 70  && pCsr->nTerm>p
156a0 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 0a 20  Filter->nTerm). 
156b0 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28        || memcmp(
156c0 70 43 73 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69  pCsr->zTerm, pFi
156d0 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69  lter->zTerm, pFi
156e0 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20  lter->nTerm) .  
156f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62      ){.        b
15700 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15710 20 20 7d 0a 0a 20 20 20 20 6e 4d 65 72 67 65 20    }..    nMerge 
15720 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
15730 6e 4d 65 72 67 65 3c 6e 53 65 67 6d 65 6e 74 20  nMerge<nSegment 
15740 0a 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65  .        && apSe
15750 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61  gment[nMerge]->a
15760 4e 6f 64 65 0a 20 20 20 20 20 20 20 20 26 26 20  Node.        && 
15770 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65  apSegment[nMerge
15780 5d 2d 3e 6e 54 65 72 6d 3d 3d 70 43 73 72 2d 3e  ]->nTerm==pCsr->
15790 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 20 26  nTerm .        &
157a0 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 73 72  & 0==memcmp(pCsr
157b0 2d 3e 7a 54 65 72 6d 2c 20 61 70 53 65 67 6d 65  ->zTerm, apSegme
157c0 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65 72  nt[nMerge]->zTer
157d0 6d 2c 20 70 43 73 72 2d 3e 6e 54 65 72 6d 29 0a  m, pCsr->nTerm).
157e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65      ){.      nMe
157f0 72 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  rge++;.    }..  
15800 20 20 61 73 73 65 72 74 28 20 69 73 49 67 6e 6f    assert( isIgno
15810 72 65 45 6d 70 74 79 20 7c 7c 20 28 69 73 52 65  reEmpty || (isRe
15820 71 75 69 72 65 50 6f 73 20 26 26 20 21 69 73 43  quirePos && !isC
15830 6f 6c 46 69 6c 74 65 72 29 20 29 3b 0a 20 20 20  olFilter) );.   
15840 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d 31 20 0a   if( nMerge==1 .
15850 20 20 20 20 20 26 26 20 21 69 73 49 67 6e 6f 72       && !isIgnor
15860 65 45 6d 70 74 79 20 0a 20 20 20 20 20 26 26 20  eEmpty .     && 
15870 21 69 73 46 69 72 73 74 20 0a 20 20 20 20 20 26  !isFirst .     &
15880 26 20 28 70 2d 3e 62 44 65 73 63 49 64 78 3d 3d  & (p->bDescIdx==
15890 30 20 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64  0 || fts3SegRead
158a0 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65  erIsPending(apSe
158b0 67 6d 65 6e 74 5b 30 5d 29 3d 3d 30 29 0a 20 20  gment[0])==0).  
158c0 20 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d    ){.      pCsr-
158d0 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 61 70 53 65  >nDoclist = apSe
158e0 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 44 6f 63 6c 69  gment[0]->nDocli
158f0 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  st;.      if( ft
15900 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
15910 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30  ding(apSegment[0
15920 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
15930 20 3d 20 66 74 73 33 4d 73 72 42 75 66 66 65 72   = fts3MsrBuffer
15940 44 61 74 61 28 70 43 73 72 2c 20 61 70 53 65 67  Data(pCsr, apSeg
15950 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73  ment[0]->aDoclis
15960 74 2c 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73  t, pCsr->nDoclis
15970 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72  t);.        pCsr
15980 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73  ->aDoclist = pCs
15990 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20  r->aBuffer;.    
159a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
159b0 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20   pCsr->aDoclist 
159c0 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  = apSegment[0]->
159d0 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  aDoclist;.      
159e0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
159f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
15a00 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20   SQLITE_ROW;.   
15a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
15a20 74 20 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 20  t nDoclist = 0; 
15a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
15a40 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  e of doclist */.
15a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
15a60 74 36 34 20 69 50 72 65 76 20 3d 20 30 3b 20 20  t64 iPrev = 0;  
15a70 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f    /* Previous do
15a80 63 69 64 20 73 74 6f 72 65 64 20 69 6e 20 64 6f  cid stored in do
15a90 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20  clist */..      
15aa0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 74  /* The current t
15ab0 65 72 6d 20 6f 66 20 74 68 65 20 66 69 72 73 74  erm of the first
15ac0 20 6e 4d 65 72 67 65 20 65 6e 74 72 69 65 73 20   nMerge entries 
15ad0 69 6e 20 74 68 65 20 61 72 72 61 79 0a 20 20 20  in the array.   
15ae0 20 20 20 2a 2a 20 6f 66 20 46 74 73 33 53 65 67     ** of Fts3Seg
15af0 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69  Reader objects i
15b00 73 20 74 68 65 20 73 61 6d 65 2e 20 54 68 65 20  s the same. The 
15b10 64 6f 63 6c 69 73 74 73 20 6d 75 73 74 20 62 65  doclists must be
15b20 20 6d 65 72 67 65 64 0a 20 20 20 20 20 20 2a 2a   merged.      **
15b30 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20 74 65   and a single te
15b40 72 6d 20 72 65 74 75 72 6e 65 64 20 77 69 74 68  rm returned with
15b50 20 74 68 65 20 6d 65 72 67 65 64 20 64 6f 63 6c   the merged docl
15b60 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
15b70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15b80 4d 65 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  Merge; i++){.   
15b90 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
15ba0 65 72 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20  erFirstDocid(p, 
15bb0 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20  apSegment[i]);. 
15bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
15bd0 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 61  3SegReaderSort(a
15be0 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65  pSegment, nMerge
15bf0 2c 20 6e 4d 65 72 67 65 2c 20 78 43 6d 70 29 3b  , nMerge, xCmp);
15c00 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 61 70  .      while( ap
15c10 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66  Segment[0]->pOff
15c20 73 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  setList ){.     
15c30 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c50 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
15c60 74 73 20 74 68 61 74 20 73 68 61 72 65 20 61 20  ts that share a 
15c70 64 6f 63 69 64 20 2a 2f 0a 20 20 20 20 20 20 20  docid */.       
15c80 20 63 68 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20   char *pList;.  
15c90 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
15ca0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
15cb0 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  te;.        sqli
15cc0 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
15cd0 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d   = apSegment[0]-
15ce0 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20  >iDocid;.       
15cf0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
15d00 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67  xtDocid(p, apSeg
15d10 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c  ment[0], &pList,
15d20 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
15d30 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 20    j = 1;.       
15d40 20 77 68 69 6c 65 28 20 6a 3c 6e 4d 65 72 67 65   while( j<nMerge
15d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
15d60 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f  apSegment[j]->pO
15d70 66 66 73 65 74 4c 69 73 74 0a 20 20 20 20 20 20  ffsetList.      
15d80 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
15d90 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69  nt[j]->iDocid==i
15da0 44 6f 63 69 64 0a 20 20 20 20 20 20 20 20 29 7b  Docid.        ){
15db0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 53  .          fts3S
15dc0 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69  egReaderNextDoci
15dd0 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a  d(p, apSegment[j
15de0 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
15df0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
15e00 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
15e10 69 73 43 6f 6c 46 69 6c 74 65 72 20 29 7b 0a 20  isColFilter ){. 
15e20 20 20 20 20 20 20 20 20 20 66 74 73 33 43 6f 6c           fts3Col
15e30 75 6d 6e 46 69 6c 74 65 72 28 70 46 69 6c 74 65  umnFilter(pFilte
15e40 72 2d 3e 69 43 6f 6c 2c 20 26 70 4c 69 73 74 2c  r->iCol, &pList,
15e50 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
15e60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
15e70 20 21 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20   !isIgnoreEmpty 
15e80 7c 7c 20 6e 4c 69 73 74 3e 30 20 29 7b 0a 0a 20  || nList>0 ){.. 
15e90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 63           /* Calc
15ea0 75 6c 61 74 65 20 74 68 65 20 27 64 6f 63 69 64  ulate the 'docid
15eb0 27 20 64 65 6c 74 61 20 76 61 6c 75 65 20 74 6f  ' delta value to
15ec0 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20   write into the 
15ed0 6d 65 72 67 65 64 20 0a 20 20 20 20 20 20 20 20  merged .        
15ee0 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 2a 2f    ** doclist. */
15ef0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15f00 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b  e3_int64 iDelta;
15f10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
15f20 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 6e 44  ->bDescIdx && nD
15f30 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20  oclist>0 ){.    
15f40 20 20 20 20 20 20 20 20 69 44 65 6c 74 61 20 3d          iDelta =
15f50 20 69 50 72 65 76 20 2d 20 69 44 6f 63 69 64 3b   iPrev - iDocid;
15f60 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
15f70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44  {.            iD
15f80 65 6c 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20  elta = iDocid - 
15f90 69 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  iPrev;.         
15fa0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
15fb0 65 72 74 28 20 69 44 65 6c 74 61 3e 30 20 7c 7c  ert( iDelta>0 ||
15fc0 20 28 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 26 26   (nDoclist==0 &&
15fd0 20 69 44 65 6c 74 61 3d 3d 69 44 6f 63 69 64 29   iDelta==iDocid)
15fe0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
15ff0 73 65 72 74 28 20 6e 44 6f 63 6c 69 73 74 3e 30  sert( nDoclist>0
16000 20 7c 7c 20 69 44 65 6c 74 61 3d 3d 69 44 6f 63   || iDelta==iDoc
16010 69 64 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  id );..         
16020 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
16030 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 44  Fts3VarintLen(iD
16040 65 6c 74 61 29 20 2b 20 28 69 73 52 65 71 75 69  elta) + (isRequi
16050 72 65 50 6f 73 3f 6e 4c 69 73 74 2b 31 3a 30 29  rePos?nList+1:0)
16060 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16070 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74 65 3e 70  nDoclist+nByte>p
16080 43 73 72 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a  Csr->nBuffer ){.
16090 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
160a0 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20   *aNew;.        
160b0 20 20 20 20 70 43 73 72 2d 3e 6e 42 75 66 66 65      pCsr->nBuffe
160c0 72 20 3d 20 28 6e 44 6f 63 6c 69 73 74 2b 6e 42  r = (nDoclist+nB
160d0 79 74 65 29 2a 32 3b 0a 20 20 20 20 20 20 20 20  yte)*2;.        
160e0 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
160f0 65 33 5f 72 65 61 6c 6c 6f 63 28 70 43 73 72 2d  e3_realloc(pCsr-
16100 3e 61 42 75 66 66 65 72 2c 20 70 43 73 72 2d 3e  >aBuffer, pCsr->
16110 6e 42 75 66 66 65 72 29 3b 0a 20 20 20 20 20 20  nBuffer);.      
16120 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20        if( !aNew 
16130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16150 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
16160 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
16170 70 43 73 72 2d 3e 61 42 75 66 66 65 72 20 3d 20  pCsr->aBuffer = 
16180 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  aNew;.          
16190 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  }..          if(
161a0 20 69 73 46 69 72 73 74 20 29 7b 0a 20 20 20 20   isFirst ){.    
161b0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 20          char *a 
161c0 3d 20 26 70 43 73 72 2d 3e 61 42 75 66 66 65 72  = &pCsr->aBuffer
161d0 5b 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 20 20  [nDoclist];.    
161e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69          int nWri
161f0 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 0a  te;.           .
16200 20 20 20 20 20 20 20 20 20 20 20 20 6e 57 72 69              nWri
16210 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  te = sqlite3Fts3
16220 46 69 72 73 74 46 69 6c 74 65 72 28 69 44 65 6c  FirstFilter(iDel
16230 74 61 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74  ta, pList, nList
16240 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , a);.          
16250 20 20 69 66 28 20 6e 57 72 69 74 65 20 29 7b 0a    if( nWrite ){.
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
16270 72 65 76 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20  rev = iDocid;.  
16280 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63              nDoc
16290 6c 69 73 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  list += nWrite;.
162a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
162b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
162c0 20 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c             nDocl
162d0 69 73 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ist += sqlite3Ft
162e0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 43 73  s3PutVarint(&pCs
162f0 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c  r->aBuffer[nDocl
16300 69 73 74 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20  ist], iDelta);. 
16310 20 20 20 20 20 20 20 20 20 20 20 69 50 72 65 76             iPrev
16320 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20   = iDocid;.     
16330 20 20 20 20 20 20 20 69 66 28 20 69 73 52 65 71         if( isReq
16340 75 69 72 65 50 6f 73 20 29 7b 0a 20 20 20 20 20  uirePos ){.     
16350 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
16360 26 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e  &pCsr->aBuffer[n
16370 44 6f 63 6c 69 73 74 5d 2c 20 70 4c 69 73 74 2c  Doclist], pList,
16380 20 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20   nList);.       
16390 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20         nDoclist 
163a0 2b 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  += nList;.      
163b0 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 42          pCsr->aB
163c0 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b  uffer[nDoclist++
163d0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
163e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
163f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
16400 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
16410 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65  aderSort(apSegme
16420 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 78  nt, nMerge, j, x
16430 43 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cmp);.      }.  
16440 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 74      if( nDoclist
16450 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
16460 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70  sr->aDoclist = p
16470 43 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20  Csr->aBuffer;.  
16480 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63        pCsr->nDoc
16490 6c 69 73 74 20 3d 20 6e 44 6f 63 6c 69 73 74 3b  list = nDoclist;
164a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
164b0 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20  LITE_ROW;.      
164c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 73 72  }.    }.    pCsr
164d0 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 6e 4d 65  ->nAdvance = nMe
164e0 72 67 65 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  rge;.  }while( r
164f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
16500 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16510 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
16520 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73  s3SegReaderFinis
16530 68 28 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  h(.  Fts3MultiSe
16540 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20  gReader *pCsr   
16550 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62      /* Cursor ob
16560 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ject */.){.  if(
16570 20 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74   pCsr ){.    int
16580 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
16590 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e   i<pCsr->nSegmen
165a0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  t; i++){.      s
165b0 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
165c0 64 65 72 46 72 65 65 28 70 43 73 72 2d 3e 61 70  derFree(pCsr->ap
165d0 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Segment[i]);.   
165e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
165f0 72 65 65 28 70 43 73 72 2d 3e 61 70 53 65 67 6d  ree(pCsr->apSegm
16600 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
16610 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 42 75  3_free(pCsr->aBu
16620 66 66 65 72 29 3b 0a 0a 20 20 20 20 70 43 73 72  ffer);..    pCsr
16630 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a  ->nSegment = 0;.
16640 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d      pCsr->apSegm
16650 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ent = 0;.    pCs
16660 72 2d 3e 61 42 75 66 66 65 72 20 3d 20 30 3b 0a  r->aBuffer = 0;.
16670 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72    }.}../*.** Mer
16680 67 65 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65  ge all level iLe
16690 76 65 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  vel segments in 
166a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 74  the database int
166b0 6f 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69  o a single .** i
166c0 4c 65 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e  Level+1 segment.
166d0 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30   Or, if iLevel<0
166e0 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  , merge all segm
166f0 65 6e 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73  ents into a.** s
16700 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 77 69  ingle segment wi
16710 74 68 20 61 20 6c 65 76 65 6c 20 65 71 75 61 6c  th a level equal
16720 20 74 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61   to the numerica
16730 6c 6c 79 20 6c 61 72 67 65 73 74 20 6c 65 76 65  lly largest leve
16740 6c 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  l .** currently 
16750 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
16760 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
16770 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
16780 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 69  is called with i
16790 4c 65 76 65 6c 3c 30 2c 20 62 75 74 20 74 68 65  Level<0, but the
167a0 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a  re is only one.*
167b0 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65  * segment in the
167c0 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54   database, SQLIT
167d0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
167e0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
167f0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
16800 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
16810 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
16820 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
16830 20 6f 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20   occurs, .** an 
16840 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
16850 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
16860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
16870 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 0a 20  3SegmentMerge(. 
16880 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a   Fts3Table *p, .
16890 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168b0 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
168c0 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69   to merge */.  i
168d0 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
168e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
168f0 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49  * Index in p->aI
16900 6e 64 65 78 5b 5d 20 74 6f 20 6d 65 72 67 65 20  ndex[] to merge 
16910 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20  */.  int iLevel 
16920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16930 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
16940 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
16950 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16970 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
16980 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
169b0 65 77 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ew segment */.  
169c0 69 6e 74 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20  int iNewLevel = 
169d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
169e0 2f 2a 20 4c 65 76 65 6c 2f 69 6e 64 65 78 20 74  /* Level/index t
169f0 6f 20 63 72 65 61 74 65 20 6e 65 77 20 73 65 67  o create new seg
16a00 6d 65 6e 74 20 61 74 20 2a 2f 0a 20 20 53 65 67  ment at */.  Seg
16a10 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69  mentWriter *pWri
16a20 74 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ter = 0;     /* 
16a30 55 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 68  Used to write th
16a40 65 20 6e 65 77 2c 20 6d 65 72 67 65 64 2c 20 73  e new, merged, s
16a50 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33  egment */.  Fts3
16a60 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72  SegFilter filter
16a70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
16a80 65 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74  egment term filt
16a90 65 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  er condition */.
16aa0 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
16ab0 61 64 65 72 20 63 73 72 3b 20 20 20 20 20 20 20  ader csr;       
16ac0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 69    /* Cursor to i
16ad0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
16ae0 65 76 65 6c 28 73 29 20 2a 2f 0a 20 20 69 6e 74  evel(s) */.  int
16af0 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20   bIgnoreEmpty = 
16b00 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
16b10 54 72 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 65  True to ignore e
16b20 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 20 2a 2f  mpty segments */
16b30 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ..  assert( iLev
16b40 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
16b50 4f 52 5f 41 4c 4c 0a 20 20 20 20 20 20 20 7c 7c  OR_ALL.       ||
16b60 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
16b70 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 0a  GCURSOR_PENDING.
16b80 20 20 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c         || iLevel
16b90 3e 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  >=0.  );.  asser
16ba0 74 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53  t( iLevel<FTS3_S
16bb0 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29  EGDIR_MAXLEVEL )
16bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e 64  ;.  assert( iInd
16bd0 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c  ex>=0 && iIndex<
16be0 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20  p->nIndex );..  
16bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
16c00 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28  SegReaderCursor(
16c10 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
16c20 65 78 2c 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30  ex, iLevel, 0, 0
16c30 2c 20 31 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20  , 1, 0, &csr);. 
16c40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16c50 4f 4b 20 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65  OK || csr.nSegme
16c60 6e 74 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e  nt==0 ) goto fin
16c70 69 73 68 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c  ished;..  if( iL
16c80 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
16c90 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  RSOR_ALL ){.    
16ca0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  /* This call is 
16cb0 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67  to merge all seg
16cc0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74  ments in the dat
16cd0 61 62 61 73 65 20 74 6f 20 61 20 73 69 6e 67 6c  abase to a singl
16ce0 65 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74  e.    ** segment
16cf0 2e 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74  . The level of t
16d00 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69  he new segment i
16d10 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
16d20 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
16d30 20 20 20 20 2a 2a 20 67 72 65 61 74 65 73 74 20      ** greatest 
16d40 73 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20 63 75  segment level cu
16d50 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20  rrently present 
16d60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16d70 66 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  for this.    ** 
16d80 69 6e 64 65 78 2e 20 54 68 65 20 69 64 78 20 6f  index. The idx o
16d90 66 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  f the new segmen
16da0 74 20 69 73 20 61 6c 77 61 79 73 20 30 2e 20 20  t is always 0.  
16db0 2a 2f 0a 20 20 20 20 69 66 28 20 63 73 72 2e 6e  */.    if( csr.n
16dc0 53 65 67 6d 65 6e 74 3d 3d 31 20 29 7b 0a 20 20  Segment==1 ){.  
16dd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16de0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f  DONE;.      goto
16df0 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d   finished;.    }
16e00 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
16e10 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28 70 2c  gmentMaxLevel(p,
16e20 20 69 49 6e 64 65 78 2c 20 26 69 4e 65 77 4c 65   iIndex, &iNewLe
16e30 76 65 6c 29 3b 0a 20 20 20 20 62 49 67 6e 6f 72  vel);.    bIgnor
16e40 65 45 6d 70 74 79 20 3d 20 31 3b 0a 0a 20 20 7d  eEmpty = 1;..  }
16e50 65 6c 73 65 20 69 66 28 20 69 4c 65 76 65 6c 3d  else if( iLevel=
16e60 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
16e70 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20 69  PENDING ){.    i
16e80 4e 65 77 4c 65 76 65 6c 20 3d 20 67 65 74 41 62  NewLevel = getAb
16e90 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
16ea0 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
16eb0 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  0);.    rc = fts
16ec0 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
16ed0 64 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  dx(p, iLangid, i
16ee0 49 6e 64 65 78 2c 20 30 2c 20 26 69 49 64 78 29  Index, 0, &iIdx)
16ef0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
16f00 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74  * This call is t
16f10 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  o merge all segm
16f20 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20 69 4c  ents at level iL
16f30 65 76 65 6c 2e 20 66 69 6e 64 20 74 68 65 20 6e  evel. find the n
16f40 65 78 74 0a 20 20 20 20 2a 2a 20 61 76 61 69 6c  ext.    ** avail
16f50 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 69 6e 64  able segment ind
16f60 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76  ex at level iLev
16f70 65 6c 2b 31 2e 20 54 68 65 20 63 61 6c 6c 20 74  el+1. The call t
16f80 6f 0a 20 20 20 20 2a 2a 20 66 74 73 33 41 6c 6c  o.    ** fts3All
16f90 6f 63 61 74 65 53 65 67 64 69 72 49 64 78 28 29  ocateSegdirIdx()
16fa0 20 77 69 6c 6c 20 6d 65 72 67 65 20 74 68 65 20   will merge the 
16fb0 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65  segments at leve
16fc0 6c 20 69 4c 65 76 65 6c 2b 31 20 74 6f 20 0a 20  l iLevel+1 to . 
16fd0 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
16fe0 4c 65 76 65 6c 2b 32 20 73 65 67 6d 65 6e 74 20  Level+2 segment 
16ff0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 2a  if necessary.  *
17000 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 41  /.    rc = fts3A
17010 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
17020 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
17030 64 65 78 2c 20 69 4c 65 76 65 6c 2b 31 2c 20 26  dex, iLevel+1, &
17040 69 49 64 78 29 3b 0a 20 20 20 20 69 4e 65 77 4c  iIdx);.    iNewL
17050 65 76 65 6c 20 3d 20 67 65 74 41 62 73 6f 6c 75  evel = getAbsolu
17060 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
17070 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
17080 65 6c 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  el+1);.  }.  if(
17090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
170a0 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
170b0 20 20 61 73 73 65 72 74 28 20 63 73 72 2e 6e 53    assert( csr.nS
170c0 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  egment>0 );.  as
170d0 73 65 72 74 28 20 69 4e 65 77 4c 65 76 65 6c 3e  sert( iNewLevel>
170e0 3d 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65  =getAbsoluteLeve
170f0 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
17100 6e 64 65 78 2c 20 30 29 20 29 3b 0a 20 20 61 73  ndex, 0) );.  as
17110 73 65 72 74 28 20 69 4e 65 77 4c 65 76 65 6c 3c  sert( iNewLevel<
17120 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
17130 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
17140 64 65 78 2c 46 54 53 33 5f 53 45 47 44 49 52 5f  dex,FTS3_SEGDIR_
17150 4d 41 58 4c 45 56 45 4c 29 20 29 3b 0a 0a 20 20  MAXLEVEL) );..  
17160 6d 65 6d 73 65 74 28 26 66 69 6c 74 65 72 2c 20  memset(&filter, 
17170 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65  0, sizeof(Fts3Se
17180 67 46 69 6c 74 65 72 29 29 3b 0a 20 20 66 69 6c  gFilter));.  fil
17190 74 65 72 2e 66 6c 61 67 73 20 3d 20 46 54 53 33  ter.flags = FTS3
171a0 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45  _SEGMENT_REQUIRE
171b0 5f 50 4f 53 3b 0a 20 20 66 69 6c 74 65 72 2e 66  _POS;.  filter.f
171c0 6c 61 67 73 20 7c 3d 20 28 62 49 67 6e 6f 72 65  lags |= (bIgnore
171d0 45 6d 70 74 79 20 3f 20 46 54 53 33 5f 53 45 47  Empty ? FTS3_SEG
171e0 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54  MENT_IGNORE_EMPT
171f0 59 20 3a 20 30 29 3b 0a 0a 20 20 72 63 20 3d 20  Y : 0);..  rc = 
17200 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
17210 61 64 65 72 53 74 61 72 74 28 70 2c 20 26 63 73  aderStart(p, &cs
17220 72 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20 20 77  r, &filter);.  w
17230 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  hile( SQLITE_OK=
17240 3d 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =rc ){.    rc = 
17250 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
17260 61 64 65 72 53 74 65 70 28 70 2c 20 26 63 73 72  aderStep(p, &csr
17270 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
17280 51 4c 49 54 45 5f 52 4f 57 20 29 20 62 72 65 61  QLITE_ROW ) brea
17290 6b 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  k;.    rc = fts3
172a0 53 65 67 57 72 69 74 65 72 41 64 64 28 70 2c 20  SegWriterAdd(p, 
172b0 26 70 57 72 69 74 65 72 2c 20 31 2c 20 0a 20 20  &pWriter, 1, .  
172c0 20 20 20 20 20 20 63 73 72 2e 7a 54 65 72 6d 2c        csr.zTerm,
172d0 20 63 73 72 2e 6e 54 65 72 6d 2c 20 63 73 72 2e   csr.nTerm, csr.
172e0 61 44 6f 63 6c 69 73 74 2c 20 63 73 72 2e 6e 44  aDoclist, csr.nD
172f0 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  oclist);.  }.  i
17300 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17310 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
17320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69  ;.  assert( pWri
17330 74 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c  ter );..  if( iL
17340 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55  evel!=FTS3_SEGCU
17350 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a  RSOR_PENDING ){.
17360 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c      rc = fts3Del
17370 65 74 65 53 65 67 64 69 72 28 0a 20 20 20 20 20  eteSegdir(.     
17380 20 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69     p, iLangid, i
17390 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c 20 63  Index, iLevel, c
173a0 73 72 2e 61 70 53 65 67 6d 65 6e 74 2c 20 63 73  sr.apSegment, cs
173b0 72 2e 6e 53 65 67 6d 65 6e 74 0a 20 20 20 20 29  r.nSegment.    )
173c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
173d0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
173e0 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 20 20 72  inished;.  }.  r
173f0 63 20 3d 20 66 74 73 33 53 65 67 57 72 69 74 65  c = fts3SegWrite
17400 72 46 6c 75 73 68 28 70 2c 20 70 57 72 69 74 65  rFlush(p, pWrite
17410 72 2c 20 69 4e 65 77 4c 65 76 65 6c 2c 20 69 49  r, iNewLevel, iI
17420 64 78 29 3b 0a 0a 20 66 69 6e 69 73 68 65 64 3a  dx);.. finished:
17430 0a 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72  .  fts3SegWriter
17440 46 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20  Free(pWriter);. 
17450 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
17460 65 61 64 65 72 46 69 6e 69 73 68 28 26 63 73 72  eaderFinish(&csr
17470 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17480 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68  }.../* .** Flush
17490 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
174a0 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 74 6f   pendingTerms to
174b0 20 6c 65 76 65 6c 20 30 20 73 65 67 6d 65 6e 74   level 0 segment
174c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
174d0 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
174e0 73 46 6c 75 73 68 28 46 74 73 33 54 61 62 6c 65  sFlush(Fts3Table
174f0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
17500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
17510 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
17520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17530 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b   i<p->nIndex; i+
17540 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  +){.    rc = fts
17550 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c  3SegmentMerge(p,
17560 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 2c   p->iPrevLangid,
17570 20 69 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53   i, FTS3_SEGCURS
17580 4f 52 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  OR_PENDING);.   
17590 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
175a0 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
175b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
175c0 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54  ite3Fts3PendingT
175d0 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 20 20  ermsClear(p);.  
175e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
175f0 0a 2a 2a 20 45 6e 63 6f 64 65 20 4e 20 69 6e 74  .** Encode N int
17600 65 67 65 72 73 20 61 73 20 76 61 72 69 6e 74 73  egers as varints
17610 20 69 6e 74 6f 20 61 20 62 6c 6f 62 2e 0a 2a 2f   into a blob..*/
17620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17630 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79 28  3EncodeIntArray(
17640 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
17650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
17660 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ber of integers 
17670 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 75  to encode */.  u
17680 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20 20 20  32 *a,          
17690 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
176a0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61   values */.  cha
176b0 72 20 2a 7a 42 75 66 2c 20 20 20 20 20 20 20 20  r *zBuf,        
176c0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 42 4c 4f  /* Write the BLO
176d0 42 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  B here */.  int 
176e0 2a 70 4e 42 75 66 20 20 20 20 20 20 20 20 20 2f  *pNBuf         /
176f0 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f  * Write number o
17700 66 20 62 79 74 65 73 20 69 66 20 7a 42 75 66 5b  f bytes if zBuf[
17710 5d 20 75 73 65 64 20 68 65 72 65 20 2a 2f 0a 29  ] used here */.)
17720 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
17730 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20  for(i=j=0; i<N; 
17740 69 2b 2b 29 7b 0a 20 20 20 20 6a 20 2b 3d 20 73  i++){.    j += s
17750 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
17760 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20 28 73  int(&zBuf[j], (s
17770 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 69  qlite3_int64)a[i
17780 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 4e 42 75 66  ]);.  }.  *pNBuf
17790 20 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44   = j;.}../*.** D
177a0 65 63 6f 64 65 20 61 20 62 6c 6f 62 20 6f 66 20  ecode a blob of 
177b0 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 4e 20 69  varints into N i
177c0 6e 74 65 67 65 72 73 0a 2a 2f 0a 73 74 61 74 69  ntegers.*/.stati
177d0 63 20 76 6f 69 64 20 66 74 73 33 44 65 63 6f 64  c void fts3Decod
177e0 65 49 6e 74 41 72 72 61 79 28 0a 20 20 69 6e 74  eIntArray(.  int
177f0 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
17800 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
17810 20 69 6e 74 65 67 65 72 73 20 74 6f 20 64 65 63   integers to dec
17820 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c  ode */.  u32 *a,
17830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
17840 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  rite the integer
17850 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 6f 6e   values */.  con
17860 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 20  st char *zBuf,  
17870 2f 2a 20 54 68 65 20 42 4c 4f 42 20 63 6f 6e 74  /* The BLOB cont
17880 61 69 6e 69 6e 67 20 74 68 65 20 76 61 72 69 6e  aining the varin
17890 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66  ts */.  int nBuf
178a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69             /* si
178b0 7a 65 20 6f 66 20 74 68 65 20 42 4c 4f 42 20 2a  ze of the BLOB *
178c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
178d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
178e0 54 45 52 28 6e 42 75 66 29 3b 0a 20 20 66 6f 72  TER(nBuf);.  for
178f0 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  (i=j=0; i<N; i++
17900 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
17910 6e 74 36 34 20 78 3b 0a 20 20 20 20 6a 20 2b 3d  nt64 x;.    j +=
17920 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
17930 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20  arint(&zBuf[j], 
17940 26 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  &x);.    assert(
17950 6a 3c 3d 6e 42 75 66 29 3b 0a 20 20 20 20 61 5b  j<=nBuf);.    a[
17960 69 5d 20 3d 20 28 75 33 32 29 28 78 20 26 20 30  i] = (u32)(x & 0
17970 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 0a  xffffffff);.  }.
17980 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
17990 74 68 65 20 73 69 7a 65 73 20 28 69 6e 20 74 6f  the sizes (in to
179a0 6b 65 6e 73 29 20 66 6f 72 20 65 61 63 68 20 63  kens) for each c
179b0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 6f 63  olumn of the doc
179c0 75 6d 65 6e 74 0a 2a 2a 20 77 69 74 68 20 64 6f  ument.** with do
179d0 63 69 64 20 65 71 75 61 6c 20 74 6f 20 70 2d 3e  cid equal to p->
179e0 69 50 72 65 76 44 6f 63 69 64 2e 20 20 54 68 65  iPrevDocid.  The
179f0 20 73 69 7a 65 73 20 61 72 65 20 65 6e 63 6f 64   sizes are encod
17a00 65 64 20 61 73 0a 2a 2a 20 61 20 62 6c 6f 62 20  ed as.** a blob 
17a10 6f 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73  of varints..*/.s
17a20 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 49  tatic void fts3I
17a30 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 0a 20 20  nsertDocsize(.  
17a40 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20  int *pRC,       
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
17a70 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  /.  Fts3Table *p
17a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17a90 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e 74      /* Table int
17aa0 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72  o which to inser
17ab0 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 20  t */.  u32 *aSz 
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ad0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
17ae0 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20  of each column, 
17af0 69 6e 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a  in tokens */.){.
17b00 20 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20    char *pBlob;  
17b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17b20 65 20 42 4c 4f 42 20 65 6e 63 6f 64 69 6e 67 20  e BLOB encoding 
17b30 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  of the document 
17b40 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  size */.  int nB
17b50 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
17b60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17b70 62 79 74 65 73 20 69 6e 20 74 68 65 20 42 4c 4f  bytes in the BLO
17b80 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  B */.  sqlite3_s
17b90 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
17ba0 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65  /* Statement use
17bb0 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
17bc0 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
17bd0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17be0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
17bf0 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
17c00 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
17c10 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
17c20 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  pBlob = sqlit
17c30 65 33 5f 6d 61 6c 6c 6f 63 28 20 31 30 2a 70 2d  e3_malloc( 10*p-
17c40 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66  >nColumn );.  if
17c50 28 20 70 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20  ( pBlob==0 ){.  
17c60 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
17c70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72  NOMEM;.    retur
17c80 6e 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63  n;.  }.  fts3Enc
17c90 6f 64 65 49 6e 74 41 72 72 61 79 28 70 2d 3e 6e  odeIntArray(p->n
17ca0 43 6f 6c 75 6d 6e 2c 20 61 53 7a 2c 20 70 42 6c  Column, aSz, pBl
17cb0 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72  ob, &nBlob);.  r
17cc0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
17cd0 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44  p, SQL_REPLACE_D
17ce0 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c 20  OCSIZE, &pStmt, 
17cf0 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
17d00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17d10 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20 2a 70 52  (pBlob);.    *pR
17d20 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
17d30 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
17d40 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
17d50 6d 74 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76 44  mt, 1, p->iPrevD
17d60 6f 63 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ocid);.  sqlite3
17d70 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
17d80 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  , 2, pBlob, nBlo
17d90 62 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  b, sqlite3_free)
17da0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
17db0 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20  (pStmt);.  *pRC 
17dc0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
17dd0 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pStmt);.}../*.**
17de0 20 52 65 63 6f 72 64 20 30 20 6f 66 20 74 68 65   Record 0 of the
17df0 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 63 6f   %_stat table co
17e00 6e 74 61 69 6e 73 20 61 20 62 6c 6f 62 20 63 6f  ntains a blob co
17e10 6e 73 69 73 74 69 6e 67 20 6f 66 20 4e 20 76 61  nsisting of N va
17e20 72 69 6e 74 73 2c 0a 2a 2a 20 77 68 65 72 65 20  rints,.** where 
17e30 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
17e40 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  of user defined 
17e50 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 66  columns in the f
17e60 74 73 33 20 74 61 62 6c 65 20 70 6c 75 73 0a 2a  ts3 table plus.*
17e70 2a 20 74 77 6f 2e 20 49 66 20 6e 43 6f 6c 20 69  * two. If nCol i
17e80 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17e90 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c  user defined col
17ea0 75 6d 6e 73 2c 20 74 68 65 6e 20 76 61 6c 75 65  umns, then value
17eb0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 76 61 72  s of the .** var
17ec0 69 6e 74 73 20 61 72 65 20 73 65 74 20 61 73 20  ints are set as 
17ed0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
17ee0 20 56 61 72 69 6e 74 20 30 3a 20 20 20 20 20 20   Varint 0:      
17ef0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
17f00 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
17f10 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  le..**.**   Vari
17f20 6e 74 20 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72 20  nt 1..nCol: For 
17f30 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  each column, the
17f40 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
17f50 20 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20 69   tokens stored i
17f60 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
17f70 20 20 20 20 20 20 20 74 68 65 20 63 6f 6c 75 6d         the colum
17f80 6e 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20 6f  n for all rows o
17f90 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
17fa0 2a 2a 20 20 20 56 61 72 69 6e 74 20 31 2b 6e 43  **   Varint 1+nC
17fb0 6f 6c 3a 20 20 54 68 65 20 74 6f 74 61 6c 20 73  ol:  The total s
17fc0 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 6f  ize, in bytes, o
17fd0 66 20 61 6c 6c 20 74 65 78 74 20 76 61 6c 75 65  f all text value
17fe0 73 20 69 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20 20  s in all.**     
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
18000 6c 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72 6f 77  lumns of all row
18010 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  s of the table..
18020 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
18030 64 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54  d fts3UpdateDocT
18040 6f 74 61 6c 73 28 0a 20 20 69 6e 74 20 2a 70 52  otals(.  int *pR
18050 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
18060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18070 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  result code */. 
18080 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
180b0 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 75 33 32  updated */.  u32
180c0 20 2a 61 53 7a 49 6e 73 2c 20 20 20 20 20 20 20   *aSzIns,       
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180e0 53 69 7a 65 20 69 6e 63 72 65 61 73 65 73 20 2a  Size increases *
180f0 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 2c  /.  u32 *aSzDel,
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 20 20 20 20 2f 2a 20 53 69 7a 65 20 64 65 63 72      /* Size decr
18120 65 61 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eases */.  int n
18130 43 68 6e 67 20 20 20 20 20 20 20 20 20 20 20 20  Chng            
18140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
18150 61 6e 67 65 20 69 6e 20 74 68 65 20 6e 75 6d 62  ange in the numb
18160 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  er of documents 
18170 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 42  */.){.  char *pB
18180 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
18190 20 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f 72 20   /* Storage for 
181a0 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e 74  BLOB written int
181b0 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 69 6e  o %_stat */.  in
181c0 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20  t nBlob;        
181d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
181e0 66 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 69  f BLOB written i
181f0 6e 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20  nto %_stat */.  
18200 75 33 32 20 2a 61 3b 20 20 20 20 20 20 20 20 20  u32 *a;         
18210 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
18220 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68  y of integers th
18230 61 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 42  at becomes the B
18240 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  LOB */.  sqlite3
18250 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
18260 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66    /* Statement f
18270 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  or reading and w
18280 72 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  riting */.  int 
18290 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
182a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
182b0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
182c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
182d0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
182e0 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
182f0 6f 6e 73 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20  ons */..  const 
18300 69 6e 74 20 6e 53 74 61 74 20 3d 20 70 2d 3e 6e  int nStat = p->n
18310 43 6f 6c 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66 28  Column+2;..  if(
18320 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
18330 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    a = sqlite3_ma
18340 6c 6c 6f 63 28 20 28 73 69 7a 65 6f 66 28 75 33  lloc( (sizeof(u3
18350 32 29 2b 31 30 29 2a 6e 53 74 61 74 20 29 3b 0a  2)+10)*nStat );.
18360 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
18370 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
18380 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72  NOMEM;.    retur
18390 6e 3b 0a 20 20 7d 0a 20 20 70 42 6c 6f 62 20 3d  n;.  }.  pBlob =
183a0 20 28 63 68 61 72 2a 29 26 61 5b 6e 53 74 61 74   (char*)&a[nStat
183b0 5d 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  ];.  rc = fts3Sq
183c0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
183d0 45 43 54 5f 44 4f 43 54 4f 54 41 4c 2c 20 26 70  ECT_DOCTOTAL, &p
183e0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
183f0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
18400 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a  3_free(a);.    *
18410 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
18420 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
18430 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
18440 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
18450 29 7b 0a 20 20 20 20 66 74 73 33 44 65 63 6f 64  ){.    fts3Decod
18460 65 49 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c  eIntArray(nStat,
18470 20 61 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   a,.         sql
18480 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
18490 28 70 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20  (pStmt, 0),.    
184a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
184b0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
184c0 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   0));.  }else{. 
184d0 20 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20     memset(a, 0, 
184e0 73 69 7a 65 6f 66 28 75 33 32 29 2a 28 6e 53 74  sizeof(u32)*(nSt
184f0 61 74 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  at) );.  }.  sql
18500 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
18510 29 3b 0a 20 20 69 66 28 20 6e 43 68 6e 67 3c 30  );.  if( nChng<0
18520 20 26 26 20 61 5b 30 5d 3c 28 75 33 32 29 28 2d   && a[0]<(u32)(-
18530 6e 43 68 6e 67 29 20 29 7b 0a 20 20 20 20 61 5b  nChng) ){.    a[
18540 30 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  0] = 0;.  }else{
18550 0a 20 20 20 20 61 5b 30 5d 20 2b 3d 20 6e 43 68  .    a[0] += nCh
18560 6e 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ng;.  }.  for(i=
18570 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  0; i<p->nColumn+
18580 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32  1; i++){.    u32
18590 20 78 20 3d 20 61 5b 69 2b 31 5d 3b 0a 20 20 20   x = a[i+1];.   
185a0 20 69 66 28 20 78 2b 61 53 7a 49 6e 73 5b 69 5d   if( x+aSzIns[i]
185b0 20 3c 20 61 53 7a 44 65 6c 5b 69 5d 20 29 7b 0a   < aSzDel[i] ){.
185c0 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20        x = 0;.   
185d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 20   }else{.      x 
185e0 3d 20 78 20 2b 20 61 53 7a 49 6e 73 5b 69 5d 20  = x + aSzIns[i] 
185f0 2d 20 61 53 7a 44 65 6c 5b 69 5d 3b 0a 20 20 20  - aSzDel[i];.   
18600 20 7d 0a 20 20 20 20 61 5b 69 2b 31 5d 20 3d 20   }.    a[i+1] = 
18610 78 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63  x;.  }.  fts3Enc
18620 6f 64 65 49 6e 74 41 72 72 61 79 28 6e 53 74 61  odeIntArray(nSta
18630 74 2c 20 61 2c 20 70 42 6c 6f 62 2c 20 26 6e 42  t, a, pBlob, &nB
18640 6c 6f 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73  lob);.  rc = fts
18650 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
18660 52 45 50 4c 41 43 45 5f 44 4f 43 54 4f 54 41 4c  REPLACE_DOCTOTAL
18670 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
18680 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
18690 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
186a0 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
186b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
186c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
186d0 62 28 70 53 74 6d 74 2c 20 31 2c 20 70 42 6c 6f  b(pStmt, 1, pBlo
186e0 62 2c 20 6e 42 6c 6f 62 2c 20 53 51 4c 49 54 45  b, nBlob, SQLITE
186f0 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
18700 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
18710 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74 65  .  *pRC = sqlite
18720 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
18730 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
18740 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  );.}../*.** Merg
18750 65 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74  e the entire dat
18760 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68  abase so that th
18770 65 72 65 20 69 73 20 6f 6e 65 20 73 65 67 6d 65  ere is one segme
18780 6e 74 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  nt for each .** 
18790 69 49 6e 64 65 78 2f 69 4c 61 6e 67 69 64 20 63  iIndex/iLangid c
187a0 6f 6d 62 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ombination..*/.s
187b0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f  tatic int fts3Do
187c0 4f 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62  Optimize(Fts3Tab
187d0 6c 65 20 2a 70 2c 20 69 6e 74 20 62 52 65 74 75  le *p, int bRetu
187e0 72 6e 44 6f 6e 65 29 7b 0a 20 20 69 6e 74 20 69  rnDone){.  int i
187f0 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 44 6f 6e  ;.  int bSeenDon
18800 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
18810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  = SQLITE_OK;.  f
18820 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
18830 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49  TE_OK && i<p->nI
18840 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
18850 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74  rc = fts3Segment
18860 4d 65 72 67 65 28 70 2c 20 30 2c 20 69 2c 20 46  Merge(p, 0, i, F
18870 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
18880 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  L);.    if( rc==
18890 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
188a0 20 20 20 20 20 62 53 65 65 6e 44 6f 6e 65 20 3d       bSeenDone =
188b0 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   1;.      rc = S
188c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
188d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73    }.  sqlite3Fts
188e0 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70  3SegmentsClose(p
188f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
18900 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61  PendingTermsClea
18910 72 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  r(p);..  return 
18920 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
18930 26 20 62 52 65 74 75 72 6e 44 6f 6e 65 20 26 26  & bReturnDone &&
18940 20 62 53 65 65 6e 44 6f 6e 65 29 20 3f 20 53 51   bSeenDone) ? SQ
18950 4c 49 54 45 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a  LITE_DONE : rc;.
18960 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
18970 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
18980 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 65   when the user e
18990 78 65 63 75 74 65 73 20 74 68 65 20 66 6f 6c 6c  xecutes the foll
189a0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 3a  owing statement:
189b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52  .**.**     INSER
189c0 54 20 49 4e 54 4f 20 3c 74 62 6c 3e 28 3c 74 62  T INTO <tbl>(<tb
189d0 6c 3e 29 20 56 41 4c 55 45 53 28 27 72 65 62 75  l>) VALUES('rebu
189e0 69 6c 64 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ild');.**.** The
189f0 20 65 6e 74 69 72 65 20 46 54 53 20 69 6e 64 65   entire FTS inde
18a00 78 20 69 73 20 64 69 73 63 61 72 64 65 64 20 61  x is discarded a
18a10 6e 64 20 72 65 62 75 69 6c 74 2e 20 49 66 20 74  nd rebuilt. If t
18a20 68 65 20 74 61 62 6c 65 20 69 73 20 6f 6e 65 20  he table is one 
18a30 0a 2a 2a 20 63 72 65 61 74 65 64 20 75 73 69 6e  .** created usin
18a40 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78  g the content=xx
18a50 78 20 6f 70 74 69 6f 6e 2c 20 74 68 65 6e 20 74  x option, then t
18a60 68 65 20 6e 65 77 20 69 6e 64 65 78 20 69 73 20  he new index is 
18a70 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
18a80 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
18a90 20 6f 66 20 74 68 65 20 78 78 78 20 74 61 62 6c   of the xxx tabl
18aa0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
18ab0 20 69 73 20 72 65 62 75 69 6c 74 20 62 61 73 65   is rebuilt base
18ac0 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6e 74  d.** on the cont
18ad0 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f  ents of the %_co
18ae0 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ntent table..*/.
18af0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
18b00 6f 52 65 62 75 69 6c 64 28 46 74 73 33 54 61 62  oRebuild(Fts3Tab
18b10 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  le *p){.  int rc
18b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18b40 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn Code */..  r
18b50 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c  c = fts3DeleteAl
18b60 6c 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  l(p, 0);.  if( r
18b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18b80 20 20 20 20 75 33 32 20 2a 61 53 7a 20 3d 20 30      u32 *aSz = 0
18b90 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 49 6e  ;.    u32 *aSzIn
18ba0 73 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 2a  s = 0;.    u32 *
18bb0 61 53 7a 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  aSzDel = 0;.    
18bc0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
18bd0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tmt = 0;.    int
18be0 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a 0a 20 20   nEntry = 0;..  
18bf0 20 20 2f 2a 20 43 6f 6d 70 6f 73 65 20 61 6e 64    /* Compose and
18c00 20 70 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20   prepare an SQL 
18c10 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f  statement to loo
18c20 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  p through the co
18c30 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  ntent table */. 
18c40 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
18c50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
18c60 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70 2d  "SELECT %s" , p-
18c70 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b  >zReadExprlist);
18c80 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29  .    if( !zSql )
18c90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
18ca0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
18cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
18cc0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
18cd0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
18ce0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
18cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
18d00 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
18d10 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
18d20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18d30 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
18d40 65 6f 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e  eof(u32) * (p->n
18d50 43 6f 6c 75 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20  Column+1)*3;.   
18d60 20 20 20 61 53 7a 20 3d 20 28 75 33 32 20 2a 29     aSz = (u32 *)
18d70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
18d80 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
18d90 20 61 53 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   aSz==0 ){.     
18da0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18db0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
18dc0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
18dd0 74 28 61 53 7a 2c 20 30 2c 20 6e 42 79 74 65 29  t(aSz, 0, nByte)
18de0 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73  ;.        aSzIns
18df0 20 3d 20 26 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75   = &aSz[p->nColu
18e00 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  mn+1];.        a
18e10 53 7a 44 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b  SzDel = &aSzIns[
18e20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20  p->nColumn+1];. 
18e30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18e40 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
18e50 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
18e60 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
18e70 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
18e80 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
18e90 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
18ea0 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c  ingTermsDocid(p,
18eb0 20 0a 20 20 20 20 20 20 20 20 20 20 6c 61 6e 67   .          lang
18ec0 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c 20  idFromSelect(p, 
18ed0 70 53 74 6d 74 29 2c 20 73 71 6c 69 74 65 33 5f  pStmt), sqlite3_
18ee0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
18ef0 6d 74 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a  mt, 0).      );.
18f00 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f        aSz[p->nCo
18f10 6c 75 6d 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  lumn] = 0;.     
18f20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 72 63 3d   for(iCol=0; rc=
18f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43  =SQLITE_OK && iC
18f40 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ol<p->nColumn; i
18f50 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
18f60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
18f70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
18f80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
18f90 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31  xt(pStmt, iCol+1
18fa0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
18fb0 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
18fc0 41 64 64 28 70 2c 20 7a 2c 20 69 43 6f 6c 2c 20  Add(p, z, iCol, 
18fd0 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  &aSz[iCol]);.   
18fe0 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c       aSz[p->nCol
18ff0 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  umn] += sqlite3_
19000 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
19010 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20  mt, iCol+1);.   
19020 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
19030 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b  ->bHasDocsize ){
19040 0a 20 20 20 20 20 20 20 20 66 74 73 33 49 6e 73  .        fts3Ins
19050 65 72 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20  ertDocsize(&rc, 
19060 70 2c 20 61 53 7a 29 3b 0a 20 20 20 20 20 20 7d  p, aSz);.      }
19070 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19090 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
190a0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
190b0 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a       pStmt = 0;.
190c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
190d0 20 20 20 20 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20       nEntry++;. 
190e0 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d         for(iCol=
190f0 30 3b 20 69 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c  0; iCol<=p->nCol
19100 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  umn; iCol++){.  
19110 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73 5b 69          aSzIns[i
19120 43 6f 6c 5d 20 2b 3d 20 61 53 7a 5b 69 43 6f 6c  Col] += aSz[iCol
19130 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
19140 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
19150 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29  f( p->bHasStat )
19160 7b 0a 20 20 20 20 20 20 66 74 73 33 55 70 64 61  {.      fts3Upda
19170 74 65 44 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c  teDocTotals(&rc,
19180 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44   p, aSzIns, aSzD
19190 65 6c 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20  el, nEntry);.   
191a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
191b0 72 65 65 28 61 53 7a 29 3b 0a 0a 20 20 20 20 69  ree(aSz);..    i
191c0 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
191d0 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
191e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
191f0 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
19200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19210 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
19220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19230 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
19240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  ;.}../*.** Handl
19250 65 20 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e  e a 'special' IN
19260 53 45 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d  SERT of the form
19270 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52  :.**.**   "INSER
19280 54 20 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20  T INTO tbl(tbl) 
19290 56 41 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a  VALUES(<expr>)".
192a0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
192b0 56 61 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Val contains the
192c0 20 72 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72   result of <expr
192d0 3e 2e 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65  >. Currently the
192e0 20 6f 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e   only .** meanin
192f0 67 66 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e  gful value to in
19300 73 65 72 74 20 69 73 20 74 68 65 20 74 65 78 74  sert is the text
19310 20 27 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a   'optimize'..*/.
19320 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
19330 70 65 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73  pecialInsert(Fts
19340 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74  3Table *p, sqlit
19350 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b  e3_value *pVal){
19360 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
19390 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
193a0 72 20 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74  r *zVal = (const
193b0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
193c0 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
193d0 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73  ;.  int nVal = s
193e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
193f0 65 73 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28  es(pVal);..  if(
19400 20 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65   !zVal ){.    re
19410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19420 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  M;.  }else if( n
19430 56 61 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c  Val==8 && 0==sql
19440 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
19450 61 6c 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20  al, "optimize", 
19460 38 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  8) ){.    rc = f
19470 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c  ts3DoOptimize(p,
19480 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
19490 20 6e 56 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73   nVal==7 && 0==s
194a0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
194b0 7a 56 61 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c  zVal, "rebuild",
194c0 20 37 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   7) ){.    rc = 
194d0 66 74 73 33 44 6f 52 65 62 75 69 6c 64 28 70 29  fts3DoRebuild(p)
194e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
194f0 54 45 53 54 0a 20 20 7d 65 6c 73 65 20 69 66 28  TEST.  }else if(
19500 20 6e 56 61 6c 3e 39 20 26 26 20 30 3d 3d 73 71   nVal>9 && 0==sq
19510 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
19520 56 61 6c 2c 20 22 6e 6f 64 65 73 69 7a 65 3d 22  Val, "nodesize="
19530 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  , 9) ){.    p->n
19540 4e 6f 64 65 53 69 7a 65 20 3d 20 61 74 6f 69 28  NodeSize = atoi(
19550 26 7a 56 61 6c 5b 39 5d 29 3b 0a 20 20 20 20 72  &zVal[9]);.    r
19560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19570 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e   }else if( nVal>
19580 31 31 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  11 && 0==sqlite3
19590 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20  _strnicmp(zVal, 
195a0 22 6d 61 78 70 65 6e 64 69 6e 67 3d 22 2c 20 39  "maxpending=", 9
195b0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78  ) ){.    p->nMax
195c0 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 61 74  PendingData = at
195d0 6f 69 28 26 7a 56 61 6c 5b 31 31 5d 29 3b 0a 20  oi(&zVal[11]);. 
195e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
195f0 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  K;.#endif.  }els
19600 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
19610 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
19620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19630 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
19640 63 61 63 68 65 64 20 64 65 66 65 72 72 65 64 20  cached deferred 
19650 64 6f 63 6c 69 73 74 73 2e 20 44 65 66 65 72 72  doclists. Deferr
19660 65 64 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20  ed doclists are 
19670 63 61 63 68 65 64 0a 2a 2a 20 28 61 6c 6c 6f 63  cached.** (alloc
19680 61 74 65 64 29 20 62 79 20 74 68 65 20 73 71 6c  ated) by the sql
19690 69 74 65 33 46 74 73 33 43 61 63 68 65 44 65 66  ite3Fts3CacheDef
196a0 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 29 20  erredDoclists() 
196b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
196c0 64 20 73 71 6c 69 74 65 33 46 74 73 33 46 72 65  d sqlite3Fts3Fre
196d0 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74  eDeferredDoclist
196e0 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43  s(Fts3Cursor *pC
196f0 73 72 29 7b 0a 20 20 46 74 73 33 44 65 66 65 72  sr){.  Fts3Defer
19700 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 3b 0a  redToken *pDef;.
19710 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d    for(pDef=pCsr-
19720 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66  >pDeferred; pDef
19730 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65  ; pDef=pDef->pNe
19740 78 74 29 7b 0a 20 20 20 20 66 74 73 33 50 65 6e  xt){.    fts3Pen
19750 64 69 6e 67 4c 69 73 74 44 65 6c 65 74 65 28 70  dingListDelete(p
19760 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  Def->pList);.   
19770 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 3d 20 30   pDef->pList = 0
19780 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
19790 72 65 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  ree all entries 
197a0 69 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65  in the pCsr->pDe
197b0 66 66 65 72 65 64 20 6c 69 73 74 2e 20 45 6e 74  ffered list. Ent
197c0 72 69 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ries are added t
197d0 6f 20 0a 2a 2a 20 74 68 69 73 20 6c 69 73 74 20  o .** this list 
197e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 46 74 73  using sqlite3Fts
197f0 33 44 65 66 65 72 54 6f 6b 65 6e 28 29 2e 0a 2a  3DeferToken()..*
19800 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
19810 73 33 46 72 65 65 44 65 66 65 72 72 65 64 54 6f  s3FreeDeferredTo
19820 6b 65 6e 73 28 46 74 73 33 43 75 72 73 6f 72 20  kens(Fts3Cursor 
19830 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 33 44 65  *pCsr){.  Fts3De
19840 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65  ferredToken *pDe
19850 66 3b 0a 20 20 46 74 73 33 44 65 66 65 72 72 65  f;.  Fts3Deferre
19860 64 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b 0a 20  dToken *pNext;. 
19870 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e   for(pDef=pCsr->
19880 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 3b  pDeferred; pDef;
19890 20 70 44 65 66 3d 70 4e 65 78 74 29 7b 0a 20 20   pDef=pNext){.  
198a0 20 20 70 4e 65 78 74 20 3d 20 70 44 65 66 2d 3e    pNext = pDef->
198b0 70 4e 65 78 74 3b 0a 20 20 20 20 66 74 73 33 50  pNext;.    fts3P
198c0 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74 65  endingListDelete
198d0 28 70 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a 20  (pDef->pList);. 
198e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
198f0 70 44 65 66 29 3b 0a 20 20 7d 0a 20 20 70 43 73  pDef);.  }.  pCs
19900 72 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20 30  r->pDeferred = 0
19910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
19920 61 74 65 20 64 65 66 65 72 72 65 64 2d 64 6f 63  ate deferred-doc
19930 6c 69 73 74 73 20 66 6f 72 20 61 6c 6c 20 74 6f  lists for all to
19940 6b 65 6e 73 20 69 6e 20 74 68 65 20 70 43 73 72  kens in the pCsr
19950 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69 73 74  ->pDeferred list
19960 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
19970 20 72 6f 77 20 74 68 61 74 20 70 43 73 72 20 63   row that pCsr c
19980 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
19990 74 6f 2e 0a 2a 2a 0a 2a 2a 20 41 20 64 65 66 65  to..**.** A defe
199a0 72 72 65 64 2d 64 6f 63 6c 69 73 74 20 69 73 20  rred-doclist is 
199b0 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65 72 20 64  like any other d
199c0 6f 63 6c 69 73 74 20 77 69 74 68 20 70 6f 73 69  oclist with posi
199d0 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
199e0 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 2c 20 65 78  .** included, ex
199f0 63 65 70 74 20 74 68 61 74 20 69 74 20 6f 6e 6c  cept that it onl
19a00 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  y contains entri
19a10 65 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  es for a single 
19a20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  row of the.** ta
19a30 62 6c 65 2c 20 6e 6f 74 20 66 6f 72 20 61 6c 6c  ble, not for all
19a40 20 72 6f 77 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71   rows..*/.int sq
19a50 6c 69 74 65 33 46 74 73 33 43 61 63 68 65 44 65  lite3Fts3CacheDe
19a60 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 46  ferredDoclists(F
19a70 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ts3Cursor *pCsr)
19a80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19a90 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
19aa0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
19ab0 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 43 73 72  de */.  if( pCsr
19ac0 2d 3e 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20  ->pDeferred ){. 
19ad0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
19b00 61 74 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c  ate through tabl
19b10 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  e columns */.   
19b20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
19b30 44 6f 63 69 64 3b 20 20 20 20 20 20 20 20 20 2f  Docid;         /
19b40 2a 20 44 6f 63 69 64 20 6f 66 20 74 68 65 20 72  * Docid of the r
19b50 6f 77 20 70 43 73 72 20 70 6f 69 6e 74 73 20 74  ow pCsr points t
19b60 6f 20 2a 2f 0a 20 20 20 20 46 74 73 33 44 65 66  o */.    Fts3Def
19b70 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66  erredToken *pDef
19b80 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74  ;      /* Used t
19b90 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
19ba0 68 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  h deferred token
19bb0 73 20 2a 2f 0a 20 20 0a 20 20 20 20 46 74 73 33  s */.  .    Fts3
19bc0 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
19bd0 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61  Table *)pCsr->ba
19be0 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 73 71  se.pVtab;.    sq
19bf0 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20  lite3_tokenizer 
19c00 2a 70 54 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69  *pT = p->pTokeni
19c10 7a 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  zer;.    sqlite3
19c20 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
19c30 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65  e const *pModule
19c40 20 3d 20 70 54 2d 3e 70 4d 6f 64 75 6c 65 3b 0a   = pT->pModule;.
19c50 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
19c60 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72 65 53  pCsr->isRequireS
19c70 65 65 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 69 44  eek==0 );.    iD
19c80 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ocid = sqlite3_c
19c90 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 43 73 72  olumn_int64(pCsr
19ca0 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 0a  ->pStmt, 0);.  .
19cb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
19cc0 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 72 63 3d  ->nColumn && rc=
19cd0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
19ce0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
19cf0 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e  ar *zText = (con
19d00 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
19d10 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43  3_column_text(pC
19d20 73 72 2d 3e 70 53 74 6d 74 2c 20 69 2b 31 29 3b  sr->pStmt, i+1);
19d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
19d40 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20  okenizer_cursor 
19d50 2a 70 54 43 20 3d 20 30 3b 0a 20 20 0a 20 20 20  *pTC = 0;.  .   
19d60 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d     rc = pModule-
19d70 3e 78 4f 70 65 6e 28 70 54 2c 20 7a 54 65 78 74  >xOpen(pT, zText
19d80 2c 20 2d 31 2c 20 26 70 54 43 29 3b 0a 20 20 20  , -1, &pTC);.   
19d90 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
19da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19db0 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
19dc0 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20  Token;       /* 
19dd0 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
19de0 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  g token */.     
19df0 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 20 20     int nToken;  
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e10 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
19e20 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  in token */.    
19e30 20 20 20 20 69 6e 74 20 69 44 75 6d 31 2c 20 69      int iDum1, i
19e40 44 75 6d 32 3b 20 20 20 20 20 20 20 20 20 2f 2a  Dum2;         /*
19e50 20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73   Dummy variables
19e60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
19e70 69 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20  iPos;           
19e80 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
19e90 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54  n of token in zT
19ea0 65 78 74 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20  ext */.  .      
19eb0 20 20 70 54 43 2d 3e 70 54 6f 6b 65 6e 69 7a 65    pTC->pTokenize
19ec0 72 20 3d 20 70 54 3b 0a 20 20 20 20 20 20 20 20  r = pT;.        
19ed0 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e  rc = pModule->xN
19ee0 65 78 74 28 70 54 43 2c 20 26 7a 54 6f 6b 65 6e  ext(pTC, &zToken
19ef0 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d  , &nToken, &iDum
19f00 31 2c 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73  1, &iDum2, &iPos
19f10 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
19f20 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72  Def=pCsr->pDefer
19f30 72 65 64 3b 20 70 44 65 66 20 26 26 20 72 63 3d  red; pDef && rc=
19f40 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65 66  =SQLITE_OK; pDef
19f50 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pDef->pNext){. 
19f60 20 20 20 20 20 20 20 20 20 46 74 73 33 50 68 72           Fts3Phr
19f70 61 73 65 54 6f 6b 65 6e 20 2a 70 50 54 20 3d 20  aseToken *pPT = 
19f80 70 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b 0a 20 20  pDef->pToken;.  
19f90 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
19fa0 66 2d 3e 69 43 6f 6c 3e 3d 70 2d 3e 6e 43 6f 6c  f->iCol>=p->nCol
19fb0 75 6d 6e 20 7c 7c 20 70 44 65 66 2d 3e 69 43 6f  umn || pDef->iCo
19fc0 6c 3d 3d 69 29 0a 20 20 20 20 20 20 20 20 20 20  l==i).          
19fd0 20 26 26 20 28 70 50 54 2d 3e 62 46 69 72 73 74   && (pPT->bFirst
19fe0 3d 3d 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29 0a  ==0 || iPos==0).
19ff0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
1a000 50 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c  PT->n==nToken ||
1a010 20 28 70 50 54 2d 3e 69 73 50 72 65 66 69 78 20   (pPT->isPrefix 
1a020 26 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e  && pPT->n<nToken
1a030 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  )).           &&
1a040 20 28 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54 6f 6b   (0==memcmp(zTok
1a050 65 6e 2c 20 70 50 54 2d 3e 7a 2c 20 70 50 54 2d  en, pPT->z, pPT-
1a060 3e 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  >n)).          )
1a070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
1a080 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
1a090 65 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69 73 74  end(&pDef->pList
1a0a0 2c 20 69 44 6f 63 69 64 2c 20 69 2c 20 69 50 6f  , iDocid, i, iPo
1a0b0 73 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  s, &rc);.       
1a0c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1a0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a0e0 20 70 54 43 20 29 20 70 4d 6f 64 75 6c 65 2d 3e   pTC ) pModule->
1a0f0 78 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20 20 20  xClose(pTC);.   
1a100 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a110 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
1a120 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1a130 20 0a 20 20 20 20 66 6f 72 28 70 44 65 66 3d 70   .    for(pDef=p
1a140 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20  Csr->pDeferred; 
1a150 70 44 65 66 20 26 26 20 72 63 3d 3d 53 51 4c 49  pDef && rc==SQLI
1a160 54 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66  TE_OK; pDef=pDef
1a170 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1a180 69 66 28 20 70 44 65 66 2d 3e 70 4c 69 73 74 20  if( pDef->pList 
1a190 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a1a0 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
1a1b0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 44 65  ppendVarint(&pDe
1a1c0 66 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20  f->pList, 0);.  
1a1d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a1e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a1f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
1a200 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69 73  DeferredTokenLis
1a210 74 28 0a 20 20 46 74 73 33 44 65 66 65 72 72 65  t(.  Fts3Deferre
1a220 64 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63 68  dToken *p, .  ch
1a230 61 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20 20  ar **ppData, .  
1a240 69 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a 20  int *pnData.){. 
1a250 20 63 68 61 72 20 2a 70 52 65 74 3b 0a 20 20 69   char *pRet;.  i
1a260 6e 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c 69  nt nSkip;.  sqli
1a270 74 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79 3b  te3_int64 dummy;
1a280 0a 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 30 3b  ..  *ppData = 0;
1a290 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a  .  *pnData = 0;.
1a2a0 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d  .  if( p->pList=
1a2b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1a2c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1a2d0 0a 20 20 70 52 65 74 20 3d 20 28 63 68 61 72 20  .  pRet = (char 
1a2e0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
1a2f0 28 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61  (p->pList->nData
1a300 29 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20 29  );.  if( !pRet )
1a310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1a320 4f 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20 3d  OMEM;..  nSkip =
1a330 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
1a340 61 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e  arint(p->pList->
1a350 61 44 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b 0a  aData, &dummy);.
1a360 20 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e 70    *pnData = p->p
1a370 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e 53  List->nData - nS
1a380 6b 69 70 3b 0a 20 20 2a 70 70 44 61 74 61 20 3d  kip;.  *ppData =
1a390 20 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d 63   pRet;.  .  memc
1a3a0 70 79 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c 69  py(pRet, &p->pLi
1a3b0 73 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70 5d  st->aData[nSkip]
1a3c0 2c 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72 65  , *pnData);.  re
1a3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a3e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1a3f0 65 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e 20  entry for token 
1a400 70 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70 43  pToken to the pC
1a410 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69  sr->pDeferred li
1a420 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
1a430 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e  e3Fts3DeferToken
1a440 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  (.  Fts3Cursor *
1a450 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCsr,           
1a460 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c      /* Fts3 tabl
1a470 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74  e cursor */.  Ft
1a480 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
1a490 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a  Token,        /*
1a4a0 20 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 20   Token to defer 
1a4b0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
1a4e0 68 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20 61  hat token must a
1a4f0 70 70 65 61 72 20 69 6e 20 28 6f 72 20 2d 31 29  ppear in (or -1)
1a500 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65 66   */.){.  Fts3Def
1a510 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66  erredToken *pDef
1a520 65 72 72 65 64 3b 0a 20 20 70 44 65 66 65 72 72  erred;.  pDeferr
1a530 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
1a540 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44 65 66  loc(sizeof(*pDef
1a550 65 72 72 65 64 29 29 3b 0a 20 20 69 66 28 20 21  erred));.  if( !
1a560 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20  pDeferred ){.   
1a570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1a580 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
1a590 65 74 28 70 44 65 66 65 72 72 65 64 2c 20 30 2c  et(pDeferred, 0,
1a5a0 20 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72 72   sizeof(*pDeferr
1a5b0 65 64 29 29 3b 0a 20 20 70 44 65 66 65 72 72 65  ed));.  pDeferre
1a5c0 64 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f 6b  d->pToken = pTok
1a5d0 65 6e 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d  en;.  pDeferred-
1a5e0 3e 70 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e 70  >pNext = pCsr->p
1a5f0 44 65 66 65 72 72 65 64 3b 20 0a 20 20 70 44 65  Deferred; .  pDe
1a600 66 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20 69  ferred->iCol = i
1a610 43 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44 65  Col;.  pCsr->pDe
1a620 66 65 72 72 65 64 20 3d 20 70 44 65 66 65 72 72  ferred = pDeferr
1a630 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ed;..  assert( p
1a640 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64  Token->pDeferred
1a650 3d 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e 2d  ==0 );.  pToken-
1a660 3e 70 44 65 66 65 72 72 65 64 20 3d 20 70 44 65  >pDeferred = pDe
1a670 66 65 72 72 65 64 3b 0a 0a 20 20 72 65 74 75 72  ferred;..  retur
1a680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a690 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61 6c  /*.** SQLite val
1a6a0 75 65 20 70 52 6f 77 69 64 20 63 6f 6e 74 61 69  ue pRowid contai
1a6b0 6e 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  ns the rowid of 
1a6c0 61 20 72 6f 77 20 74 68 61 74 20 6d 61 79 20 6f  a row that may o
1a6d0 72 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  r may not be.** 
1a6e0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 46  present in the F
1a6f0 54 53 33 20 74 61 62 6c 65 2e 20 49 66 20 69 74  TS3 table. If it
1a700 20 69 73 2c 20 64 65 6c 65 74 65 20 69 74 20 61   is, delete it a
1a710 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f  nd adjust the co
1a720 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75 62  ntents.** of sub
1a730 73 69 64 75 61 72 79 20 64 61 74 61 20 73 74 72  siduary data str
1a740 75 63 74 75 72 65 73 20 61 63 63 6f 72 64 69 6e  uctures accordin
1a750 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  gly..*/.static i
1a760 6e 74 20 66 74 73 33 44 65 6c 65 74 65 42 79 52  nt fts3DeleteByR
1a770 6f 77 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c  owid(.  Fts3Tabl
1a780 65 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 33  e *p, .  sqlite3
1a790 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20  _value *pRowid, 
1a7a0 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 2c 0a 20  .  int *pnDoc,. 
1a7b0 20 75 33 32 20 2a 61 53 7a 44 65 6c 0a 29 7b 0a   u32 *aSzDel.){.
1a7c0 20 20 69 6e 74 20 69 73 45 6d 70 74 79 20 3d 20    int isEmpty = 
1a7d0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74  0;.  int rc = ft
1a7e0 73 33 49 73 45 6d 70 74 79 28 70 2c 20 70 52 6f  s3IsEmpty(p, pRo
1a7f0 77 69 64 2c 20 26 69 73 45 6d 70 74 79 29 3b 0a  wid, &isEmpty);.
1a800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a810 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69  _OK ){.    if( i
1a820 73 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20  sEmpty ){.      
1a830 2f 2a 20 44 65 6c 65 74 69 6e 67 20 74 68 69 73  /* Deleting this
1a840 20 72 6f 77 20 6d 65 61 6e 73 20 74 68 65 20 77   row means the w
1a850 68 6f 6c 65 20 74 61 62 6c 65 20 69 73 20 65 6d  hole table is em
1a860 70 74 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pty. In this cas
1a870 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74  e.      ** delet
1a880 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1a890 66 20 61 6c 6c 20 74 68 72 65 65 20 74 61 62 6c  f all three tabl
1a8a0 65 73 20 61 6e 64 20 74 68 72 6f 77 20 61 77 61  es and throw awa
1a8b0 79 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 64  y any.      ** d
1a8c0 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64 69  ata in the pendi
1a8d0 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61 62  ngTerms hash tab
1a8e0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 72 63  le.  */.      rc
1a8f0 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c   = fts3DeleteAll
1a900 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 2a 70  (p, 1);.      *p
1a910 6e 44 6f 63 20 3d 20 2a 70 6e 44 6f 63 20 2d 20  nDoc = *pnDoc - 
1a920 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1a930 20 20 20 20 66 74 73 33 44 65 6c 65 74 65 54 65      fts3DeleteTe
1a940 72 6d 73 28 26 72 63 2c 20 70 2c 20 70 52 6f 77  rms(&rc, p, pRow
1a950 69 64 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20  id, aSzDel);.   
1a960 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65     if( p->zConte
1a970 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ntTbl==0 ){.    
1a980 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28      fts3SqlExec(
1a990 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
1a9a0 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 26 70 52 6f  TE_CONTENT, &pRo
1a9b0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  wid);.        if
1a9c0 28 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  ( sqlite3_change
1a9d0 73 28 70 2d 3e 64 62 29 20 29 20 2a 70 6e 44 6f  s(p->db) ) *pnDo
1a9e0 63 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31 3b 0a  c = *pnDoc - 1;.
1a9f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1aa00 20 20 20 20 20 2a 70 6e 44 6f 63 20 3d 20 2a 70       *pnDoc = *p
1aa10 6e 44 6f 63 20 2d 20 31 3b 0a 20 20 20 20 20 20  nDoc - 1;.      
1aa20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62  }.      if( p->b
1aa30 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20  HasDocsize ){.  
1aa40 20 20 20 20 20 20 66 74 73 33 53 71 6c 45 78 65        fts3SqlExe
1aa50 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
1aa60 4c 45 54 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70  LETE_DOCSIZE, &p
1aa70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Rowid);.      }.
1aa80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1aa90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1aaa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
1aab0 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72  oes the work for
1aac0 20 74 68 65 20 78 55 70 64 61 74 65 20 6d 65 74   the xUpdate met
1aad0 68 6f 64 20 6f 66 20 46 54 53 33 20 76 69 72 74  hod of FTS3 virt
1aae0 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54  ual.** tables. T
1aaf0 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
1ab00 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 62   virtual table b
1ab10 65 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  eing:.**.**     
1ab20 43 52 45 41 54 45 20 54 41 42 4c 45 20 3c 74 61  CREATE TABLE <ta
1ab30 62 6c 65 20 6e 61 6d 65 3e 28 20 0a 2a 2a 20 20  ble name>( .**  
1ab40 20 20 20 20 20 3c 75 73 65 72 20 43 4f 4c 55 4d       <user COLUM
1ab50 6e 73 3e 2c 0a 2a 2a 20 20 20 20 20 20 20 3c 74  ns>,.**       <t
1ab60 61 62 6c 65 20 6e 61 6d 65 3e 20 48 49 44 44 45  able name> HIDDE
1ab70 4e 2c 20 0a 2a 2a 20 20 20 20 20 20 20 64 6f 63  N, .**       doc
1ab80 69 64 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20  id HIDDEN, .**  
1ab90 20 20 20 20 20 3c 6c 61 6e 67 69 64 3e 20 48 49       <langid> HI
1aba0 44 44 45 4e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a  DDEN.**     );.*
1abb0 2a 0a 2a 2a 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  *.** .*/.int sql
1abc0 69 74 65 33 46 74 73 33 55 70 64 61 74 65 4d 65  ite3Fts3UpdateMe
1abd0 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
1abe0 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20  vtab *pVtab,    
1abf0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
1ac00 76 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  vtab object */. 
1ac10 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67 75   /* Size of argu
1ac40 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  ment array */.  
1ac50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1ac60 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20  apVal,          
1ac70 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
1ac80 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ments */.  sqlit
1ac90 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 20  e_int64 *pRowid 
1aca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1acb0 54 3a 20 54 68 65 20 61 66 66 65 63 74 65 64 20  T: The affected 
1acc0 28 6f 72 20 65 66 66 65 63 74 65 64 29 20 72 6f  (or effected) ro
1acd0 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  wid */.){.  Fts3
1ace0 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
1acf0 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20  Table *)pVtab;. 
1ad00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ad10 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1ad20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1ad30 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 6d 6f 76  */.  int isRemov
1ad40 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1ad50 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1ad60 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
1ad70 4c 45 54 45 20 2a 2f 0a 20 20 75 33 32 20 2a 61  LETE */.  u32 *a
1ad80 53 7a 49 6e 73 20 3d 20 30 3b 20 20 20 20 20 20  SzIns = 0;      
1ad90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ada0 65 73 20 6f 66 20 69 6e 73 65 72 74 65 64 20 64  es of inserted d
1adb0 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 75 33  ocuments */.  u3
1adc0 32 20 2a 61 53 7a 44 65 6c 3b 20 20 20 20 20 20  2 *aSzDel;      
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ade0 20 53 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65   Sizes of delete
1adf0 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20  d documents */. 
1ae00 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 20   int nChng = 0; 
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae20 20 2f 2a 20 4e 65 74 20 63 68 61 6e 67 65 20 69   /* Net change i
1ae30 6e 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75  n number of docu
1ae40 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62  ments */.  int b
1ae50 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 30 3b 0a  InsertDone = 0;.
1ae60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
1ae70 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20  egments==0 );.  
1ae80 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 6e  assert( .      n
1ae90 41 72 67 3d 3d 31 20 20 20 20 20 20 20 20 20 20  Arg==1          
1aea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 45             /* DE
1aeb0 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
1aec0 2a 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d 28  */.   || nArg==(
1aed0 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b  2 + p->nColumn +
1aee0 20 33 29 20 20 2f 2a 20 49 4e 53 45 52 54 20 6f   3)  /* INSERT o
1aef0 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  r UPDATE operati
1af00 6f 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20 2f  ons */.  );..  /
1af10 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22 73  * Check for a "s
1af20 70 65 63 69 61 6c 22 20 49 4e 53 45 52 54 20 6f  pecial" INSERT o
1af30 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66  peration. One of
1af40 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
1af50 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e    **   INSERT IN
1af60 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55  TO xyz(xyz) VALU
1af70 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a 20  ES('command');. 
1af80 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31   */.  if( nArg>1
1af90 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f   .   && sqlite3_
1afa0 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
1afb0 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
1afc0 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  L .   && sqlite3
1afd0 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
1afe0 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29  l[p->nColumn+2])
1aff0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20  !=SQLITE_NULL . 
1b000 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
1b010 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28 70  3SpecialInsert(p
1b020 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75  , apVal[p->nColu
1b030 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74 6f  mn+2]);.    goto
1b040 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d   update_out;.  }
1b050 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26  ..  if( nArg>1 &
1b060 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
1b070 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70 2d  int(apVal[2 + p-
1b080 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c 30  >nColumn + 2])<0
1b090 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1b0a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
1b0b0 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
1b0c0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  out;.  }..  /* A
1b0d0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
1b0e0 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67 65   hold the change
1b0f0 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a   in document siz
1b100 65 73 20 2a 2f 0a 20 20 61 53 7a 49 6e 73 20 3d  es */.  aSzIns =
1b110 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1b120 20 73 69 7a 65 6f 66 28 61 53 7a 49 6e 73 5b 30   sizeof(aSzIns[0
1b130 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ])*(p->nColumn+1
1b140 29 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 53 7a  )*2 );.  if( aSz
1b150 49 6e 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Ins==0 ){.    rc
1b160 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1b170 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
1b180 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a 44  _out;.  }.  aSzD
1b190 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b 70 2d 3e  el = &aSzIns[p->
1b1a0 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d 65  nColumn+1];.  me
1b1b0 6d 73 65 74 28 61 53 7a 49 6e 73 2c 20 30 2c 20  mset(aSzIns, 0, 
1b1c0 73 69 7a 65 6f 66 28 61 53 7a 49 6e 73 5b 30 5d  sizeof(aSzIns[0]
1b1d0 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29  )*(p->nColumn+1)
1b1e0 2a 32 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  *2);..  /* If th
1b1f0 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20  is is an INSERT 
1b200 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 61 6e  operation, or an
1b210 20 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f 64   UPDATE that mod
1b220 69 66 69 65 73 20 74 68 65 20 72 6f 77 69 64 0a  ifies the rowid.
1b230 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68 65 6e    ** value, then
1b240 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
1b250 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74 72 61  requires constra
1b260 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  int handling..  
1b270 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  **.  ** If the o
1b280 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20  n-conflict mode 
1b290 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 69 73  is REPLACE, this
1b2a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b2b0 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20 20 2a  existing row.  *
1b2c0 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 65  * should be dele
1b2d0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
1b2e0 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e 73  abase before ins
1b2f0 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 72  erting the new r
1b300 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69 66 20  ow. Or,.  ** if 
1b310 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20  the on-conflict 
1b320 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20 74 68  mode is other th
1b330 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68 65 6e  an REPLACE, then
1b340 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d 75 73   this method mus
1b350 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  t.  ** detect th
1b360 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64 20 72  e conflict and r
1b370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
1b380 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65 20 62  STRAINT before b
1b390 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a  eginning to.  **
1b3a0 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
1b3b0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
1b3c0 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
1b3d0 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d  p->zContentTbl==
1b3e0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e 64  0 ){.    /* Find
1b3f0 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a 65 63   the value objec
1b400 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  t that holds the
1b410 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c 75 65   new rowid value
1b420 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1b430 5f 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f 77 69  _value *pNewRowi
1b440 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e  d = apVal[3+p->n
1b450 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69 66 28  Column];.    if(
1b460 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1b470 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29 3d 3d  ype(pNewRowid)==
1b480 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
1b490 20 20 20 20 20 70 4e 65 77 52 6f 77 69 64 20 3d       pNewRowid =
1b4a0 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d   apVal[1];.    }
1b4b0 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
1b4c0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e 65  3_value_type(pNe
1b4d0 77 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45 5f  wRowid)!=SQLITE_
1b4e0 4e 55 4c 4c 20 26 26 20 28 20 0a 20 20 20 20 20  NULL && ( .     
1b4f0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
1b500 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d  _type(apVal[0])=
1b510 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20  =SQLITE_NULL.   
1b520 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c    || sqlite3_val
1b530 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30  ue_int64(apVal[0
1b540 5d 29 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ])!=sqlite3_valu
1b550 65 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f 77 69  e_int64(pNewRowi
1b560 64 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  d).    )){.     
1b570 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69   /* The new rowi
1b580 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 69  d is not NULL (i
1b590 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
1b5a0 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a 20 20  rowid will be.  
1b5b0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
1b5c0 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 61 6e  ally assigned an
1b5d0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  d there is no ch
1b5e0 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66 6c 69  ance of a confli
1b5f0 63 74 29 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ct), and .      
1b600 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
1b610 20 69 73 20 65 69 74 68 65 72 20 61 6e 20 49 4e   is either an IN
1b620 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44 41 54  SERT or an UPDAT
1b630 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20  E that modifies 
1b640 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77  the.      ** row
1b650 69 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20 69 66  id column. So if
1b660 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d 6f   the conflict mo
1b670 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74  de is REPLACE, t
1b680 68 65 6e 20 64 65 6c 65 74 65 20 61 6e 79 0a 20  hen delete any. 
1b690 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67       ** existing
1b6a0 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64 3d   row with rowid=
1b6b0 70 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20 20 20  pNewRowid. .    
1b6c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72    **.      ** Or
1b6d0 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63  , if the conflic
1b6e0 74 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20 52 45  t mode is not RE
1b6f0 50 4c 41 43 45 2c 20 69 6e 73 65 72 74 20 74 68  PLACE, insert th
1b700 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  e new record int
1b710 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  o .      ** the 
1b720 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
1b730 20 49 66 20 77 65 20 68 69 74 20 74 68 65 20 64   If we hit the d
1b740 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20 63  uplicate rowid c
1b750 6f 6e 73 74 72 61 69 6e 74 20 28 6f 72 20 61 6e  onstraint (or an
1b760 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
1b770 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20 64 6f   error) while do
1b780 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e 20 69  ing so, return i
1b790 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
1b7a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
1b7b0 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 61 6c  is branch may al
1b7c0 73 6f 20 72 75 6e 20 69 66 20 70 4e 65 77 52 6f  so run if pNewRo
1b7d0 77 69 64 20 63 6f 6e 74 61 69 6e 73 20 61 20 76  wid contains a v
1b7e0 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e 6f 74  alue that cannot
1b7f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6c 6f 73  .      ** be los
1b800 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65  slessly converte
1b810 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  d to an integer.
1b820 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1b830 68 65 20 65 76 65 6e 74 75 61 6c 20 0a 20 20 20  he eventual .   
1b840 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74     ** call to ft
1b850 73 33 49 6e 73 65 72 74 44 61 74 61 28 29 20 28  s3InsertData() (
1b860 65 69 74 68 65 72 20 6a 75 73 74 20 62 65 6c 6f  either just belo
1b870 77 20 6f 72 20 66 75 72 74 68 65 72 20 6f 6e 20  w or further on 
1b880 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  in this.      **
1b890 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c 6c 20   function) will 
1b8a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1b8b0 53 4d 41 54 43 48 2e 20 49 66 20 66 74 73 33 44  SMATCH. If fts3D
1b8c0 65 6c 65 74 65 42 79 52 6f 77 69 64 20 69 73 20  eleteByRowid is 
1b8d0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 65  .      ** invoke
1b8e0 64 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c 65 74  d, it will delet
1b8f0 65 20 7a 65 72 6f 20 72 6f 77 73 20 28 73 69 6e  e zero rows (sin
1b900 63 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c 20 68  ce no row will h
1b910 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63  ave.      ** doc
1b920 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20 69 66  id=$pNewRowid if
1b930 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73 20 6e   $pNewRowid is n
1b940 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ot an integer va
1b950 6c 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lue)..      */. 
1b960 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1b970 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63  _vtab_on_conflic
1b980 74 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49 54 45  t(p->db)==SQLITE
1b990 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20  _REPLACE ){.    
1b9a0 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c      rc = fts3Del
1b9b0 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20 70 4e  eteByRowid(p, pN
1b9c0 65 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e 67 2c  ewRowid, &nChng,
1b9d0 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 20 20   aSzDel);.      
1b9e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1b9f0 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44 61  c = fts3InsertDa
1ba00 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f  ta(p, apVal, pRo
1ba10 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 49  wid);.        bI
1ba20 6e 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  nsertDone = 1;. 
1ba30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ba40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ba50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
1ba60 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d   update_out;.  }
1ba70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1ba80 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55 50  s a DELETE or UP
1ba90 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20  DATE operation, 
1baa0 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 20 72  remove the old r
1bab0 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ecord. */.  if( 
1bac0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1bad0 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d 53 51  pe(apVal[0])!=SQ
1bae0 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
1baf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bb00 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
1bb10 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 49 4e  l[0])==SQLITE_IN
1bb20 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72 63 20  TEGER );.    rc 
1bb30 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f  = fts3DeleteByRo
1bb40 77 69 64 28 70 2c 20 61 70 56 61 6c 5b 30 5d 2c  wid(p, apVal[0],
1bb50 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c 29   &nChng, aSzDel)
1bb60 3b 0a 20 20 20 20 69 73 52 65 6d 6f 76 65 20 3d  ;.    isRemove =
1bb70 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
1bb80 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e  If this is an IN
1bb90 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f  SERT or UPDATE o
1bba0 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65 72 74  peration, insert
1bbb0 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e   the new record.
1bbc0 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31   */.  if( nArg>1
1bbd0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1bbe0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 62 49 6e  K ){.    if( bIn
1bbf0 73 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b 0a 20  sertDone==0 ){. 
1bc00 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
1bc10 73 65 72 74 44 61 74 61 28 70 2c 20 61 70 56 61  sertData(p, apVa
1bc20 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  l, pRowid);.    
1bc30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bc40 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
1bc50 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
1bc60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1bc70 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
1bc80 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  B;.      }.    }
1bc90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bca0 49 54 45 5f 4f 4b 20 26 26 20 28 21 69 73 52 65  ITE_OK && (!isRe
1bcb0 6d 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69 64 21  move || *pRowid!
1bcc0 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20 29  =p->iPrevDocid )
1bcd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
1bce0 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44  ts3PendingTermsD
1bcf0 6f 63 69 64 28 70 2c 20 0a 20 20 20 20 20 20 20  ocid(p, .       
1bd00 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
1bd10 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70  _int(apVal[2 + p
1bd20 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 2c  ->nColumn + 2]),
1bd30 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 6f 77  .          *pRow
1bd40 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
1bd50 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1bd60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bd70 20 61 73 73 65 72 74 28 20 70 2d 3e 69 50 72 65   assert( p->iPre
1bd80 76 44 6f 63 69 64 3d 3d 2a 70 52 6f 77 69 64 20  vDocid==*pRowid 
1bd90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
1bda0 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70 2c  s3InsertTerms(p,
1bdb0 20 61 70 56 61 6c 2c 20 61 53 7a 49 6e 73 29 3b   apVal, aSzIns);
1bdc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1bdd0 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b  ->bHasDocsize ){
1bde0 0a 20 20 20 20 20 20 66 74 73 33 49 6e 73 65 72  .      fts3Inser
1bdf0 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c  tDocsize(&rc, p,
1be00 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d 0a   aSzIns);.    }.
1be10 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 7d      nChng++;.  }
1be20 0a 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73 53  ..  if( p->bHasS
1be30 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73 33 55  tat ){.    fts3U
1be40 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 26  pdateDocTotals(&
1be50 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61  rc, p, aSzIns, a
1be60 53 7a 44 65 6c 2c 20 6e 43 68 6e 67 29 3b 0a 20  SzDel, nChng);. 
1be70 20 7d 0a 0a 20 75 70 64 61 74 65 5f 6f 75 74 3a   }.. update_out:
1be80 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1be90 61 53 7a 49 6e 73 29 3b 0a 20 20 73 71 6c 69 74  aSzIns);.  sqlit
1bea0 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c  e3Fts3SegmentsCl
1beb0 6f 73 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ose(p);.  return
1bec0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46   rc;.}../* .** F
1bed0 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 69 6e  lush any data in
1bee0 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
1bef0 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  ms hash table to
1bf00 20 64 69 73 6b 2e 20 49 66 20 73 75 63 63 65 73   disk. If succes
1bf10 73 66 75 6c 2c 0a 2a 2a 20 6d 65 72 67 65 20 61  sful,.** merge a
1bf20 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ll segments in t
1bf30 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 63  he database (inc
1bf40 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 73  luding the new s
1bf50 65 67 6d 65 6e 74 2c 20 69 66 20 0a 2a 2a 20 74  egment, if .** t
1bf60 68 65 72 65 20 77 61 73 20 61 6e 79 20 64 61 74  here was any dat
1bf70 61 20 74 6f 20 66 6c 75 73 68 29 20 69 6e 74 6f  a to flush) into
1bf80 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
1bf90 74 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t. .*/.int sqlit
1bfa0 65 33 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 46  e3Fts3Optimize(F
1bfb0 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
1bfc0 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
1bfd0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1bfe0 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 66 74  b, "SAVEPOINT ft
1bff0 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  s3", 0, 0, 0);. 
1c000 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c010 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  OK ){.    rc = f
1c020 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c  ts3DoOptimize(p,
1c030 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   1);.    if( rc=
1c040 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
1c050 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1c060 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
1c070 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1c080 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 66 74  >db, "RELEASE ft
1c090 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  s3", 0, 0, 0);. 
1c0a0 20 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51       if( rc2!=SQ
1c0b0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
1c0c0 63 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c2;.    }else{. 
1c0d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
1c0e0 63 28 70 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41  c(p->db, "ROLLBA
1c0f0 43 4b 20 54 4f 20 66 74 73 33 22 2c 20 30 2c 20  CK TO fts3", 0, 
1c100 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
1c110 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
1c120 20 22 52 45 4c 45 41 53 45 20 66 74 73 33 22 2c   "RELEASE fts3",
1c130 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
1c140 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
1c150 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
1c160 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1c170 0a 7d 0a 0a 23 65 6e 64 69 66 0a                 .}..#endif.