/ Hex Artifact Content
Login

Artifact ed525afd524d713abe7da174d56ad935dfc26008:


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: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
02c0: 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e  E_CORE) || defin
02d0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
02e0: 5f 46 54 53 33 29 0a 0a 23 69 6e 63 6c 75 64 65  _FTS3)..#include
02f0: 20 22 66 74 73 33 49 6e 74 2e 68 22 0a 23 69 6e   "fts3Int.h".#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 54 4f 44  poses..**.** TOD
07f0: 4f 3a 20 41 64 64 20 61 20 74 65 73 74 20 69 6e  O: Add a test in
0800: 74 65 72 66 61 63 65 20 74 6f 20 6d 6f 64 69 66  terface to modif
0810: 79 20 74 68 65 73 65 20 22 63 6f 6e 73 74 61 6e  y these "constan
0820: 74 73 22 20 66 72 6f 6d 20 61 20 73 63 72 69 70  ts" from a scrip
0830: 74 20 66 6f 72 0a 2a 2a 20 74 68 69 73 20 70 75  t for.** this pu
0840: 72 70 6f 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  rpose..*/.#defin
0850: 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  e FTS3_NODE_CHUN
0860: 4b 53 49 5a 45 20 28 34 2a 31 30 32 34 29 20 0a  KSIZE (4*1024) .
0870: 23 64 65 66 69 6e 65 20 46 54 53 33 5f 4e 4f 44  #define FTS3_NOD
0880: 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53 48 4f 4c  E_CHUNK_THRESHOL
0890: 44 20 28 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55  D (FTS3_NODE_CHU
08a0: 4e 4b 53 49 5a 45 2a 34 29 0a 2f 2a 20 23 64 65  NKSIZE*4)./* #de
08b0: 66 69 6e 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43  fine FTS3_NODE_C
08c0: 48 55 4e 4b 53 49 5a 45 20 31 20 2a 2f 0a 2f 2a  HUNKSIZE 1 */./*
08d0: 20 23 64 65 66 69 6e 65 20 46 54 53 33 5f 4e 4f   #define FTS3_NO
08e0: 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53 48 4f  DE_CHUNK_THRESHO
08f0: 4c 44 20 31 20 2a 2f 0a 0a 74 79 70 65 64 65 66  LD 1 */..typedef
0900: 20 73 74 72 75 63 74 20 50 65 6e 64 69 6e 67 4c   struct PendingL
0910: 69 73 74 20 50 65 6e 64 69 6e 67 4c 69 73 74 3b  ist PendingList;
0920: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0930: 53 65 67 6d 65 6e 74 4e 6f 64 65 20 53 65 67 6d  SegmentNode Segm
0940: 65 6e 74 4e 6f 64 65 3b 0a 74 79 70 65 64 65 66  entNode;.typedef
0950: 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e 74 57   struct SegmentW
0960: 72 69 74 65 72 20 53 65 67 6d 65 6e 74 57 72 69  riter SegmentWri
0970: 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ter;../*.** An i
0980: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0990: 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 20 73 74  ollowing data st
09a0: 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
09b0: 74 6f 20 62 75 69 6c 64 20 64 6f 63 6c 69 73 74  to build doclist
09c0: 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s.** incremental
09d0: 6c 79 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  ly. See function
09e0: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
09f0: 41 70 70 65 6e 64 28 29 20 66 6f 72 20 64 65 74  Append() for det
0a00: 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ails..*/.struct 
0a10: 50 65 6e 64 69 6e 67 4c 69 73 74 20 7b 0a 20 20  PendingList {.  
0a20: 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 63 68 61  int nData;.  cha
0a30: 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  r *aData;.  int 
0a40: 6e 53 70 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  nSpace;.  sqlite
0a50: 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 44 6f 63  3_int64 iLastDoc
0a60: 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  id;.  sqlite3_in
0a70: 74 36 34 20 69 4c 61 73 74 43 6f 6c 3b 0a 20 20  t64 iLastCol;.  
0a80: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
0a90: 61 73 74 50 6f 73 3b 0a 7d 3b 0a 0a 0a 2f 2a 0a  astPos;.};.../*.
0aa0: 2a 2a 20 45 61 63 68 20 63 75 72 73 6f 72 20 68  ** Each cursor h
0ab0: 61 73 20 61 20 28 70 6f 73 73 69 62 6c 79 20 65  as a (possibly e
0ac0: 6d 70 74 79 29 20 6c 69 6e 6b 65 64 20 6c 69 73  mpty) linked lis
0ad0: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t of the followi
0ae0: 6e 67 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73  ng objects..*/.s
0af0: 74 72 75 63 74 20 46 74 73 33 44 65 66 65 72 72  truct Fts3Deferr
0b00: 65 64 54 6f 6b 65 6e 20 7b 0a 20 20 46 74 73 33  edToken {.  Fts3
0b10: 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f  PhraseToken *pTo
0b20: 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  ken;        /* P
0b30: 6f 69 6e 74 65 72 20 74 6f 20 63 6f 72 72 65 73  ointer to corres
0b40: 70 6f 6e 64 69 6e 67 20 65 78 70 72 20 74 6f 6b  ponding expr tok
0b50: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  en */.  int iCol
0b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0b70: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
0b80: 6e 20 74 6f 6b 65 6e 20 6d 75 73 74 20 6f 63 63  n token must occ
0b90: 75 72 20 69 6e 20 2a 2f 0a 20 20 46 74 73 33 44  ur in */.  Fts3D
0ba0: 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 4e  eferredToken *pN
0bb0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0bc0: 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 64 65  xt in list of de
0bd0: 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 2a 2f  ferred tokens */
0be0: 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a  .  PendingList *
0bf0: 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
0c00: 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 69 73     /* Doclist is
0c10: 20 61 73 73 65 6d 62 6c 65 64 20 68 65 72 65 20   assembled here 
0c20: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
0c30: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0c40: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
0c50: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
0c60: 72 6f 75 67 68 20 74 68 65 20 74 65 72 6d 73 20  rough the terms 
0c70: 6f 6e 0a 2a 2a 20 61 20 63 6f 6e 74 69 67 75 6f  on.** a contiguo
0c80: 75 73 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  us set of segmen
0c90: 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f  t b-tree leaf no
0ca0: 64 65 73 2e 20 41 6c 74 68 6f 75 67 68 20 74 68  des. Although th
0cb0: 65 20 64 65 74 61 69 6c 73 20 6f 66 0a 2a 2a 20  e details of.** 
0cc0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
0cd0: 72 65 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61  re only manipula
0ce0: 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 74  ted by code in t
0cf0: 68 69 73 20 66 69 6c 65 2c 20 6f 70 61 71 75 65  his file, opaque
0d00: 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 6f 66 20 74   handles.** of t
0d10: 79 70 65 20 46 74 73 33 53 65 67 52 65 61 64 65  ype Fts3SegReade
0d20: 72 2a 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  r* are also used
0d30: 20 62 79 20 63 6f 64 65 20 69 6e 20 66 74 73 33   by code in fts3
0d40: 2e 63 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  .c to iterate th
0d50: 72 6f 75 67 68 0a 2a 2a 20 74 65 72 6d 73 20 77  rough.** terms w
0d60: 68 65 6e 20 71 75 65 72 79 69 6e 67 20 74 68 65  hen querying the
0d70: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
0d80: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 73 3a  . See functions:
0d90: 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  .**.**   sqlite3
0da0: 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77  Fts3SegReaderNew
0db0: 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 46  ().**   sqlite3F
0dc0: 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
0dd0: 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 46  ().**   sqlite3F
0de0: 74 73 33 53 65 67 52 65 61 64 65 72 43 6f 73 74  ts3SegReaderCost
0df0: 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 46  ().**   sqlite3F
0e00: 74 73 33 53 65 67 52 65 61 64 65 72 49 74 65 72  ts3SegReaderIter
0e10: 61 74 65 28 29 0a 2a 2a 0a 2a 2a 20 4d 65 74 68  ate().**.** Meth
0e20: 6f 64 73 20 75 73 65 64 20 74 6f 20 6d 61 6e 69  ods used to mani
0e30: 70 75 6c 61 74 65 20 46 74 73 33 53 65 67 52 65  pulate Fts3SegRe
0e40: 61 64 65 72 20 73 74 72 75 63 74 75 72 65 73 3a  ader structures:
0e50: 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53 65 67  .**.**   fts3Seg
0e60: 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a 2a 20  ReaderNext().** 
0e70: 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 46    fts3SegReaderF
0e80: 69 72 73 74 44 6f 63 69 64 28 29 0a 2a 2a 20 20  irstDocid().**  
0e90: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
0ea0: 78 74 44 6f 63 69 64 28 29 0a 2a 2f 0a 73 74 72  xtDocid().*/.str
0eb0: 75 63 74 20 46 74 73 33 53 65 67 52 65 61 64 65  uct Fts3SegReade
0ec0: 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78 3b 20  r {.  int iIdx; 
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 77        /* Index w
0ef0: 69 74 68 69 6e 20 6c 65 76 65 6c 2c 20 6f 72 20  ithin level, or 
0f00: 30 78 37 46 46 46 46 46 46 46 20 66 6f 72 20 50  0x7FFFFFFF for P
0f10: 54 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f  T */..  sqlite3_
0f20: 69 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f 63  int64 iStartBloc
0f30: 6b 3b 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  k;      /* Rowid
0f40: 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66 20 62   of first leaf b
0f50: 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65 72 73 65  lock to traverse
0f60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
0f70: 74 36 34 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63  t64 iLeafEndBloc
0f80: 6b 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f  k;    /* Rowid o
0f90: 66 20 66 69 6e 61 6c 20 6c 65 61 66 20 62 6c 6f  f final leaf blo
0fa0: 63 6b 20 74 6f 20 74 72 61 76 65 72 73 65 20 2a  ck to traverse *
0fb0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
0fc0: 34 20 69 45 6e 64 42 6c 6f 63 6b 3b 20 20 20 20  4 iEndBlock;    
0fd0: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20      /* Rowid of 
0fe0: 66 69 6e 61 6c 20 62 6c 6f 63 6b 20 69 6e 20 73  final block in s
0ff0: 65 67 6d 65 6e 74 20 28 6f 72 20 30 29 20 2a 2f  egment (or 0) */
1000: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1010: 20 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3b 20   iCurrentBlock; 
1020: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
1030: 61 66 20 62 6c 6f 63 6b 20 28 6f 72 20 30 29 20  af block (or 0) 
1040: 2a 2f 0a 0a 20 20 63 68 61 72 20 2a 61 4e 6f 64  */..  char *aNod
1050: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1060: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1070: 20 74 6f 20 6e 6f 64 65 20 64 61 74 61 20 28 6f   to node data (o
1080: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
1090: 20 6e 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20   nNode;         
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10b0: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61  Size of buffer a
10c0: 74 20 61 4e 6f 64 65 20 28 6f 72 20 30 29 20 2a  t aNode (or 0) *
10d0: 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 75 6c 61 74  /.  int nPopulat
10e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10f0: 20 20 20 20 2f 2a 20 49 66 20 3e 30 2c 20 62 79      /* If >0, by
1100: 74 65 73 20 6f 66 20 62 75 66 66 65 72 20 61 4e  tes of buffer aN
1110: 6f 64 65 5b 5d 20 6c 6f 61 64 65 64 20 2a 2f 0a  ode[] loaded */.
1120: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
1130: 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  pBlob;          
1140: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
1150: 2c 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 74 6f  , blob handle to
1160: 20 72 65 61 64 20 6e 6f 64 65 20 2a 2f 0a 0a 20   read node */.. 
1170: 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a   Fts3HashElem **
1180: 70 70 4e 65 78 74 45 6c 65 6d 3b 0a 0a 20 20 2f  ppNextElem;..  /
1190: 2a 20 56 61 72 69 61 62 6c 65 73 20 73 65 74 20  * Variables set 
11a0: 62 79 20 66 74 73 33 53 65 67 52 65 61 64 65 72  by fts3SegReader
11b0: 4e 65 78 74 28 29 2e 20 54 68 65 73 65 20 6d 61  Next(). These ma
11c0: 79 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  y be read direct
11d0: 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
11e0: 61 6c 6c 65 72 2e 20 54 68 65 79 20 61 72 65 20  aller. They are 
11f0: 76 61 6c 69 64 20 66 72 6f 6d 20 74 68 65 20 74  valid from the t
1200: 69 6d 65 20 53 65 67 6d 65 6e 74 52 65 61 64 65  ime SegmentReade
1210: 72 4e 65 77 28 29 20 72 65 74 75 72 6e 73 0a 20  rNew() returns. 
1220: 20 2a 2a 20 75 6e 74 69 6c 20 53 65 67 6d 65 6e   ** until Segmen
1230: 74 52 65 61 64 65 72 4e 65 78 74 28 29 20 72 65  tReaderNext() re
1240: 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1250: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1260: 45 5f 4f 4b 0a 20 20 2a 2a 20 28 69 2e 65 2e 20  E_OK.  ** (i.e. 
1270: 53 51 4c 49 54 45 5f 44 4f 4e 45 29 2e 0a 20 20  SQLITE_DONE)..  
1280: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12b0: 66 20 62 79 74 65 73 20 69 6e 20 63 75 72 72 65  f bytes in curre
12c0: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 63 68 61  nt term */.  cha
12d0: 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20  r *zTerm;       
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f0: 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
1300: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
1310: 20 6e 54 65 72 6d 41 6c 6c 6f 63 3b 20 20 20 20   nTermAlloc;    
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1330: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
1340: 66 20 7a 54 65 72 6d 20 62 75 66 66 65 72 20 2a  f zTerm buffer *
1350: 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  /.  char *aDocli
1360: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1370: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1380: 6f 20 64 6f 63 6c 69 73 74 20 6f 66 20 63 75 72  o doclist of cur
1390: 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
13a0: 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20  int nDoclist;   
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
13d0: 73 74 20 69 6e 20 63 75 72 72 65 6e 74 20 65 6e  st in current en
13e0: 74 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  try */..  /* The
13f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1400: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 62 79  bles are used by
1410: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
1420: 78 74 44 6f 63 69 64 28 29 20 74 6f 20 69 74 65  xtDocid() to ite
1430: 72 61 74 65 20 0a 20 20 2a 2a 20 74 68 72 6f 75  rate .  ** throu
1440: 67 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  gh the current d
1450: 6f 63 6c 69 73 74 20 28 61 44 6f 63 6c 69 73 74  oclist (aDoclist
1460: 2f 6e 44 6f 63 6c 69 73 74 29 2e 0a 20 20 2a 2f  /nDoclist)..  */
1470: 0a 20 20 63 68 61 72 20 2a 70 4f 66 66 73 65 74  .  char *pOffset
1480: 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 4f 66 66  List;.  int nOff
1490: 73 65 74 4c 69 73 74 3b 20 20 20 20 20 20 20 20  setList;        
14a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 64          /* For d
14b0: 65 73 63 65 6e 64 69 6e 67 20 70 65 6e 64 69 6e  escending pendin
14c0: 67 20 73 65 67 2d 72 65 61 64 65 72 73 20 6f 6e  g seg-readers on
14d0: 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ly */.  sqlite3_
14e0: 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 0a 7d 3b  int64 iDocid;.};
14f0: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 33 53 65  ..#define fts3Se
1500: 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67  gReaderIsPending
1510: 28 70 29 20 28 28 70 29 2d 3e 70 70 4e 65 78 74  (p) ((p)->ppNext
1520: 45 6c 65 6d 21 3d 30 29 0a 23 64 65 66 69 6e 65  Elem!=0).#define
1530: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73   fts3SegReaderIs
1540: 52 6f 6f 74 4f 6e 6c 79 28 70 29 20 28 28 70 29  RootOnly(p) ((p)
1550: 2d 3e 61 4e 6f 64 65 3d 3d 28 63 68 61 72 20 2a  ->aNode==(char *
1560: 29 26 28 70 29 5b 31 5d 29 0a 0a 2f 2a 0a 2a 2a  )&(p)[1])../*.**
1570: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1580: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
1590: 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
15a0: 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65   a segment b-tre
15b0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  e in the.** data
15c0: 62 61 73 65 2e 20 54 68 65 20 69 6e 74 65 72 6e  base. The intern
15d0: 61 6c 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68  al details of th
15e0: 69 73 20 74 79 70 65 20 61 72 65 20 6f 6e 6c 79  is type are only
15f0: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
1600: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  .** following fu
1610: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  nctions:.**.**  
1620: 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41 64   fts3SegWriterAd
1630: 64 28 29 0a 2a 2a 20 20 20 66 74 73 33 53 65 67  d().**   fts3Seg
1640: 57 72 69 74 65 72 46 6c 75 73 68 28 29 0a 2a 2a  WriterFlush().**
1650: 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72     fts3SegWriter
1660: 46 72 65 65 28 29 0a 2a 2f 0a 73 74 72 75 63 74  Free().*/.struct
1670: 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 7b   SegmentWriter {
1680: 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a  .  SegmentNode *
1690: 70 54 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  pTree;          
16a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
16b0: 20 69 6e 74 65 72 69 6f 72 20 74 72 65 65 20 73   interior tree s
16c0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73 71  tructure */.  sq
16d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 46 69 72  lite3_int64 iFir
16e0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
16f0: 20 46 69 72 73 74 20 73 6c 6f 74 20 69 6e 20 25   First slot in %
1700: 5f 73 65 67 6d 65 6e 74 73 20 77 72 69 74 74 65  _segments writte
1710: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
1720: 6e 74 36 34 20 69 46 72 65 65 3b 20 20 20 20 20  nt64 iFree;     
1730: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
1740: 72 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65  ree slot in %_se
1750: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  gments */.  char
1760: 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *zTerm;        
1770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1780: 6f 69 6e 74 65 72 20 74 6f 20 70 72 65 76 69 6f  ointer to previo
1790: 75 73 20 74 65 72 6d 20 62 75 66 66 65 72 20 2a  us term buffer *
17a0: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20  /.  int nTerm;  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17d0: 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72 6d 20   bytes in zTerm 
17e0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f 63  */.  int nMalloc
17f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1800: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1810: 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72 20  malloc'd buffer 
1820: 61 74 20 7a 4d 61 6c 6c 6f 63 20 2a 2f 0a 20 20  at zMalloc */.  
1830: 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f 63 3b 20 20  char *zMalloc;  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 73 70 61 63  /* Malloc'd spac
1860: 65 20 28 70 6f 73 73 69 62 6c 79 29 20 75 73 65  e (possibly) use
1870: 64 20 66 6f 72 20 7a 54 65 72 6d 20 2a 2f 0a 20  d for zTerm */. 
1880: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f   /* Size of allo
18b0: 63 61 74 69 6f 6e 20 61 74 20 61 44 61 74 61 20  cation at aData 
18c0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20  */.  int nData; 
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
18f0: 20 64 61 74 61 20 69 6e 20 61 44 61 74 61 20 2a   data in aData *
1900: 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1930: 6f 20 62 6c 6f 63 6b 20 66 72 6f 6d 20 6d 61 6c  o block from mal
1940: 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  loc() */.};../*.
1950: 2a 2a 20 54 79 70 65 20 53 65 67 6d 65 6e 74 4e  ** Type SegmentN
1960: 6f 64 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ode is used by t
1970: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
1980: 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  ee functions to 
1990: 63 72 65 61 74 65 0a 2a 2a 20 74 68 65 20 69 6e  create.** the in
19a0: 74 65 72 69 6f 72 20 70 61 72 74 20 6f 66 20 74  terior part of t
19b0: 68 65 20 73 65 67 6d 65 6e 74 20 62 2b 2d 74 72  he segment b+-tr
19c0: 65 65 20 73 74 72 75 63 74 75 72 65 73 20 28 65  ee structures (e
19d0: 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74  verything except
19e0: 0a 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f 64  .** the leaf nod
19f0: 65 73 29 2e 20 54 68 65 73 65 20 66 75 6e 63 74  es). These funct
1a00: 69 6f 6e 73 20 61 6e 64 20 74 79 70 65 20 61 72  ions and type ar
1a10: 65 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  e only ever used
1a20: 20 62 79 20 63 6f 64 65 0a 2a 2a 20 77 69 74 68   by code.** with
1a30: 69 6e 20 74 68 65 20 66 74 73 33 53 65 67 57 72  in the fts3SegWr
1a40: 69 74 65 72 58 58 58 28 29 20 66 61 6d 69 6c 79  iterXXX() family
1a50: 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 64 65   of functions de
1a60: 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
1a70: 2a 0a 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65 41  *.**   fts3NodeA
1a80: 64 64 54 65 72 6d 28 29 0a 2a 2a 20 20 20 66 74  ddTerm().**   ft
1a90: 73 33 4e 6f 64 65 57 72 69 74 65 28 29 0a 2a 2a  s3NodeWrite().**
1aa0: 20 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28     fts3NodeFree(
1ab0: 29 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 62  ).**.** When a b
1ac0: 2b 74 72 65 65 20 69 73 20 77 72 69 74 74 65 6e  +tree is written
1ad0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1ae0: 20 28 65 69 74 68 65 72 20 61 73 20 61 20 72 65   (either as a re
1af0: 73 75 6c 74 20 6f 66 20 61 20 6d 65 72 67 65 0a  sult of a merge.
1b00: 2a 2a 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ** or the pendin
1b10: 67 2d 74 65 72 6d 73 20 74 61 62 6c 65 20 62 65  g-terms table be
1b20: 69 6e 67 20 66 6c 75 73 68 65 64 29 2c 20 6c 65  ing flushed), le
1b30: 61 76 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  aves are written
1b40: 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 64 61   into the .** da
1b50: 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 20 73  tabase file as s
1b60: 6f 6f 6e 20 61 73 20 74 68 65 79 20 61 72 65 20  oon as they are 
1b70: 63 6f 6d 70 6c 65 74 65 6c 79 20 70 6f 70 75 6c  completely popul
1b80: 61 74 65 64 2e 20 54 68 65 20 69 6e 74 65 72 69  ated. The interi
1b90: 6f 72 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 65  or of.** the tre
1ba0: 65 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20 69  e is assembled i
1bb0: 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 77 72 69  n memory and wri
1bc0: 74 74 65 6e 20 6f 75 74 20 6f 6e 6c 79 20 6f 6e  tten out only on
1bd0: 63 65 20 61 6c 6c 20 6c 65 61 76 65 73 20 68 61  ce all leaves ha
1be0: 76 65 0a 2a 2a 20 62 65 65 6e 20 70 6f 70 75 6c  ve.** been popul
1bf0: 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 2e  ated and stored.
1c00: 20 54 68 69 73 20 69 73 20 4f 6b 2c 20 61 73 20   This is Ok, as 
1c10: 74 68 65 20 62 2b 2d 74 72 65 65 20 66 61 6e 6f  the b+-tree fano
1c20: 75 74 20 69 73 20 75 73 75 61 6c 6c 79 0a 2a 2a  ut is usually.**
1c30: 20 76 65 72 79 20 6c 61 72 67 65 2c 20 6d 65 61   very large, mea
1c40: 6e 69 6e 67 20 74 68 61 74 20 74 68 65 20 69 6e  ning that the in
1c50: 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20 74 72  terior of the tr
1c60: 65 65 20 63 6f 6e 73 75 6d 65 73 20 72 65 6c 61  ee consumes rela
1c70: 74 69 76 65 6c 79 20 0a 2a 2a 20 6c 69 74 74 6c  tively .** littl
1c80: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 72  e memory..*/.str
1c90: 75 63 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  uct SegmentNode 
1ca0: 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  {.  SegmentNode 
1cb0: 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
1cc0: 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 6e 6f      /* Parent no
1cd0: 64 65 20 28 6f 72 20 4e 55 4c 4c 20 66 6f 72 20  de (or NULL for 
1ce0: 72 6f 6f 74 20 6e 6f 64 65 29 20 2a 2f 0a 20 20  root node) */.  
1cf0: 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52 69  SegmentNode *pRi
1d00: 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
1d10: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 69  /* Pointer to ri
1d20: 67 68 74 2d 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  ght-sibling */. 
1d30: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 4c   SegmentNode *pL
1d40: 65 66 74 6d 6f 73 74 3b 20 20 20 20 20 20 20 20  eftmost;        
1d50: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
1d60: 65 66 74 2d 6d 6f 73 74 20 6e 6f 64 65 20 6f 66  eft-most node of
1d70: 20 74 68 69 73 20 64 65 70 74 68 20 2a 2f 0a 20   this depth */. 
1d80: 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1db0: 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6e  rms written to n
1dc0: 6f 64 65 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ode so far */.  
1dd0: 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 72  /* Pointer to pr
1e00: 65 76 69 6f 75 73 20 74 65 72 6d 20 62 75 66 66  evious term buff
1e10: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  er */.  int nTer
1e20: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1e30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e40: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 54  r of bytes in zT
1e50: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  erm */.  int nMa
1e60: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1e80: 20 6f 66 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66   of malloc'd buf
1e90: 66 65 72 20 61 74 20 7a 4d 61 6c 6c 6f 63 20 2a  fer at zMalloc *
1ea0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f  /.  char *zMallo
1eb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1ec0: 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
1ed0: 73 70 61 63 65 20 28 70 6f 73 73 69 62 6c 79 29  space (possibly)
1ee0: 20 75 73 65 64 20 66 6f 72 20 7a 54 65 72 6d 20   used for zTerm 
1ef0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20  */.  int nData; 
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1f20: 20 76 61 6c 69 64 20 64 61 74 61 20 73 6f 20 66   valid data so f
1f30: 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ar */.  char *aD
1f40: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1f50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
1f60: 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  data */.};../*.*
1f70: 2a 20 56 61 6c 69 64 20 76 61 6c 75 65 73 20 66  * Valid values f
1f80: 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  or the second ar
1f90: 67 75 6d 65 6e 74 20 74 6f 20 66 74 73 33 53 71  gument to fts3Sq
1fa0: 6c 53 74 6d 74 28 29 2e 0a 2a 2f 0a 23 64 65 66  lStmt()..*/.#def
1fb0: 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 43  ine SQL_DELETE_C
1fc0: 4f 4e 54 45 4e 54 20 20 20 20 20 20 20 20 20 20  ONTENT          
1fd0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c     0.#define SQL
1fe0: 5f 49 53 5f 45 4d 50 54 59 20 20 20 20 20 20 20  _IS_EMPTY       
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 23 64              1.#d
2000: 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45  efine SQL_DELETE
2010: 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 20 20 20 20  _ALL_CONTENT    
2020: 20 20 20 20 20 32 20 0a 23 64 65 66 69 6e 65 20       2 .#define 
2030: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
2040: 45 47 4d 45 4e 54 53 20 20 20 20 20 20 20 20 33  EGMENTS        3
2050: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c  .#define SQL_DEL
2060: 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52 20 20  ETE_ALL_SEGDIR  
2070: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
2080: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  e SQL_DELETE_ALL
2090: 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20 20  _DOCSIZE        
20a0: 20 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44   5.#define SQL_D
20b0: 45 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 20 20  ELETE_ALL_STAT  
20c0: 20 20 20 20 20 20 20 20 20 20 36 0a 23 64 65 66            6.#def
20d0: 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43  ine SQL_SELECT_C
20e0: 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 20  ONTENT_BY_ROWID 
20f0: 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 51 4c     7.#define SQL
2100: 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e  _NEXT_SEGMENT_IN
2110: 44 45 58 20 20 20 20 20 20 20 20 20 38 0a 23 64  DEX         8.#d
2120: 65 66 69 6e 65 20 53 51 4c 5f 49 4e 53 45 52 54  efine SQL_INSERT
2130: 5f 53 45 47 4d 45 4e 54 53 20 20 20 20 20 20 20  _SEGMENTS       
2140: 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20 53       9.#define S
2150: 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53  QL_NEXT_SEGMENTS
2160: 5f 49 44 20 20 20 20 20 20 20 20 20 20 31 30 0a  _ID          10.
2170: 23 64 65 66 69 6e 65 20 53 51 4c 5f 49 4e 53 45  #define SQL_INSE
2180: 52 54 5f 53 45 47 44 49 52 20 20 20 20 20 20 20  RT_SEGDIR       
2190: 20 20 20 20 20 20 31 31 0a 23 64 65 66 69 6e 65        11.#define
21a0: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
21b0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  L              1
21c0: 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  2.#define SQL_SE
21d0: 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45  LECT_LEVEL_RANGE
21e0: 20 20 20 20 20 20 20 20 31 33 0a 23 64 65 66 69          13.#defi
21f0: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45  ne SQL_SELECT_LE
2200: 56 45 4c 5f 43 4f 55 4e 54 20 20 20 20 20 20 20  VEL_COUNT       
2210: 20 31 34 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   14.#define SQL_
2220: 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d 41  SELECT_SEGDIR_MA
2230: 58 5f 4c 45 56 45 4c 20 20 20 31 35 0a 23 64 65  X_LEVEL   15.#de
2240: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2250: 53 45 47 44 49 52 5f 4c 45 56 45 4c 20 20 20 20  SEGDIR_LEVEL    
2260: 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20 53 51     16.#define SQ
2270: 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54  L_DELETE_SEGMENT
2280: 53 5f 52 41 4e 47 45 20 20 20 20 20 31 37 0a 23  S_RANGE     17.#
2290: 64 65 66 69 6e 65 20 53 51 4c 5f 43 4f 4e 54 45  define SQL_CONTE
22a0: 4e 54 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20  NT_INSERT       
22b0: 20 20 20 20 20 31 38 0a 23 64 65 66 69 6e 65 20       18.#define 
22c0: 53 51 4c 5f 44 45 4c 45 54 45 5f 44 4f 43 53 49  SQL_DELETE_DOCSI
22d0: 5a 45 20 20 20 20 20 20 20 20 20 20 20 20 31 39  ZE            19
22e0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52 45 50  .#define SQL_REP
22f0: 4c 41 43 45 5f 44 4f 43 53 49 5a 45 20 20 20 20  LACE_DOCSIZE    
2300: 20 20 20 20 20 20 20 32 30 0a 23 64 65 66 69 6e         20.#defin
2310: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43  e SQL_SELECT_DOC
2320: 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 20  SIZE            
2330: 32 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  21.#define SQL_S
2340: 45 4c 45 43 54 5f 44 4f 43 54 4f 54 41 4c 20 20  ELECT_DOCTOTAL  
2350: 20 20 20 20 20 20 20 20 20 32 32 0a 23 64 65 66           22.#def
2360: 69 6e 65 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f  ine SQL_REPLACE_
2370: 44 4f 43 54 4f 54 41 4c 20 20 20 20 20 20 20 20  DOCTOTAL        
2380: 20 20 32 33 0a 0a 23 64 65 66 69 6e 65 20 53 51    23..#define SQ
2390: 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 50 52 45  L_SELECT_ALL_PRE
23a0: 46 49 58 5f 4c 45 56 45 4c 20 20 20 32 34 0a 23  FIX_LEVEL   24.#
23b0: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
23c0: 45 5f 41 4c 4c 5f 54 45 52 4d 53 5f 53 45 47 44  E_ALL_TERMS_SEGD
23d0: 49 52 20 20 20 32 35 0a 0a 23 64 65 66 69 6e 65  IR   25..#define
23e0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44   SQL_DELETE_SEGD
23f0: 49 52 5f 52 41 4e 47 45 20 20 20 20 20 20 20 32  IR_RANGE       2
2400: 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  6../*.** This fu
2410: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2420: 6f 20 6f 62 74 61 69 6e 20 61 6e 20 53 51 4c 69  o obtain an SQLi
2430: 74 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  te prepared stat
2440: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 0a 2a 2a 20  ement handle.** 
2450: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
2460: 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
2470: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2480: 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73 73 66  ent. If successf
2490: 75 6c 2c 0a 2a 2a 20 2a 70 70 20 69 73 20 73 65  ul,.** *pp is se
24a0: 74 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  t to the request
24b0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e  ed statement han
24c0: 64 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  dle and SQLITE_O
24d0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f  K returned..** O
24e0: 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
24f0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2500: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
2510: 70 70 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  pp is set to 0..
2520: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
2530: 74 20 61 70 56 61 6c 20 69 73 20 6e 6f 74 20 4e  t apVal is not N
2540: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ULL, then it mus
2550: 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  t point to an ar
2560: 72 61 79 20 77 69 74 68 0a 2a 2a 20 61 74 20 6c  ray with.** at l
2570: 65 61 73 74 20 61 73 20 6d 61 6e 79 20 65 6e 74  east as many ent
2580: 72 69 65 73 20 61 73 20 74 68 65 20 72 65 71 75  ries as the requ
2590: 65 73 74 65 64 20 73 74 61 74 65 6d 65 6e 74 20  ested statement 
25a0: 68 61 73 20 62 6f 75 6e 64 20 0a 2a 2a 20 70 61  has bound .** pa
25b0: 72 61 6d 65 74 65 72 73 2e 20 54 68 65 20 76 61  rameters. The va
25c0: 6c 75 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74  lues are bound t
25d0: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73  o the statements
25e0: 20 70 61 72 61 6d 65 74 65 72 73 20 62 65 66 6f   parameters befo
25f0: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
2600: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2610: 74 73 33 53 71 6c 53 74 6d 74 28 0a 20 20 46 74  ts3SqlStmt(.  Ft
2620: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2640: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
2650: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65  andle */.  int e
2660: 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  Stmt,           
2670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2680: 65 20 6f 66 20 74 68 65 20 53 51 4c 5f 58 58 58  e of the SQL_XXX
2690: 20 63 6f 6e 73 74 61 6e 74 73 20 61 62 6f 76 65   constants above
26a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
26b0: 6d 74 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20  mt **pp,        
26c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74        /* OUT: St
26d0: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a  atement handle *
26e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
26f0: 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
2700: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 74 6f      /* Values to
2710: 20 62 69 6e 64 20 74 6f 20 73 74 61 74 65 6d 65   bind to stateme
2720: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  nt */.){.  const
2730: 20 63 68 61 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d   char *azSql[] =
2740: 20 7b 0a 2f 2a 20 30 20 20 2a 2f 20 20 22 44 45   {./* 0  */  "DE
2750: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71  LETE FROM %Q.'%q
2760: 5f 63 6f 6e 74 65 6e 74 27 20 57 48 45 52 45 20  _content' WHERE 
2770: 72 6f 77 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31  rowid = ?",./* 1
2780: 20 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 4e 4f    */  "SELECT NO
2790: 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20  T EXISTS(SELECT 
27a0: 64 6f 63 69 64 20 46 52 4f 4d 20 25 51 2e 27 25  docid FROM %Q.'%
27b0: 71 5f 63 6f 6e 74 65 6e 74 27 20 57 48 45 52 45  q_content' WHERE
27c0: 20 72 6f 77 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20   rowid!=?)",./* 
27d0: 32 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  2  */  "DELETE F
27e0: 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  ROM %Q.'%q_conte
27f0: 6e 74 27 22 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20  nt'",./* 3  */  
2800: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
2810: 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 22 2c 0a  '%q_segments'",.
2820: 2f 2a 20 34 20 20 2a 2f 20 20 22 44 45 4c 45 54  /* 4  */  "DELET
2830: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  E FROM %Q.'%q_se
2840: 67 64 69 72 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f  gdir'",./* 5  */
2850: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
2860: 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 22 2c  Q.'%q_docsize'",
2870: 0a 2f 2a 20 36 20 20 2a 2f 20 20 22 44 45 4c 45  ./* 6  */  "DELE
2880: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  TE FROM %Q.'%q_s
2890: 74 61 74 27 22 2c 0a 2f 2a 20 37 20 20 2a 2f 20  tat'",./* 7  */ 
28a0: 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d   "SELECT %s FROM
28b0: 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27   %Q.'%q_content'
28c0: 20 41 53 20 78 20 57 48 45 52 45 20 72 6f 77 69   AS x WHERE rowi
28d0: 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20 2a 2f 20 20  d=?",./* 8  */  
28e0: 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20  "SELECT (SELECT 
28f0: 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20 25 51  max(idx) FROM %Q
2900: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
2910: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 29 20 2b 20  RE level = ?) + 
2920: 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20 20 22 49  1",./* 9  */  "I
2930: 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 27 25  NSERT INTO %Q.'%
2940: 71 5f 73 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63  q_segments'(bloc
2950: 6b 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55  kid, block) VALU
2960: 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f 2a 20 31 30  ES(?, ?)",./* 10
2970: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f 61   */  "SELECT coa
2980: 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 6d 61  lesce((SELECT ma
2990: 78 28 62 6c 6f 63 6b 69 64 29 20 46 52 4f 4d 20  x(blockid) FROM 
29a0: 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  %Q.'%q_segments'
29b0: 29 20 2b 20 31 2c 20 31 29 22 2c 0a 2f 2a 20 31  ) + 1, 1)",./* 1
29c0: 31 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49 4e  1 */  "INSERT IN
29d0: 54 4f 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  TO %Q.'%q_segdir
29e0: 27 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  ' VALUES(?,?,?,?
29f0: 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20 20 20 20 20  ,?,?)",..       
2a00: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 73 65 67     /* Return seg
2a10: 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 66  ments in order f
2a20: 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65  rom oldest to ne
2a30: 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20 31 32 20 2a  west.*/ ./* 12 *
2a40: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
2a50: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
2a60: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
2a70: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
2a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
2a90: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
2aa0: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  ' WHERE level = 
2ab0: 3f 20 4f 52 44 45 52 20 42 59 20 69 64 78 20 41  ? ORDER BY idx A
2ac0: 53 43 22 2c 0a 2f 2a 20 31 33 20 2a 2f 20 20 22  SC",./* 13 */  "
2ad0: 53 45 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72  SELECT idx, star
2ae0: 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f  t_block, leaves_
2af0: 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62  end_block, end_b
2b00: 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20  lock, root ".   
2b10: 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25           "FROM %
2b20: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
2b30: 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45  ERE level BETWEE
2b40: 4e 20 3f 20 41 4e 44 20 3f 22 0a 20 20 20 20 20  N ? AND ?".     
2b50: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
2b60: 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64 78   level DESC, idx
2b70: 20 41 53 43 22 2c 0a 0a 2f 2a 20 31 34 20 2a 2f   ASC",../* 14 */
2b80: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
2b90: 2a 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  *) FROM %Q.'%q_s
2ba0: 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76  egdir' WHERE lev
2bb0: 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 31 35 20 2a  el = ?",./* 15 *
2bc0: 2f 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28 6c  /  "SELECT max(l
2bd0: 65 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25  evel) FROM %Q.'%
2be0: 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20  q_segdir' WHERE 
2bf0: 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20  level BETWEEN ? 
2c00: 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20 31 36 20 2a  AND ?",../* 16 *
2c10: 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /  "DELETE FROM 
2c20: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
2c30: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 22 2c  HERE level = ?",
2c40: 0a 2f 2a 20 31 37 20 2a 2f 20 20 22 44 45 4c 45  ./* 17 */  "DELE
2c50: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  TE FROM %Q.'%q_s
2c60: 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20 62  egments' WHERE b
2c70: 6c 6f 63 6b 69 64 20 42 45 54 57 45 45 4e 20 3f  lockid BETWEEN ?
2c80: 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20 31 38 20 2a   AND ?",./* 18 *
2c90: 2f 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  /  "INSERT INTO 
2ca0: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20  %Q.'%q_content' 
2cb0: 56 41 4c 55 45 53 28 25 73 29 22 2c 0a 2f 2a 20  VALUES(%s)",./* 
2cc0: 31 39 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  19 */  "DELETE F
2cd0: 52 4f 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73 69  ROM %Q.'%q_docsi
2ce0: 7a 65 27 20 57 48 45 52 45 20 64 6f 63 69 64 20  ze' WHERE docid 
2cf0: 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20 2a 2f 20 20  = ?",./* 20 */  
2d00: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51  "REPLACE INTO %Q
2d10: 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 20 56 41  .'%q_docsize' VA
2d20: 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a 2f 2a 20 32  LUES(?,?)",./* 2
2d30: 31 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 73 69  1 */  "SELECT si
2d40: 7a 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64  ze FROM %Q.'%q_d
2d50: 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f  ocsize' WHERE do
2d60: 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32 32 20 2a 2f  cid=?",./* 22 */
2d70: 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20    "SELECT value 
2d80: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74 61 74  FROM %Q.'%q_stat
2d90: 27 20 57 48 45 52 45 20 69 64 3d 30 22 2c 0a 2f  ' WHERE id=0",./
2da0: 2a 20 32 33 20 2a 2f 20 20 22 52 45 50 4c 41 43  * 23 */  "REPLAC
2db0: 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 74  E INTO %Q.'%q_st
2dc0: 61 74 27 20 56 41 4c 55 45 53 28 30 2c 3f 29 22  at' VALUES(0,?)"
2dd0: 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20 22 22 2c 0a  ,./* 24 */  "",.
2de0: 2f 2a 20 32 35 20 2a 2f 20 20 22 22 2c 0a 0a 2f  /* 25 */  "",../
2df0: 2a 20 32 36 20 2a 2f 20 22 44 45 4c 45 54 45 20  * 26 */ "DELETE 
2e00: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
2e10: 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20  ir' WHERE level 
2e20: 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22  BETWEEN ? AND ?"
2e30: 2c 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63  ,..  };.  int rc
2e40: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e50: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2e60: 74 6d 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tmt;..  assert( 
2e70: 53 69 7a 65 6f 66 41 72 72 61 79 28 61 7a 53 71  SizeofArray(azSq
2e80: 6c 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28  l)==SizeofArray(
2e90: 70 2d 3e 61 53 74 6d 74 29 20 29 3b 0a 20 20 61  p->aStmt) );.  a
2ea0: 73 73 65 72 74 28 20 65 53 74 6d 74 3c 53 69 7a  ssert( eStmt<Siz
2eb0: 65 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 20  eofArray(azSql) 
2ec0: 26 26 20 65 53 74 6d 74 3e 3d 30 20 29 3b 0a 20  && eStmt>=0 );. 
2ed0: 20 0a 20 20 70 53 74 6d 74 20 3d 20 70 2d 3e 61   .  pStmt = p->a
2ee0: 53 74 6d 74 5b 65 53 74 6d 74 5d 3b 0a 20 20 69  Stmt[eStmt];.  i
2ef0: 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20  f( !pStmt ){.   
2f00: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
2f10: 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f   if( eStmt==SQL_
2f20: 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 29  CONTENT_INSERT )
2f30: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
2f40: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
2f50: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
2f60: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  zDb, p->zName, p
2f70: 2d 3e 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74  ->zWriteExprlist
2f80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
2f90: 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45   eStmt==SQL_SELE
2fa0: 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f  CT_CONTENT_BY_RO
2fb0: 57 49 44 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  WID ){.      zSq
2fc0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2fd0: 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d  ntf(azSql[eStmt]
2fe0: 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69  , p->zReadExprli
2ff0: 73 74 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  st, p->zDb, p->z
3000: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
3010: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
3020: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
3030: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
3040: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  zDb, p->zName);.
3050: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
3060: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Sql ){.      rc 
3070: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
3080: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3090: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
30a0: 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
30b0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
30c0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  , NULL);.      s
30d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
30e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
3100: 7c 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  | pStmt==0 );.  
3110: 20 20 20 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74      p->aStmt[eSt
3120: 6d 74 5d 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  mt] = pStmt;.   
3130: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 56   }.  }.  if( apV
3140: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
3150: 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 61 6d 20  .    int nParam 
3160: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
3170: 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
3180: 53 74 6d 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  Stmt);.    for(i
3190: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
31a0: 4b 20 26 26 20 69 3c 6e 50 61 72 61 6d 3b 20 69  K && i<nParam; i
31b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
31c0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
31d0: 75 65 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61  ue(pStmt, i+1, a
31e0: 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  pVal[i]);.    }.
31f0: 20 20 7d 0a 20 20 2a 70 70 20 3d 20 70 53 74 6d    }.  *pp = pStm
3200: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
3210: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
3220: 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28  s3SelectDocsize(
3230: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54  .  Fts3Table *pT
3240: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
3250: 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
3260: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
3270: 20 65 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20   eStmt,         
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3290: 45 69 74 68 65 72 20 53 51 4c 5f 53 45 4c 45 43  Either SQL_SELEC
32a0: 54 5f 44 4f 43 53 49 5a 45 20 6f 72 20 44 4f 43  T_DOCSIZE or DOC
32b0: 54 4f 54 41 4c 20 2a 2f 0a 20 20 73 71 6c 69 74  TOTAL */.  sqlit
32c0: 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c  e3_int64 iDocid,
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
32e0: 63 69 64 20 74 6f 20 62 69 6e 64 20 66 6f 72 20  cid to bind for 
32f0: 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53 49  SQL_SELECT_DOCSI
3300: 5a 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ZE */.  sqlite3_
3310: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20  stmt **ppStmt   
3320: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3330: 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  Statement handle
3340: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
3350: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
3360: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74  ;        /* Stat
3370: 65 6d 65 6e 74 20 72 65 71 75 65 73 74 65 64 20  ement requested 
3380: 66 72 6f 6d 20 66 74 73 33 53 71 6c 53 74 6d 74  from fts3SqlStmt
3390: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  () */.  int rc; 
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
33c0: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
33d0: 65 72 74 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f  ert( eStmt==SQL_
33e0: 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 20 7c  SELECT_DOCSIZE |
33f0: 7c 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c  | eStmt==SQL_SEL
3400: 45 43 54 5f 44 4f 43 54 4f 54 41 4c 20 29 3b 0a  ECT_DOCTOTAL );.
3410: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
3420: 74 6d 74 28 70 54 61 62 2c 20 65 53 74 6d 74 2c  tmt(pTab, eStmt,
3430: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
3440: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3450: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 53 74 6d   ){.    if( eStm
3460: 74 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f  t==SQL_SELECT_DO
3470: 43 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 73  CSIZE ){.      s
3480: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
3490: 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 44 6f 63  4(pStmt, 1, iDoc
34a0: 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  id);.    }.    r
34b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
34c0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
34d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
34e0: 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
34f0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29  n_type(pStmt, 0)
3500: 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  !=SQLITE_BLOB ){
3510: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
3520: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
3530: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
3540: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
3550: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
3560: 56 54 41 42 3b 0a 20 20 20 20 20 20 70 53 74 6d  VTAB;.      pStm
3570: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
3580: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
3590: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
35a0: 7d 0a 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 70  }..  *ppStmt = p
35b0: 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  Stmt;.  return r
35c0: 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
35d0: 33 46 74 73 33 53 65 6c 65 63 74 44 6f 63 74 6f  3Fts3SelectDocto
35e0: 74 61 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65  tal(.  Fts3Table
35f0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
3600: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74         /* Fts3 t
3610: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
3620: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
3630: 70 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20  ppStmt          
3640: 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65   /* OUT: Stateme
3650: 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a  nt handle */.){.
3660: 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 65 6c    return fts3Sel
3670: 65 63 74 44 6f 63 73 69 7a 65 28 70 54 61 62 2c  ectDocsize(pTab,
3680: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 54   SQL_SELECT_DOCT
3690: 4f 54 41 4c 2c 20 30 2c 20 70 70 53 74 6d 74 29  OTAL, 0, ppStmt)
36a0: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
36b0: 46 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a  Fts3SelectDocsiz
36c0: 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
36d0: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
36e0: 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62       /* Fts3 tab
36f0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
3700: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
3710: 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  cid,           /
3720: 2a 20 44 6f 63 69 64 20 74 6f 20 72 65 61 64 20  * Docid to read 
3730: 73 69 7a 65 20 64 61 74 61 20 66 6f 72 20 2a 2f  size data for */
3740: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
3750: 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20  **ppStmt        
3760: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65     /* OUT: State
3770: 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29  ment handle */.)
3780: 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53  {.  return fts3S
3790: 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 70 54 61  electDocsize(pTa
37a0: 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f  b, SQL_SELECT_DO
37b0: 43 53 49 5a 45 2c 20 69 44 6f 63 69 64 2c 20 70  CSIZE, iDocid, p
37c0: 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pStmt);.}../*.**
37d0: 20 53 69 6d 69 6c 61 72 20 74 6f 20 66 74 73 33   Similar to fts3
37e0: 53 71 6c 53 74 6d 74 28 29 2e 20 45 78 63 65 70  SqlStmt(). Excep
37f0: 74 2c 20 61 66 74 65 72 20 62 69 6e 64 69 6e 67  t, after binding
3800: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
3810: 69 6e 0a 2a 2a 20 61 72 72 61 79 20 61 70 56 61  in.** array apVa
3820: 6c 5b 5d 20 74 6f 20 74 68 65 20 53 51 4c 20 73  l[] to the SQL s
3830: 74 61 74 65 6d 65 6e 74 20 69 64 65 6e 74 69 66  tatement identif
3840: 69 65 64 20 62 79 20 65 53 74 6d 74 2c 20 74 68  ied by eStmt, th
3850: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  e statement.** i
3860: 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a  s executed..**.*
3870: 2a 20 52 65 74 75 72 6e 73 20 53 51 4c 49 54 45  * Returns SQLITE
3880: 5f 4f 4b 20 69 66 20 74 68 65 20 73 74 61 74 65  _OK if the state
3890: 6d 65 6e 74 20 69 73 20 73 75 63 63 65 73 73 66  ment is successf
38a0: 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2c 20 6f  ully executed, o
38b0: 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65  r an.** SQLite e
38c0: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
38d0: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ise..*/.static v
38e0: 6f 69 64 20 66 74 73 33 53 71 6c 45 78 65 63 28  oid fts3SqlExec(
38f0: 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20  .  int *pRC,    
3900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3910: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
3920: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
3930: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3940: 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20  FTS3 table */.  
3950: 69 6e 74 20 65 53 74 6d 74 2c 20 20 20 20 20 20  int eStmt,      
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
3970: 78 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 20 74  x of statement t
3980: 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20 20  o evaluate */.  
3990: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
39a0: 61 70 56 61 6c 20 20 20 20 2f 2a 20 50 61 72 61  apVal    /* Para
39b0: 6d 65 74 65 72 73 20 74 6f 20 62 69 6e 64 20 2a  meters to bind *
39c0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
39d0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
39e0: 74 20 72 63 3b 0a 20 20 69 66 28 20 2a 70 52 43  t rc;.  if( *pRC
39f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20   ) return;.  rc 
3a00: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
3a10: 20 65 53 74 6d 74 2c 20 26 70 53 74 6d 74 2c 20   eStmt, &pStmt, 
3a20: 61 70 56 61 6c 29 3b 20 0a 20 20 69 66 28 20 72  apVal); .  if( r
3a30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
3a50: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20  (pStmt);.    rc 
3a60: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
3a70: 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 2a 70  pStmt);.  }.  *p
3a80: 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  RC = rc;.}.../*.
3a90: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3aa0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
3ab0: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
3ac0: 61 69 6e 65 64 20 61 20 73 68 61 72 65 64 2d 63  ained a shared-c
3ad0: 61 63 68 65 0a 2a 2a 20 74 61 62 6c 65 2d 6c 6f  ache.** table-lo
3ae0: 63 6b 20 6f 6e 20 74 68 65 20 25 5f 63 6f 6e 74  ck on the %_cont
3af0: 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ent table. This 
3b00: 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
3b10: 72 65 20 72 65 61 64 69 6e 67 0a 2a 2a 20 64 61  re reading.** da
3b20: 74 61 20 66 72 6f 6d 20 74 68 65 20 66 74 73 33  ta from the fts3
3b30: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69 73 20   table. If this 
3b40: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 71 75  lock is not acqu
3b50: 69 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 6e  ired first, then
3b60: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  .** the caller m
3b70: 61 79 20 65 6e 64 20 75 70 20 68 6f 6c 64 69 6e  ay end up holdin
3b80: 67 20 72 65 61 64 2d 6c 6f 63 6b 73 20 6f 6e 20  g read-locks on 
3b90: 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 61  the %_segments a
3ba0: 6e 64 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 74  nd %_segdir.** t
3bb0: 61 62 6c 65 73 2c 20 62 75 74 20 6e 6f 20 72 65  ables, but no re
3bc0: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25  ad-lock on the %
3bd0: 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20  _content table. 
3be0: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
3bf0: 0a 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63 6f 6e  .** a second con
3c00: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  nection will be 
3c10: 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f  able to write to
3c20: 20 74 68 65 20 66 74 73 33 20 74 61 62 6c 65 2c   the fts3 table,
3c30: 20 62 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69   but.** attempti
3c40: 6e 67 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 6f  ng to commit tho
3c50: 73 65 20 77 72 69 74 65 73 20 6d 69 67 68 74 20  se writes might 
3c60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
3c70: 43 4b 45 44 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  CKED or.** SQLIT
3c80: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
3c90: 41 43 48 45 20 28 62 65 63 61 75 73 65 20 74 68  ACHE (because th
3ca0: 65 20 63 6f 6d 6d 69 74 20 61 74 74 65 6d 70 74  e commit attempt
3cb0: 73 20 74 6f 20 6f 62 74 61 69 6e 20 0a 2a 2a 20  s to obtain .** 
3cc0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 6f 6e 20 74  write-locks on t
3cd0: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 61 6e  he %_segments an
3ce0: 64 20 25 5f 73 65 67 64 69 72 20 2a 2a 20 74 61  d %_segdir ** ta
3cf0: 62 6c 65 73 29 2e 20 0a 2a 2a 0a 2a 2a 20 57 65  bles). .**.** We
3d00: 20 74 72 79 20 74 6f 20 61 76 6f 69 64 20 74 68   try to avoid th
3d10: 69 73 20 62 65 63 61 75 73 65 20 69 66 20 46 54  is because if FT
3d20: 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79 20 65  S3 returns any e
3d30: 72 72 6f 72 20 77 68 65 6e 20 63 6f 6d 6d 69 74  rror when commit
3d40: 74 69 6e 67 0a 2a 2a 20 61 20 74 72 61 6e 73 61  ting.** a transa
3d50: 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f 6c 65  ction, the whole
3d60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
3d70: 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
3d80: 2e 20 41 6e 64 20 74 68 69 73 20 69 73 0a 2a 2a  . And this is.**
3d90: 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72 73 20   not what users 
3da0: 65 78 70 65 63 74 20 77 68 65 6e 20 74 68 65 79  expect when they
3db0: 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   get SQLITE_LOCK
3dc0: 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 2e 20  ED_SHAREDCACHE. 
3dd0: 49 74 20 63 61 6e 0a 2a 2a 20 73 74 69 6c 6c 20  It can.** still 
3de0: 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 75 73  happen if the us
3df0: 65 72 20 72 65 61 64 73 20 64 61 74 61 20 64 69  er reads data di
3e00: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
3e10: 25 5f 73 65 67 6d 65 6e 74 73 20 6f 72 0a 2a 2a  %_segments or.**
3e20: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 73   %_segdir tables
3e30: 20 69 6e 73 74 65 61 64 20 6f 66 20 67 6f 69 6e   instead of goin
3e40: 67 20 74 68 72 6f 75 67 68 20 46 54 53 33 20 74  g through FTS3 t
3e50: 68 6f 75 67 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hough..*/.int sq
3e60: 6c 69 74 65 33 46 74 73 33 52 65 61 64 4c 6f 63  lite3Fts3ReadLoc
3e70: 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b  k(Fts3Table *p){
3e80: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
3eb0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
3ec0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
3ed0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
3ee0: 65 6e 74 20 75 73 65 64 20 74 6f 20 6f 62 74 61  ent used to obta
3ef0: 69 6e 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 72 63  in lock */..  rc
3f00: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
3f10: 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e  , SQL_SELECT_CON
3f20: 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26  TENT_BY_ROWID, &
3f30: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
3f40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3f50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
3f60: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 31  nd_null(pStmt, 1
3f70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
3f80: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
3f90: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
3fa0: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  et(pStmt);.  }. 
3fb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3fc0: 2a 0a 2a 2a 20 53 65 74 20 2a 70 70 53 74 6d 74  *.** Set *ppStmt
3fd0: 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20   to a statement 
3fe0: 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 79 20  handle that may 
3ff0: 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
4000: 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c  te through.** al
4010: 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 25 5f  l rows in the %_
4020: 73 65 67 64 69 72 20 74 61 62 6c 65 2c 20 66 72  segdir table, fr
4030: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
4040: 65 73 74 2e 20 49 66 20 73 75 63 63 65 73 73 66  est. If successf
4050: 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51  ul,.** return SQ
4060: 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65  LITE_OK. If an e
4070: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
4080: 65 20 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e preparing the 
4090: 73 74 61 74 65 6d 65 6e 74 2c 20 0a 2a 2a 20 72  statement, .** r
40a0: 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
40b0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
40c0: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
40d0: 65 76 65 72 20 6f 6e 65 20 69 6e 73 74 61 6e 63  ever one instanc
40e0: 65 20 6f 66 20 74 68 69 73 20 53 51 4c 20 73 74  e of this SQL st
40f0: 61 74 65 6d 65 6e 74 20 63 6f 6d 70 69 6c 65 64  atement compiled
4100: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 46 54 53   for.** each FTS
4110: 33 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  3 table..**.** T
4120: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  he statement ret
4130: 75 72 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  urns the followi
4140: 6e 67 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  ng columns from 
4150: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
4160: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 69  le:.**.**   0: i
4170: 64 78 0a 2a 2a 20 20 20 31 3a 20 73 74 61 72 74  dx.**   1: start
4180: 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 32 3a 20 6c  _block.**   2: l
4190: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a  eaves_end_block.
41a0: 2a 2a 20 20 20 33 3a 20 65 6e 64 5f 62 6c 6f 63  **   3: end_bloc
41b0: 6b 0a 2a 2a 20 20 20 34 3a 20 72 6f 6f 74 0a 2a  k.**   4: root.*
41c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
41d0: 33 41 6c 6c 53 65 67 64 69 72 73 28 0a 20 20 46  3AllSegdirs(.  F
41e0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4200: 2a 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a  * FTS3 table */.
4210: 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20    int iIndex,   
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4230: 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 70    /* Index for p
4240: 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20  ->aIndex[] */.  
4250: 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4270: 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 73 65 6c 65  /* Level to sele
4280: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
4290: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20  stmt **ppStmt   
42a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
42b0: 43 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  Compiled stateme
42c0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
42d0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  c;.  sqlite3_stm
42e0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  t *pStmt = 0;.. 
42f0: 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3d   assert( iLevel=
4300: 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
4310: 41 4c 4c 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30  ALL || iLevel>=0
4320: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
4330: 65 76 65 6c 3c 46 54 53 33 5f 53 45 47 44 49 52  evel<FTS3_SEGDIR
4340: 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a 20 20 61  _MAXLEVEL );.  a
4350: 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30  ssert( iIndex>=0
4360: 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49   && iIndex<p->nI
4370: 6e 64 65 78 20 29 3b 0a 0a 20 20 69 66 28 20 69  ndex );..  if( i
4380: 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 2f  Level<0 ){.    /
4390: 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  * "SELECT * FROM
43a0: 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20   %_segdir WHERE 
43b0: 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20  level BETWEEN ? 
43c0: 41 4e 44 20 3f 20 4f 52 44 45 52 20 42 59 20 2e  AND ? ORDER BY .
43d0: 2e 2e 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  .." */.    rc = 
43e0: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
43f0: 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f  QL_SELECT_LEVEL_
4400: 52 41 4e 47 45 2c 20 26 70 53 74 6d 74 2c 20 30  RANGE, &pStmt, 0
4410: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
4420: 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
4430: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
4440: 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 69 49  int(pStmt, 1, iI
4450: 6e 64 65 78 2a 46 54 53 33 5f 53 45 47 44 49 52  ndex*FTS3_SEGDIR
4460: 5f 4d 41 58 4c 45 56 45 4c 29 3b 0a 20 20 20 20  _MAXLEVEL);.    
4470: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
4480: 6e 74 28 70 53 74 6d 74 2c 20 32 2c 20 28 69 49  nt(pStmt, 2, (iI
4490: 6e 64 65 78 2b 31 29 2a 46 54 53 33 5f 53 45 47  ndex+1)*FTS3_SEG
44a0: 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 3b  DIR_MAXLEVEL-1);
44b0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
44c0: 20 20 20 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a      /* "SELECT *
44d0: 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57   FROM %_segdir W
44e0: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 4f  HERE level = ? O
44f0: 52 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a  RDER BY ..." */.
4500: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
4510: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
4520: 43 54 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74  CT_LEVEL, &pStmt
4530: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
4540: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  ==SQLITE_OK ){ .
4550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
4560: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
4570: 20 69 4c 65 76 65 6c 2b 69 49 6e 64 65 78 2a 46   iLevel+iIndex*F
4580: 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
4590: 56 45 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  VEL);.    }.  }.
45a0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d    *ppStmt = pStm
45b0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
45c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
45d0: 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74   a single varint
45e0: 20 74 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73   to a PendingLis
45f0: 74 20 62 75 66 66 65 72 2e 20 53 51 4c 49 54 45  t buffer. SQLITE
4600: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
4610: 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ** if successful
4620: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
4630: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
4640: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ise..**.** This 
4650: 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 73 65  function also se
4660: 72 76 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  rves to allocate
4670: 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69 73 74   the PendingList
4680: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
4690: 66 2e 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  f..** For exampl
46a0: 65 2c 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  e, to create a n
46b0: 65 77 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73  ew PendingList s
46c0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
46d0: 69 6e 67 20 74 77 6f 0a 2a 2a 20 76 61 72 69 6e  ing two.** varin
46e0: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 65 6e 64  ts:.**.**   Pend
46f0: 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 30 3b 0a  ingList *p = 0;.
4700: 2a 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67  **   fts3Pending
4710: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
4720: 28 26 70 2c 20 31 29 3b 0a 2a 2a 20 20 20 66 74  (&p, 1);.**   ft
4730: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
4740: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 32 29  endVarint(&p, 2)
4750: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
4760: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
4770: 70 70 65 6e 64 56 61 72 69 6e 74 28 0a 20 20 50  ppendVarint(.  P
4780: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c  endingList **pp,
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47a0: 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
47b0: 72 20 74 6f 20 50 65 6e 64 69 6e 67 4c 69 73 74  r to PendingList
47c0: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 73 71 6c   struct */.  sql
47d0: 69 74 65 33 5f 69 6e 74 36 34 20 69 20 20 20 20  ite3_int64 i    
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47f0: 56 61 6c 75 65 20 74 6f 20 61 70 70 65 6e 64 20  Value to append 
4800: 74 6f 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20  to data */.){.  
4810: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d  PendingList *p =
4820: 20 2a 70 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f   *pp;..  /* Allo
4830: 63 61 74 65 20 6f 72 20 67 72 6f 77 20 74 68 65  cate or grow the
4840: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 61 73 20   PendingList as 
4850: 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
4860: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 70 20 3d  f( !p ){.    p =
4870: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
4880: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 31 30 30  sizeof(*p) + 100
4890: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b  );.    if( !p ){
48a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
48b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
48c0: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
48d0: 3d 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61 44  = 100;.    p->aD
48e0: 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ata = (char *)&p
48f0: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 6e 44 61 74  [1];.    p->nDat
4900: 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73  a = 0;.  }.  els
4910: 65 20 69 66 28 20 70 2d 3e 6e 44 61 74 61 2b 46  e if( p->nData+F
4920: 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2b 31  TS3_VARINT_MAX+1
4930: 3e 70 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20 20  >p->nSpace ){.  
4940: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 2d 3e    int nNew = p->
4950: 6e 53 70 61 63 65 20 2a 20 32 3b 0a 20 20 20 20  nSpace * 2;.    
4960: 70 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  p = sqlite3_real
4970: 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 2a 70  loc(p, sizeof(*p
4980: 29 20 2b 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69  ) + nNew);.    i
4990: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 73  f( !p ){.      s
49a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 29  qlite3_free(*pp)
49b0: 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b  ;.      *pp = 0;
49c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
49d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
49e0: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
49f0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 61  = nNew;.    p->a
4a00: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26  Data = (char *)&
4a10: 70 5b 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  p[1];.  }..  /* 
4a20: 41 70 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  Append the new s
4a30: 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74  erialized varint
4a40: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
4a50: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  he list. */.  p-
4a60: 3e 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65  >nData += sqlite
4a70: 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
4a80: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74  p->aData[p->nDat
4a90: 61 5d 2c 20 69 29 3b 0a 20 20 70 2d 3e 61 44 61  a], i);.  p->aDa
4aa0: 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 20 3d 20 27  ta[p->nData] = '
4ab0: 5c 30 27 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a  \0';.  *pp = p;.
4ac0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4ad0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
4ae0: 20 61 20 64 6f 63 69 64 2f 63 6f 6c 75 6d 6e 2f   a docid/column/
4af0: 70 6f 73 69 74 69 6f 6e 20 65 6e 74 72 79 20 74  position entry t
4b00: 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  o a PendingList 
4b10: 73 74 72 75 63 74 75 72 65 2e 20 4e 6f 6e 2d 7a  structure. Non-z
4b20: 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
4b30: 65 64 20 69 66 20 74 68 65 20 73 74 72 75 63 74  ed if the struct
4b40: 75 72 65 20 69 73 20 73 71 6c 69 74 65 33 5f 72  ure is sqlite3_r
4b50: 65 61 6c 6c 6f 63 65 64 20 61 73 20 70 61 72 74  ealloced as part
4b60: 20 6f 66 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68   of adding.** th
4b70: 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  e entry. Otherwi
4b80: 73 65 2c 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  se, zero..**.** 
4b90: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
4ba0: 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20  occurs, *pRc is 
4bb0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
4bc0: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
4bd0: 6e 69 6e 67 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  ning..** Zero is
4be0: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65 64   always returned
4bf0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 4f   in this case. O
4c00: 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
4c10: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
4c20: 2c 0a 2a 2a 20 69 74 20 69 73 20 73 65 74 20 74  ,.** it is set t
4c30: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
4c40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
4c50: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
4c60: 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  (.  PendingList 
4c70: 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
4c80: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
4c90: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
4ca0: 74 75 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ture */.  sqlite
4cb0: 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20  3_int64 iDocid, 
4cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
4cd0: 69 64 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  id for entry to 
4ce0: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
4cf0: 5f 69 6e 74 36 34 20 69 43 6f 6c 2c 20 20 20 20  _int64 iCol,    
4d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
4d10: 6d 6e 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  mn for entry to 
4d20: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
4d30: 5f 69 6e 74 36 34 20 69 50 6f 73 2c 20 20 20 20  _int64 iPos,    
4d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
4d50: 74 69 6f 6e 20 6f 66 20 74 65 72 6d 20 66 6f 72  tion of term for
4d60: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
4d70: 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
4da0: 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 50  n code */.){.  P
4db0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20  endingList *p = 
4dc0: 2a 70 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *pp;.  int rc = 
4dd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
4de0: 73 65 72 74 28 20 21 70 20 7c 7c 20 70 2d 3e 69  sert( !p || p->i
4df0: 4c 61 73 74 44 6f 63 69 64 3c 3d 69 44 6f 63 69  LastDocid<=iDoci
4e00: 64 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 20 7c  d );..  if( !p |
4e10: 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 21  | p->iLastDocid!
4e20: 3d 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 73  =iDocid ){.    s
4e30: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
4e40: 6c 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 28  lta = iDocid - (
4e50: 70 20 3f 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69  p ? p->iLastDoci
4e60: 64 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  d : 0);.    if( 
4e70: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
4e80: 74 28 20 70 2d 3e 6e 44 61 74 61 3c 70 2d 3e 6e  t( p->nData<p->n
4e90: 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 61  Space );.      a
4ea0: 73 73 65 72 74 28 20 70 2d 3e 61 44 61 74 61 5b  ssert( p->aData[
4eb0: 70 2d 3e 6e 44 61 74 61 5d 3d 3d 30 20 29 3b 0a  p->nData]==0 );.
4ec0: 20 20 20 20 20 20 70 2d 3e 6e 44 61 74 61 2b 2b        p->nData++
4ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4ee0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
4ef0: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
4f00: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
4f10: 20 69 44 65 6c 74 61 29 29 20 29 7b 0a 20 20 20   iDelta)) ){.   
4f20: 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e 67 6c     goto pendingl
4f30: 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b 0a 20  istappend_out;. 
4f40: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c 61 73     }.    p->iLas
4f50: 74 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70  tCol = -1;.    p
4f60: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a  ->iLastPos = 0;.
4f70: 20 20 20 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69      p->iLastDoci
4f80: 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 7d 0a  d = iDocid;.  }.
4f90: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20    if( iCol>0 && 
4fa0: 70 2d 3e 69 4c 61 73 74 43 6f 6c 21 3d 69 43 6f  p->iLastCol!=iCo
4fb0: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  l ){.    if( SQL
4fc0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74  ITE_OK!=(rc = ft
4fd0: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
4fe0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29  endVarint(&p, 1)
4ff0: 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
5000: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50  _OK!=(rc = fts3P
5010: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
5020: 56 61 72 69 6e 74 28 26 70 2c 20 69 43 6f 6c 29  Varint(&p, iCol)
5030: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
5040: 6f 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61  oto pendinglista
5050: 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d  ppend_out;.    }
5060: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c  .    p->iLastCol
5070: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = iCol;.    p->
5080: 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20  iLastPos = 0;.  
5090: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
50a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
50b0: 50 6f 73 3e 70 2d 3e 69 4c 61 73 74 50 6f 73 20  Pos>p->iLastPos 
50c0: 7c 7c 20 28 69 50 6f 73 3d 3d 30 20 26 26 20 70  || (iPos==0 && p
50d0: 2d 3e 69 4c 61 73 74 50 6f 73 3d 3d 30 29 20 29  ->iLastPos==0) )
50e0: 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 50  ;.    rc = fts3P
50f0: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
5100: 56 61 72 69 6e 74 28 26 70 2c 20 32 2b 69 50 6f  Varint(&p, 2+iPo
5110: 73 2d 70 2d 3e 69 4c 61 73 74 50 6f 73 29 3b 0a  s-p->iLastPos);.
5120: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5130: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
5140: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 69 50 6f  ->iLastPos = iPo
5150: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 70  s;.    }.  }.. p
5160: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64  endinglistappend
5170: 5f 6f 75 74 3a 0a 20 20 2a 70 52 63 20 3d 20 72  _out:.  *pRc = r
5180: 63 3b 0a 20 20 69 66 28 20 70 21 3d 2a 70 70 20  c;.  if( p!=*pp 
5190: 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a  ){.    *pp = p;.
51a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
51b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
51c0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 50 65  ./*.** Free a Pe
51d0: 6e 64 69 6e 67 4c 69 73 74 20 6f 62 6a 65 63 74  ndingList object
51e0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74   allocated by ft
51f0: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
5200: 65 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  end()..*/.static
5210: 20 76 6f 69 64 20 66 74 73 33 50 65 6e 64 69 6e   void fts3Pendin
5220: 67 4c 69 73 74 44 65 6c 65 74 65 28 50 65 6e 64  gListDelete(Pend
5230: 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  ingList *pList){
5240: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5250: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
5260: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
5270: 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 65 6e 64   one of the pend
5280: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
5290: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
52a0: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
52b0: 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 46  TermsAddOne(.  F
52c0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 0a 20 20 69  ts3Table *p,.  i
52d0: 6e 74 20 69 43 6f 6c 2c 0a 20 20 69 6e 74 20 69  nt iCol,.  int i
52e0: 50 6f 73 2c 0a 20 20 46 74 73 33 48 61 73 68 20  Pos,.  Fts3Hash 
52f0: 2a 70 48 61 73 68 2c 20 20 20 20 20 20 20 20 20  *pHash,         
5300: 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e         /* Pendin
5310: 67 20 74 65 72 6d 73 20 68 61 73 68 20 74 61 62  g terms hash tab
5320: 6c 65 20 74 6f 20 61 64 64 20 65 6e 74 72 79 20  le to add entry 
5330: 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  to */.  const ch
5340: 61 72 20 2a 7a 54 6f 6b 65 6e 2c 0a 20 20 69 6e  ar *zToken,.  in
5350: 74 20 6e 54 6f 6b 65 6e 0a 29 7b 0a 20 20 50 65  t nToken.){.  Pe
5360: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
5370: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
5380: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 4c 69 73 74  ITE_OK;..  pList
5390: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
53a0: 2a 29 66 74 73 33 48 61 73 68 46 69 6e 64 28 70  *)fts3HashFind(p
53b0: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  Hash, zToken, nT
53c0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4c 69  oken);.  if( pLi
53d0: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65  st ){.    p->nPe
53e0: 6e 64 69 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c  ndingData -= (pL
53f0: 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f  ist->nData + nTo
5400: 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  ken + sizeof(Fts
5410: 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20 7d  3HashElem));.  }
5420: 0a 20 20 69 66 28 20 66 74 73 33 50 65 6e 64 69  .  if( fts3Pendi
5430: 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 4c  ngListAppend(&pL
5440: 69 73 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63  ist, p->iPrevDoc
5450: 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
5460: 26 72 63 29 20 29 7b 0a 20 20 20 20 69 66 28 20  &rc) ){.    if( 
5470: 70 4c 69 73 74 3d 3d 66 74 73 33 48 61 73 68 49  pList==fts3HashI
5480: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 54 6f  nsert(pHash, zTo
5490: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69  ken, nToken, pLi
54a0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  st) ){.      /* 
54b0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 77 68  Malloc failed wh
54c0: 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68  ile inserting th
54d0: 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 69  e new entry. Thi
54e0: 73 20 63 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20  s can only .    
54f0: 20 20 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74    ** happen if t
5500: 68 65 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76  here was no prev
5510: 69 6f 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74  ious entry for t
5520: 68 69 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20  his token..     
5530: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
5540: 28 20 30 3d 3d 66 74 73 33 48 61 73 68 46 69 6e  ( 0==fts3HashFin
5550: 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c  d(pHash, zToken,
5560: 20 6e 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20   nToken) );.    
5570: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5580: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20  List);.      rc 
5590: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
55a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
55b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
55c0: 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
55d0: 44 61 74 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e  Data += (pList->
55e0: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b  nData + nToken +
55f0: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
5600: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 72 65  Elem));.  }.  re
5610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5620: 2a 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e  * Tokenize the n
5630: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
5640: 72 69 6e 67 20 7a 54 65 78 74 20 61 6e 64 20 61  ring zText and a
5650: 64 64 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f  dd all tokens to
5660: 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d   the.** pending-
5670: 74 65 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65  terms hash-table
5680: 2e 20 54 68 65 20 64 6f 63 69 64 20 75 73 65 64  . The docid used
5690: 20 69 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   is that current
56a0: 6c 79 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ly stored in.** 
56b0: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 61  p->iPrevDocid, a
56c0: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  nd the column is
56d0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 61 72   specified by ar
56e0: 67 75 6d 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a  gument iCol..**.
56f0: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
5700: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
5710: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
5720: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
5730: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
5740: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
5750: 69 6e 67 54 65 72 6d 73 41 64 64 28 0a 20 20 46  ingTermsAdd(.  F
5760: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5780: 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  * Table into whi
5790: 63 68 20 74 65 78 74 20 77 69 6c 6c 20 62 65 20  ch text will be 
57a0: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 63 6f  inserted */.  co
57b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
57d0: 20 54 65 78 74 20 6f 66 20 64 6f 63 75 6d 65 6e   Text of documen
57e0: 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  t to be inserted
57f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
5820: 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78 74 20  into which text 
5830: 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
5840: 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 57 6f  d */.  u32 *pnWo
5850: 72 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rd              
5860: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
5870: 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
5880: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20  inserted */.){. 
5890: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
58a0: 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 69 45 6e  Start;.  int iEn
58b0: 64 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a 20  d;.  int iPos;. 
58c0: 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 30 3b 0a   int nWord = 0;.
58d0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
58e0: 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f  Token;.  int nTo
58f0: 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ken;..  sqlite3_
5900: 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65  tokenizer *pToke
5910: 6e 69 7a 65 72 20 3d 20 70 2d 3e 70 54 6f 6b 65  nizer = p->pToke
5920: 6e 69 7a 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  nizer;.  sqlite3
5930: 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
5940: 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65  e const *pModule
5950: 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70   = pTokenizer->p
5960: 4d 6f 64 75 6c 65 3b 0a 20 20 73 71 6c 69 74 65  Module;.  sqlite
5970: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73  3_tokenizer_curs
5980: 6f 72 20 2a 70 43 73 72 3b 0a 20 20 69 6e 74 20  or *pCsr;.  int 
5990: 28 2a 78 4e 65 78 74 29 28 73 71 6c 69 74 65 33  (*xNext)(sqlite3
59a0: 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f  _tokenizer_curso
59b0: 72 20 2a 70 43 75 72 73 6f 72 2c 0a 20 20 20 20  r *pCursor,.    
59c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 2c 69    const char**,i
59d0: 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e  nt*,int*,int*,in
59e0: 74 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t*);..  assert( 
59f0: 70 54 6f 6b 65 6e 69 7a 65 72 20 26 26 20 70 4d  pTokenizer && pM
5a00: 6f 64 75 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  odule );..  /* I
5a10: 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 69  f the user has i
5a20: 6e 73 65 72 74 65 64 20 61 20 4e 55 4c 4c 20 76  nserted a NULL v
5a30: 61 6c 75 65 2c 20 74 68 69 73 20 66 75 6e 63 74  alue, this funct
5a40: 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
5a50: 64 20 77 69 74 68 0a 20 20 2a 2a 20 7a 54 65 78  d with.  ** zTex
5a60: 74 3d 3d 30 2e 20 49 6e 20 74 68 69 73 20 63 61  t==0. In this ca
5a70: 73 65 2c 20 61 64 64 20 7a 65 72 6f 20 74 6f 6b  se, add zero tok
5a80: 65 6e 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  en entries to th
5a90: 65 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  e hash table and
5aa0: 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61   .  ** return ea
5ab0: 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 54  rly. */.  if( zT
5ac0: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ext==0 ){.    *p
5ad0: 6e 57 6f 72 64 20 3d 20 30 3b 0a 20 20 20 20 72  nWord = 0;.    r
5ae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5af0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 4d 6f  .  }..  rc = pMo
5b00: 64 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 54 6f 6b  dule->xOpen(pTok
5b10: 65 6e 69 7a 65 72 2c 20 7a 54 65 78 74 2c 20 2d  enizer, zText, -
5b20: 31 2c 20 26 70 43 73 72 29 3b 0a 20 20 69 66 28  1, &pCsr);.  if(
5b30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5b40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
5b50: 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 70 54 6f  .  }.  pCsr->pTo
5b60: 6b 65 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e  kenizer = pToken
5b70: 69 7a 65 72 3b 0a 0a 20 20 78 4e 65 78 74 20 3d  izer;..  xNext =
5b80: 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 3b   pModule->xNext;
5b90: 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
5ba0: 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20 26 26  _OK==rc.      &&
5bb0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
5bc0: 3d 20 78 4e 65 78 74 28 70 43 73 72 2c 20 26 7a  = xNext(pCsr, &z
5bd0: 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20  Token, &nToken, 
5be0: 26 69 53 74 61 72 74 2c 20 26 69 45 6e 64 2c 20  &iStart, &iEnd, 
5bf0: 26 69 50 6f 73 29 29 0a 20 20 29 7b 0a 20 20 20  &iPos)).  ){.   
5c00: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20   int i;.    if( 
5c10: 69 50 6f 73 3e 3d 6e 57 6f 72 64 20 29 20 6e 57  iPos>=nWord ) nW
5c20: 6f 72 64 20 3d 20 69 50 6f 73 2b 31 3b 0a 0a 20  ord = iPos+1;.. 
5c30: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 73 20     /* Positions 
5c40: 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 69  cannot be negati
5c50: 76 65 3b 20 77 65 20 75 73 65 20 2d 31 20 61 73  ve; we use -1 as
5c60: 20 61 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 6e   a terminator in
5c70: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a  ternally..    **
5c80: 20 54 6f 6b 65 6e 73 20 6d 75 73 74 20 68 61 76   Tokens must hav
5c90: 65 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 6c 65 6e  e a non-zero len
5ca0: 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  gth..    */.    
5cb0: 69 66 28 20 69 50 6f 73 3c 30 20 7c 7c 20 21 7a  if( iPos<0 || !z
5cc0: 54 6f 6b 65 6e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c  Token || nToken<
5cd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
5ce0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5cf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5d00: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
5d10: 65 20 74 65 72 6d 20 74 6f 20 74 68 65 20 74 65  e term to the te
5d20: 72 6d 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  rms index */.   
5d30: 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
5d40: 67 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20  gTermsAddOne(.  
5d50: 20 20 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69        p, iCol, i
5d60: 50 6f 73 2c 20 26 70 2d 3e 61 49 6e 64 65 78 5b  Pos, &p->aIndex[
5d70: 30 5d 2e 68 50 65 6e 64 69 6e 67 2c 20 7a 54 6f  0].hPending, zTo
5d80: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 20 20  ken, nToken.    
5d90: 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41  );.    .    /* A
5da0: 64 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20 65  dd the term to e
5db0: 61 63 68 20 6f 66 20 74 68 65 20 70 72 65 66 69  ach of the prefi
5dc0: 78 20 69 6e 64 65 78 65 73 20 74 68 61 74 20 69  x indexes that i
5dd0: 74 20 69 73 20 6e 6f 74 20 74 6f 6f 20 0a 20 20  t is not too .  
5de0: 20 20 2a 2a 20 73 68 6f 72 74 20 66 6f 72 2e 20    ** short for. 
5df0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  */.    for(i=1; 
5e00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
5e10: 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b   i<p->nIndex; i+
5e20: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
5e30: 20 46 74 73 33 49 6e 64 65 78 20 2a 70 49 6e 64   Fts3Index *pInd
5e40: 65 78 20 3d 20 26 70 2d 3e 61 49 6e 64 65 78 5b  ex = &p->aIndex[
5e50: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54  i];.      if( nT
5e60: 6f 6b 65 6e 3c 70 49 6e 64 65 78 2d 3e 6e 50 72  oken<pIndex->nPr
5e70: 65 66 69 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b  efix ) continue;
5e80: 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
5e90: 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f  PendingTermsAddO
5ea0: 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  ne(.          p,
5eb0: 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 49   iCol, iPos, &pI
5ec0: 6e 64 65 78 2d 3e 68 50 65 6e 64 69 6e 67 2c 20  ndex->hPending, 
5ed0: 7a 54 6f 6b 65 6e 2c 20 70 49 6e 64 65 78 2d 3e  zToken, pIndex->
5ee0: 6e 50 72 65 66 69 78 0a 20 20 20 20 20 20 29 3b  nPrefix.      );
5ef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4d  .    }.  }..  pM
5f00: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 43  odule->xClose(pC
5f10: 73 72 29 3b 0a 20 20 2a 70 6e 57 6f 72 64 20 3d  sr);.  *pnWord =
5f20: 20 6e 57 6f 72 64 3b 0a 20 20 72 65 74 75 72 6e   nWord;.  return
5f30: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
5f40: 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
5f50: 72 63 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43  rc);.}../* .** C
5f60: 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
5f70: 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
5f80: 68 61 74 20 73 75 62 73 65 71 75 65 6e 74 20 63  hat subsequent c
5f90: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 66 74 73 33  alls to .** fts3
5fa0: 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28  PendingTermsAdd(
5fb0: 29 20 61 72 65 20 74 6f 20 61 64 64 20 74 65 72  ) are to add ter
5fc0: 6d 2f 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  m/position-list 
5fd0: 70 61 69 72 73 20 66 6f 72 20 74 68 65 0a 2a 2a  pairs for the.**
5fe0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
5ff0: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64   document with d
6000: 6f 63 69 64 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a  ocid iDocid..*/.
6010: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
6020: 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64  endingTermsDocid
6030: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73  (Fts3Table *p, s
6040: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 44 6f 63  qlite_int64 iDoc
6050: 69 64 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 28 73  id){.  /* TODO(s
6060: 68 65 73 73 29 20 45 78 70 6c 6f 72 65 20 77 68  hess) Explore wh
6070: 65 74 68 65 72 20 70 61 72 74 69 61 6c 6c 79 20  ether partially 
6080: 66 6c 75 73 68 69 6e 67 20 74 68 65 20 62 75 66  flushing the buf
6090: 66 65 72 20 6f 6e 0a 20 20 2a 2a 20 66 6f 72 63  fer on.  ** forc
60a0: 65 64 2d 66 6c 75 73 68 20 77 6f 75 6c 64 20 70  ed-flush would p
60b0: 72 6f 76 69 64 65 20 62 65 74 74 65 72 20 70 65  rovide better pe
60c0: 72 66 6f 72 6d 61 6e 63 65 2e 20 20 49 20 73 75  rformance.  I su
60d0: 73 70 65 63 74 20 74 68 61 74 20 69 66 0a 20 20  spect that if.  
60e0: 2a 2a 20 77 65 20 6f 72 64 65 72 65 64 20 74 68  ** we ordered th
60f0: 65 20 64 6f 63 6c 69 73 74 73 20 62 79 20 73 69  e doclists by si
6100: 7a 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  ze and flushed t
6110: 68 65 20 6c 61 72 67 65 73 74 20 75 6e 74 69 6c  he largest until
6120: 20 74 68 65 0a 20 20 2a 2a 20 62 75 66 66 65 72   the.  ** buffer
6130: 20 77 61 73 20 68 61 6c 66 20 65 6d 70 74 79 2c   was half empty,
6140: 20 74 68 61 74 20 77 6f 75 6c 64 20 6c 65 74 20   that would let 
6150: 74 68 65 20 6c 65 73 73 20 66 72 65 71 75 65 6e  the less frequen
6160: 74 20 74 65 72 6d 73 0a 20 20 2a 2a 20 67 65 6e  t terms.  ** gen
6170: 65 72 61 74 65 20 6c 6f 6e 67 65 72 20 64 6f 63  erate longer doc
6180: 6c 69 73 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lists..  */.  if
6190: 28 20 69 44 6f 63 69 64 3c 3d 70 2d 3e 69 50 72  ( iDocid<=p->iPr
61a0: 65 76 44 6f 63 69 64 20 7c 7c 20 70 2d 3e 6e 50  evDocid || p->nP
61b0: 65 6e 64 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d  endingData>p->nM
61c0: 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20 29 7b  axPendingData ){
61d0: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
61e0: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
61f0: 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
6200: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6210: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6220: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65 76  ;.  }.  p->iPrev
6230: 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
6240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6250: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  OK;.}../*.** Dis
6260: 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
6270: 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
6280: 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c  -terms hash tabl
6290: 65 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  es. .*/.void sql
62a0: 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54  ite3Fts3PendingT
62b0: 65 72 6d 73 43 6c 65 61 72 28 46 74 73 33 54 61  ermsClear(Fts3Ta
62c0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
62d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
62e0: 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a  ->nIndex; i++){.
62f0: 20 20 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d      Fts3HashElem
6300: 20 2a 70 45 6c 65 6d 3b 0a 20 20 20 20 46 74 73   *pElem;.    Fts
6310: 33 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26  3Hash *pHash = &
6320: 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 68 50 65  p->aIndex[i].hPe
6330: 6e 64 69 6e 67 3b 0a 20 20 20 20 66 6f 72 28 70  nding;.    for(p
6340: 45 6c 65 6d 3d 66 74 73 33 48 61 73 68 46 69 72  Elem=fts3HashFir
6350: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
6360: 3b 20 70 45 6c 65 6d 3d 66 74 73 33 48 61 73 68  ; pElem=fts3Hash
6370: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
6380: 20 20 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20      PendingList 
6390: 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69 6e  *pList = (Pendin
63a0: 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73 68  gList *)fts3Hash
63b0: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
63c0: 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69     fts3PendingLi
63d0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
63e0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 48  .    }.    fts3H
63f0: 61 73 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b  ashClear(pHash);
6400: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50 65 6e 64 69  .  }.  p->nPendi
6410: 6e 67 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngData = 0;.}../
6420: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6430: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
6440: 74 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65  the xUpdate() me
6450: 74 68 6f 64 20 61 73 20 70 61 72 74 20 6f 66 20  thod as part of 
6460: 61 6e 20 49 4e 53 45 52 54 0a 2a 2a 20 6f 70 65  an INSERT.** ope
6470: 72 61 74 69 6f 6e 2e 20 49 74 20 61 64 64 73 20  ration. It adds 
6480: 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
6490: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 6e 65 77   term in the new
64a0: 20 72 65 63 6f 72 64 20 74 6f 20 74 68 65 0a 2a   record to the.*
64b0: 2a 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 68  * pendingTerms h
64c0: 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ash table..**.**
64d0: 20 41 72 67 75 6d 65 6e 74 20 61 70 56 61 6c 20   Argument apVal 
64e0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
64f0: 68 65 20 73 69 6d 69 6c 61 72 6c 79 20 6e 61 6d  he similarly nam
6500: 65 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ed argument pass
6510: 65 64 20 74 6f 0a 2a 2a 20 66 74 73 33 49 6e 73  ed to.** fts3Ins
6520: 65 72 74 44 61 74 61 28 29 2e 20 50 61 72 61 6d  ertData(). Param
6530: 65 74 65 72 20 69 44 6f 63 69 64 20 69 73 20 74  eter iDocid is t
6540: 68 65 20 64 6f 63 69 64 20 6f 66 20 74 68 65 20  he docid of the 
6550: 6e 65 77 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  new row..*/.stat
6560: 69 63 20 69 6e 74 20 66 74 73 33 49 6e 73 65 72  ic int fts3Inser
6570: 74 54 65 72 6d 73 28 46 74 73 33 54 61 62 6c 65  tTerms(Fts3Table
6580: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c   *p, sqlite3_val
6590: 75 65 20 2a 2a 61 70 56 61 6c 2c 20 75 33 32 20  ue **apVal, u32 
65a0: 2a 61 53 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20  *aSz){.  int i; 
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
65d0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
65e0: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 70 2d  .  for(i=2; i<p-
65f0: 3e 6e 43 6f 6c 75 6d 6e 2b 32 3b 20 69 2b 2b 29  >nColumn+2; i++)
6600: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
6610: 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
6620: 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
6630: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
6640: 5b 69 5d 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  [i]);.    int rc
6650: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
6660: 72 6d 73 41 64 64 28 70 2c 20 7a 54 65 78 74 2c  rmsAdd(p, zText,
6670: 20 69 2d 32 2c 20 26 61 53 7a 5b 69 2d 32 5d 29   i-2, &aSz[i-2])
6680: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
6690: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
66a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
66b0: 7d 0a 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f  }.    aSz[p->nCo
66c0: 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33  lumn] += sqlite3
66d0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56  _value_bytes(apV
66e0: 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  al[i]);.  }.  re
66f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
6710: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6720: 20 62 79 20 74 68 65 20 78 55 70 64 61 74 65 28   by the xUpdate(
6730: 29 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 6e 20  ) method for an 
6740: 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
6750: 2e 0a 2a 2a 20 54 68 65 20 61 70 56 61 6c 20 70  ..** The apVal p
6760: 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
6770: 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ed a copy of the
6780: 20 61 70 56 61 6c 20 61 72 67 75 6d 65 6e 74 20   apVal argument 
6790: 70 61 73 73 65 64 20 62 79 0a 2a 2a 20 53 51 4c  passed by.** SQL
67a0: 69 74 65 20 74 6f 20 74 68 65 20 78 55 70 64 61  ite to the xUpda
67b0: 74 65 28 29 20 6d 65 74 68 6f 64 2e 20 69 2e 65  te() method. i.e
67c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  :.**.**   apVal[
67d0: 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0]              
67e0: 20 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 49    Not used for I
67f0: 4e 53 45 52 54 2e 0a 2a 2a 20 20 20 61 70 56 61  NSERT..**   apVa
6800: 6c 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  l[1]            
6810: 20 20 20 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61      rowid.**   a
6820: 70 56 61 6c 5b 32 5d 20 20 20 20 20 20 20 20 20  pVal[2]         
6830: 20 20 20 20 20 20 20 4c 65 66 74 2d 6d 6f 73 74         Left-most
6840: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
6850: 6c 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a  lumn.**   ....**
6860: 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c     apVal[p->nCol
6870: 75 6d 6e 2b 31 5d 20 20 20 20 20 52 69 67 68 74  umn+1]     Right
6880: 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e  -most user-defin
6890: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61  ed column.**   a
68a0: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
68b0: 32 5d 20 20 20 20 20 48 69 64 64 65 6e 20 63 6f  2]     Hidden co
68c0: 6c 75 6d 6e 20 77 69 74 68 20 73 61 6d 65 20 6e  lumn with same n
68d0: 61 6d 65 20 61 73 20 74 61 62 6c 65 0a 2a 2a 20  ame as table.** 
68e0: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
68f0: 6d 6e 2b 33 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+3]     Hidden
6900: 20 22 64 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 20   "docid" column 
6910: 28 61 6c 69 61 73 20 66 6f 72 20 72 6f 77 69 64  (alias for rowid
6920: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
6930: 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 0a  fts3InsertData(.
6940: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74    /* Full-text t
6970: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
6980: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c  3_value **apVal,
6990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
69a0: 61 79 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  ay of values to 
69b0: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 73 71 6c 69  insert */.  sqli
69c0: 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63  te3_int64 *piDoc
69d0: 69 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  id          /* O
69e0: 55 54 3a 20 44 6f 63 69 64 20 66 6f 72 20 72 6f  UT: Docid for ro
69f0: 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20  w just inserted 
6a00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
6a30: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
6a40: 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6e 74 65  te3_stmt *pConte
6a50: 6e 74 49 6e 73 65 72 74 3b 20 20 20 2f 2a 20 49  ntInsert;   /* I
6a60: 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63 6f 6e  NSERT INTO %_con
6a70: 74 65 6e 74 20 56 41 4c 55 45 53 28 2e 2e 2e 29  tent VALUES(...)
6a80: 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65   */..  /* Locate
6a90: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
6aa0: 61 6e 64 6c 65 20 75 73 65 64 20 74 6f 20 69 6e  andle used to in
6ab0: 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
6ac0: 68 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a  he %_content.  *
6ad0: 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 53 51 4c  * table. The SQL
6ae0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d   for this statem
6af0: 65 6e 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ent is:.  **.  *
6b00: 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  *   INSERT INTO 
6b10: 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53  %_content VALUES
6b20: 28 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20  (?, ?, ?, ...). 
6b30: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61   **.  ** The sta
6b40: 74 65 6d 65 6e 74 20 66 65 61 74 75 72 65 73 20  tement features 
6b50: 4e 20 27 3f 27 20 76 61 72 69 61 62 6c 65 73 2c  N '?' variables,
6b60: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
6b70: 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 0a 20  number of user. 
6b80: 20 2a 2a 20 64 65 66 69 6e 65 64 20 63 6f 6c 75   ** defined colu
6b90: 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53 33 20  mns in the FTS3 
6ba0: 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20  table, plus one 
6bb0: 66 6f 72 20 74 68 65 20 64 6f 63 69 64 20 66 69  for the docid fi
6bc0: 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
6bd0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
6be0: 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45  SQL_CONTENT_INSE
6bf0: 52 54 2c 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73  RT, &pContentIns
6c00: 65 72 74 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b  ert, &apVal[1]);
6c10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6c20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
6c30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
6c40: 20 54 68 65 72 65 20 69 73 20 61 20 71 75 69 72   There is a quir
6c50: 6b 20 68 65 72 65 2e 20 54 68 65 20 75 73 65 72  k here. The user
6c60: 73 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  s INSERT stateme
6c70: 6e 74 20 6d 61 79 20 68 61 76 65 20 73 70 65 63  nt may have spec
6c80: 69 66 69 65 64 0a 20 20 2a 2a 20 61 20 76 61 6c  ified.  ** a val
6c90: 75 65 20 66 6f 72 20 74 68 65 20 22 72 6f 77 69  ue for the "rowi
6ca0: 64 22 20 66 69 65 6c 64 2c 20 66 6f 72 20 74 68  d" field, for th
6cb0: 65 20 22 64 6f 63 69 64 22 20 66 69 65 6c 64 2c  e "docid" field,
6cc0: 20 6f 72 20 66 6f 72 20 62 6f 74 68 2e 0a 20 20   or for both..  
6cd0: 2a 2a 20 57 68 69 63 68 20 69 73 20 61 20 70 72  ** Which is a pr
6ce0: 6f 62 6c 65 6d 2c 20 73 69 6e 63 65 20 22 72 6f  oblem, since "ro
6cf0: 77 69 64 22 20 61 6e 64 20 22 64 6f 63 69 64 22  wid" and "docid"
6d00: 20 61 72 65 20 61 6c 69 61 73 65 73 20 66 6f 72   are aliases for
6d10: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
6d20: 61 6c 75 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  alue. For exampl
6d30: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49  e:.  **.  **   I
6d40: 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73 33 74  NSERT INTO fts3t
6d50: 62 6c 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 29  bl(rowid, docid)
6d60: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
6d70: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46 54 53 33   **.  ** In FTS3
6d80: 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  , this is an err
6d90: 6f 72 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72  or. It is an err
6da0: 6f 72 20 74 6f 20 73 70 65 63 69 66 79 20 6e 6f  or to specify no
6db0: 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 20 20  n-NULL values.  
6dc0: 2a 2a 20 66 6f 72 20 62 6f 74 68 20 64 6f 63 69  ** for both doci
6dd0: 64 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72  d and some other
6de0: 20 72 6f 77 69 64 20 61 6c 69 61 73 2e 0a 20 20   rowid alias..  
6df0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
6e00: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
6e10: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 33  lue_type(apVal[3
6e20: 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b  +p->nColumn]) ){
6e30: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
6e40: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
6e50: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30  lue_type(apVal[0
6e60: 5d 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  ]).     && SQLIT
6e70: 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f  E_NULL!=sqlite3_
6e80: 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
6e90: 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  [1]).    ){.    
6ea0: 20 20 2f 2a 20 41 20 72 6f 77 69 64 2f 64 6f 63    /* A rowid/doc
6eb0: 69 64 20 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a  id conflict. */.
6ec0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6ed0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
6ee0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6ef0: 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 43 6f  3_bind_value(pCo
6f00: 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20 31 2c 20  ntentInsert, 1, 
6f10: 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75  apVal[3+p->nColu
6f20: 6d 6e 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mn]);.    if( rc
6f30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6f40: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
6f50: 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73  /* Execute the s
6f60: 74 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65  tatement to inse
6f70: 72 74 20 74 68 65 20 72 65 63 6f 72 64 2e 20 53  rt the record. S
6f80: 65 74 20 2a 70 69 44 6f 63 69 64 20 74 6f 20 74  et *piDocid to t
6f90: 68 65 20 0a 20 20 2a 2a 20 6e 65 77 20 64 6f 63  he .  ** new doc
6fa0: 69 64 20 76 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a  id value. .  */.
6fb0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6fc0: 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a  ContentInsert);.
6fd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
6fe0: 65 73 65 74 28 70 43 6f 6e 74 65 6e 74 49 6e 73  eset(pContentIns
6ff0: 65 72 74 29 3b 0a 0a 20 20 2a 70 69 44 6f 63 69  ert);..  *piDoci
7000: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
7010: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 2d  _insert_rowid(p-
7020: 3e 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >db);.  return r
7030: 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  c;.}..../*.** Re
7040: 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72  move all data fr
7050: 6f 6d 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  om the FTS3 tabl
7060: 65 2e 20 43 6c 65 61 72 20 74 68 65 20 68 61 73  e. Clear the has
7070: 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  h table containi
7080: 6e 67 0a 2a 2a 20 70 65 6e 64 69 6e 67 20 74 65  ng.** pending te
7090: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rms..*/.static i
70a0: 6e 74 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c  nt fts3DeleteAll
70b0: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a  (Fts3Table *p){.
70c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
70d0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
70e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
70f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 44 69 73 63 61 72   */..  /* Discar
7100: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
7110: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
7120: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20  rms hash table. 
7130: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  */.  sqlite3Fts3
7140: 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61  PendingTermsClea
7150: 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  r(p);..  /* Dele
7160: 74 65 20 65 76 65 72 79 74 68 69 6e 67 20 66 72  te everything fr
7170: 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74  om the %_content
7180: 2c 20 25 5f 73 65 67 6d 65 6e 74 73 20 61 6e 64  , %_segments and
7190: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 73   %_segdir tables
71a0: 2e 20 2a 2f 0a 20 20 66 74 73 33 53 71 6c 45 78  . */.  fts3SqlEx
71b0: 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44  ec(&rc, p, SQL_D
71c0: 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e  ELETE_ALL_CONTEN
71d0: 54 2c 20 30 29 3b 0a 20 20 66 74 73 33 53 71 6c  T, 0);.  fts3Sql
71e0: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
71f0: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 4d  _DELETE_ALL_SEGM
7200: 45 4e 54 53 2c 20 30 29 3b 0a 20 20 66 74 73 33  ENTS, 0);.  fts3
7210: 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20  SqlExec(&rc, p, 
7220: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
7230: 45 47 44 49 52 2c 20 30 29 3b 0a 20 20 69 66 28  EGDIR, 0);.  if(
7240: 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20   p->bHasDocsize 
7250: 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c 45 78  ){.    fts3SqlEx
7260: 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44  ec(&rc, p, SQL_D
7270: 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a  ELETE_ALL_DOCSIZ
7280: 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  E, 0);.  }.  if(
7290: 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a   p->bHasStat ){.
72a0: 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28      fts3SqlExec(
72b0: 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
72c0: 54 45 5f 41 4c 4c 5f 53 54 41 54 2c 20 30 29 3b  TE_ALL_STAT, 0);
72d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
72e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
72f0: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  irst element in 
7300: 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 72 72 61  the apVal[] arra
7310: 79 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  y is assumed to 
7320: 63 6f 6e 74 61 69 6e 20 74 68 65 20 64 6f 63 69  contain the doci
7330: 64 0a 2a 2a 20 28 61 6e 20 69 6e 74 65 67 65 72  d.** (an integer
7340: 29 20 6f 66 20 61 20 72 6f 77 20 61 62 6f 75 74  ) of a row about
7350: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
7360: 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73  Remove all terms
7370: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 75 6c   from the.** ful
7380: 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 2a 2f  l-text index..*/
7390: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
73a0: 33 44 65 6c 65 74 65 54 65 72 6d 73 28 20 0a 20  3DeleteTerms( . 
73b0: 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20   int *pRC,      
73c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
73d0: 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  lt code */.  Fts
73e0: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
73f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53 20       /* The FTS 
7400: 74 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  table to delete 
7410: 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65  from */.  sqlite
7420: 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c  3_value *pRowid,
7430: 20 20 2f 2a 20 54 68 65 20 64 6f 63 69 64 20 74    /* The docid t
7440: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
7450: 20 20 75 33 32 20 2a 61 53 7a 20 20 20 20 20 20    u32 *aSz      
7460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
7470: 65 73 20 6f 66 20 64 65 6c 65 74 65 64 20 64 6f  es of deleted do
7480: 63 75 6d 65 6e 74 20 77 72 69 74 74 65 6e 20 68  cument written h
7490: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
74a0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rc;.  sqlite3_st
74b0: 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 0a 20 20  mt *pSelect;..  
74c0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
74d0: 6e 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  n;.  rc = fts3Sq
74e0: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
74f0: 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52  ECT_CONTENT_BY_R
7500: 4f 57 49 44 2c 20 26 70 53 65 6c 65 63 74 2c 20  OWID, &pSelect, 
7510: 26 70 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20  &pRowid);.  if( 
7520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7530: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
7540: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
7550: 70 28 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  p(pSelect) ){.  
7560: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
7570: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
7580: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
7590: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
75a0: 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73  r *zText = (cons
75b0: 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
75c0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65  _column_text(pSe
75d0: 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  lect, i);.      
75e0: 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
75f0: 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20 7a 54  ngTermsAdd(p, zT
7600: 65 78 74 2c 20 2d 31 2c 20 26 61 53 7a 5b 69 2d  ext, -1, &aSz[i-
7610: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
7620: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7630: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7640: 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63  te3_reset(pSelec
7650: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  t);.          *p
7660: 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  RC = rc;.       
7670: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
7680: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 53 7a     }.        aSz
7690: 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20  [p->nColumn] += 
76a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
76b0: 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20 69 29  ytes(pSelect, i)
76c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
76d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
76e0: 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b  _reset(pSelect);
76f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
7700: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c  lite3_reset(pSel
7710: 65 63 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43  ect);.  }.  *pRC
7720: 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = rc;.}../*.** 
7730: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
7740: 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ion to account f
7750: 6f 72 20 74 68 65 20 63 69 72 63 75 6c 61 72 20  or the circular 
7760: 64 65 70 65 6e 64 65 6e 63 79 20 62 65 74 77 65  dependency betwe
7770: 65 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  en.** functions 
7780: 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65  fts3SegmentMerge
7790: 28 29 20 61 6e 64 20 66 74 73 33 41 6c 6c 6f 63  () and fts3Alloc
77a0: 61 74 65 53 65 67 64 69 72 49 64 78 28 29 2e 0a  ateSegdirIdx()..
77b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
77c0: 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 46  s3SegmentMerge(F
77d0: 74 73 33 54 61 62 6c 65 20 2a 2c 20 69 6e 74 2c  ts3Table *, int,
77e0: 20 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54   int);../* .** T
77f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
7800: 6f 63 61 74 65 73 20 61 20 6e 65 77 20 6c 65 76  ocates a new lev
7810: 65 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65 78 20  el iLevel index 
7820: 69 6e 20 74 68 65 20 73 65 67 64 69 72 20 74 61  in the segdir ta
7830: 62 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c  ble..** Usually,
7840: 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c   indexes are all
7850: 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 61 20  ocated within a 
7860: 6c 65 76 65 6c 20 73 65 71 75 65 6e 74 69 61 6c  level sequential
7870: 6c 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77  ly starting.** w
7880: 69 74 68 20 30 2c 20 73 6f 20 74 68 65 20 61 6c  ith 0, so the al
7890: 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 69 73  located index is
78a0: 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
78b0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
78c0: 72 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a  rned.** by:.**.*
78d0: 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 69  *   SELECT max(i
78e0: 64 78 29 20 46 52 4f 4d 20 25 5f 73 65 67 64 69  dx) FROM %_segdi
78f0: 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  r WHERE level = 
7900: 3a 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f  :iLevel.**.** Ho
7910: 77 65 76 65 72 2c 20 69 66 20 74 68 65 72 65 20  wever, if there 
7920: 61 72 65 20 61 6c 72 65 61 64 79 20 46 54 53 33  are already FTS3
7930: 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64  _MERGE_COUNT ind
7940: 65 78 65 73 20 61 74 20 74 68 65 20 72 65 71 75  exes at the requ
7950: 65 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20  ested.** level, 
7960: 74 68 65 79 20 61 72 65 20 6d 65 72 67 65 64 20  they are merged 
7970: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65  into a single le
7980: 76 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20 73  vel (iLevel+1) s
7990: 65 67 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 0a  egment and the .
79a0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64  ** allocated ind
79b0: 65 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  ex is 0..**.** I
79c0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
79d0: 69 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  iIdx is set to t
79e0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64  he allocated ind
79f0: 65 78 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49  ex slot and SQLI
7a00: 54 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65  TE_OK.** returne
7a10: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
7a20: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
7a30: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
7a40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
7a50: 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72  s3AllocateSegdir
7a60: 49 64 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65  Idx(.  Fts3Table
7a70: 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49 6e 64   *p, .  int iInd
7a80: 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
7a90: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
7aa0: 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a   for p->aIndex *
7ab0: 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
7ac0: 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 0a 29 7b  .  int *piIdx.){
7ad0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
7b00: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
7b10: 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b 20 20  tmt *pNextIdx;  
7b20: 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
7b30: 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61 74 20  for next idx at 
7b40: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a 2f 0a  level iLevel */.
7b50: 20 20 69 6e 74 20 69 4e 65 78 74 20 3d 20 30 3b    int iNext = 0;
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b70: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 71    /* Result of q
7b80: 75 65 72 79 20 70 4e 65 78 74 49 64 78 20 2a 2f  uery pNextIdx */
7b90: 0a 0a 20 20 2f 2a 20 53 65 74 20 76 61 72 69 61  ..  /* Set varia
7ba0: 62 6c 65 20 69 4e 65 78 74 20 74 6f 20 74 68 65  ble iNext to the
7bb0: 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
7bc0: 73 65 67 64 69 72 20 69 6e 64 65 78 20 61 74 20  segdir index at 
7bd0: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 2a 2f  level iLevel. */
7be0: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
7bf0: 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f  tmt(p, SQL_NEXT_
7c00: 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26  SEGMENT_INDEX, &
7c10: 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20  pNextIdx, 0);.  
7c20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7c30: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
7c40: 5f 62 69 6e 64 5f 69 6e 74 28 70 4e 65 78 74 49  _bind_int(pNextI
7c50: 64 78 2c 20 31 2c 20 69 49 6e 64 65 78 2a 46 54  dx, 1, iIndex*FT
7c60: 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
7c70: 45 4c 20 2b 20 69 4c 65 76 65 6c 29 3b 0a 20 20  EL + iLevel);.  
7c80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
7c90: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
7ca0: 4e 65 78 74 49 64 78 29 20 29 7b 0a 20 20 20 20  NextIdx) ){.    
7cb0: 20 20 69 4e 65 78 74 20 3d 20 73 71 6c 69 74 65    iNext = sqlite
7cc0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e 65  3_column_int(pNe
7cd0: 78 74 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 7d  xtIdx, 0);.    }
7ce0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7cf0: 33 5f 72 65 73 65 74 28 70 4e 65 78 74 49 64 78  3_reset(pNextIdx
7d00: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
7d10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7d20: 20 20 20 2f 2a 20 49 66 20 69 4e 65 78 74 20 69     /* If iNext i
7d30: 73 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55  s FTS3_MERGE_COU
7d40: 4e 54 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  NT, indicating t
7d50: 68 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c  hat level iLevel
7d60: 20 69 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20   is already.    
7d70: 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72 67 65 20 61  ** full, merge a
7d80: 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c  ll segments in l
7d90: 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 74 6f  evel iLevel into
7da0: 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c   a single iLevel
7db0: 2b 31 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  +1.    ** segmen
7dc0: 74 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 28  t and allocate (
7dd0: 6e 65 77 6c 79 20 66 72 65 65 64 29 20 69 6e 64  newly freed) ind
7de0: 65 78 20 30 20 61 74 20 6c 65 76 65 6c 20 69 4c  ex 0 at level iL
7df0: 65 76 65 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  evel. Otherwise,
7e00: 0a 20 20 20 20 2a 2a 20 69 66 20 69 4e 65 78 74  .    ** if iNext
7e10: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 46 54   is less than FT
7e20: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20  S3_MERGE_COUNT, 
7e30: 61 6c 6c 6f 63 61 74 65 20 69 6e 64 65 78 20 69  allocate index i
7e40: 4e 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Next..    */.   
7e50: 20 69 66 28 20 69 4e 65 78 74 3e 3d 46 54 53 33   if( iNext>=FTS3
7e60: 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a  _MERGE_COUNT ){.
7e70: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53        rc = fts3S
7e80: 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 69  egmentMerge(p, i
7e90: 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 3b 0a  Index, iLevel);.
7ea0: 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 30        *piIdx = 0
7eb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7ec0: 20 20 20 2a 70 69 49 64 78 20 3d 20 69 4e 65 78     *piIdx = iNex
7ed0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
7ee0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7ef0: 0a 2a 2a 20 54 68 65 20 25 5f 73 65 67 6d 65 6e  .** The %_segmen
7f00: 74 73 20 74 61 62 6c 65 20 69 73 20 64 65 63 6c  ts table is decl
7f10: 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ared as follows:
7f20: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
7f30: 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73  TABLE %_segments
7f40: 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45 52  (blockid INTEGER
7f50: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c   PRIMARY KEY, bl
7f60: 6f 63 6b 20 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20  ock BLOB).**.** 
7f70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
7f80: 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ads data from a 
7f90: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
7fa0: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
7fb0: 6c 65 2e 20 54 68 65 0a 2a 2a 20 73 70 65 63 69  le. The.** speci
7fc0: 66 69 63 20 72 6f 77 20 69 73 20 69 64 65 6e 74  fic row is ident
7fd0: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 42 6c  ified by the iBl
7fe0: 6f 63 6b 69 64 20 70 61 72 61 6d 65 74 65 72 2e  ockid parameter.
7ff0: 20 49 66 20 70 61 42 6c 6f 62 20 69 73 20 6e 6f   If paBlob is no
8000: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t.** NULL, then 
8010: 61 20 62 75 66 66 65 72 20 69 73 20 61 6c 6c 6f  a buffer is allo
8020: 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  cated using sqli
8030: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
8040: 20 70 6f 70 75 6c 61 74 65 64 0a 2a 2a 20 77 69   populated.** wi
8050: 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
8060: 6f 66 20 74 68 65 20 62 6c 6f 62 20 73 74 6f 72  of the blob stor
8070: 65 64 20 69 6e 20 74 68 65 20 22 62 6c 6f 63 6b  ed in the "block
8080: 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  " column of the 
8090: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 74  .** identified t
80a0: 61 62 6c 65 20 72 6f 77 20 69 73 2e 20 57 68 65  able row is. Whe
80b0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 42 6c  ther or not paBl
80c0: 6f 62 20 69 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42  ob is NULL, *pnB
80d0: 6c 6f 62 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  lob is set.** to
80e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
80f0: 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 62   blob in bytes b
8100: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
8110: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
8120: 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 74 68  or occurs, or th
8130: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
8140: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65   contain the spe
8150: 63 69 66 69 65 64 20 72 6f 77 2c 0a 2a 2a 20 61  cified row,.** a
8160: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
8170: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
8180: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
8190: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
81a0: 64 2e 20 49 66 0a 2a 2a 20 70 61 42 6c 6f 62 20  d. If.** paBlob 
81b0: 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
81c0: 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  n it is the resp
81d0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
81e0: 65 20 63 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65  e caller to.** e
81f0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
8200: 68 65 20 72 65 74 75 72 6e 65 64 20 62 75 66 66  he returned buff
8210: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  er..**.** This f
8220: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6c 65 61 76  unction may leav
8230: 65 20 61 6e 20 6f 70 65 6e 20 73 71 6c 69 74 65  e an open sqlite
8240: 33 5f 62 6c 6f 62 2a 20 68 61 6e 64 6c 65 20 69  3_blob* handle i
8250: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 33 54 61 62  n the.** Fts3Tab
8260: 6c 65 2e 70 53 65 67 6d 65 6e 74 73 20 76 61 72  le.pSegments var
8270: 69 61 62 6c 65 2e 20 54 68 69 73 20 68 61 6e 64  iable. This hand
8280: 6c 65 20 69 73 20 72 65 75 73 65 64 20 62 79 20  le is reused by 
8290: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
82a0: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63  .** to this func
82b0: 74 69 6f 6e 2e 20 54 68 65 20 68 61 6e 64 6c 65  tion. The handle
82c0: 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 20 62   may be closed b
82d0: 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a  y calling the.**
82e0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d   sqlite3Fts3Segm
82f0: 65 6e 74 73 43 6c 6f 73 65 28 29 20 66 75 6e 63  entsClose() func
8300: 74 69 6f 6e 2e 20 52 65 75 73 69 6e 67 20 61 20  tion. Reusing a 
8310: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 61  blob handle is a
8320: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
8330: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
8340: 74 2c 20 62 75 74 20 74 68 65 20 62 6c 6f 62 20  t, but the blob 
8350: 68 61 6e 64 6c 65 20 73 68 6f 75 6c 64 20 61 6c  handle should al
8360: 77 61 79 73 20 62 65 20 63 6c 6f 73 65 64 0a 2a  ways be closed.*
8370: 2a 20 62 65 66 6f 72 65 20 63 6f 6e 74 72 6f 6c  * before control
8380: 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
8390: 74 68 65 20 75 73 65 72 20 28 74 6f 20 70 72 65  the user (to pre
83a0: 76 65 6e 74 20 61 20 6c 6f 63 6b 20 62 65 69 6e  vent a lock bein
83b0: 67 20 68 65 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65  g held.** on the
83c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
83d0: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  or longer than n
83e0: 65 63 65 73 73 61 72 79 29 2e 20 54 68 75 73 2c  ecessary). Thus,
83f0: 20 61 6e 79 20 76 69 72 74 75 61 6c 20 74 61 62   any virtual tab
8400: 6c 65 0a 2a 2a 20 6d 65 74 68 6f 64 20 28 78 46  le.** method (xF
8410: 69 6c 74 65 72 20 65 74 63 2e 29 20 74 68 61 74  ilter etc.) that
8420: 20 6d 61 79 20 64 69 72 65 63 74 6c 79 20 6f 72   may directly or
8430: 20 69 6e 64 69 72 65 63 74 6c 79 20 63 61 6c 6c   indirectly call
8440: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
8450: 2a 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69  * must call sqli
8460: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
8470: 6c 6f 73 65 28 29 20 62 65 66 6f 72 65 20 72 65  lose() before re
8480: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
8490: 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42  sqlite3Fts3ReadB
84a0: 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c  lock(.  Fts3Tabl
84b0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
84c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
84d0: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
84e0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
84f0: 69 42 6c 6f 63 6b 69 64 2c 20 20 20 20 20 20 20  iBlockid,       
8500: 20 20 2f 2a 20 41 63 63 65 73 73 20 74 68 65 20    /* Access the 
8510: 72 6f 77 20 77 69 74 68 20 62 6c 6f 63 6b 69 64  row with blockid
8520: 3d 24 69 42 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20  =$iBlockid */.  
8530: 63 68 61 72 20 2a 2a 70 61 42 6c 6f 62 2c 20 20  char **paBlob,  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 2f 2a 20 4f 55 54 3a 20 42 6c 6f 62 20 64 61 74  /* OUT: Blob dat
8560: 61 20 69 6e 20 6d 61 6c 6c 6f 63 27 64 20 62 75  a in malloc'd bu
8570: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
8580: 6e 42 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20  nBlob,          
8590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
85a0: 3a 20 53 69 7a 65 20 6f 66 20 62 6c 6f 62 20 64  : Size of blob d
85b0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
85c0: 4c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 20  Load            
85d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
85e0: 20 42 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   Bytes actually 
85f0: 6c 6f 61 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  loaded */.){.  i
8600: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8620: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
8630: 0a 0a 20 20 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75  ..  /* pnBlob mu
8640: 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  st be non-NULL. 
8650: 70 61 42 6c 6f 62 20 6d 61 79 20 62 65 20 4e 55  paBlob may be NU
8660: 4c 4c 20 6f 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  LL or non-NULL. 
8670: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 6e 42  */.  assert( pnB
8680: 6c 6f 62 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  lob);..  if( p->
8690: 70 53 65 67 6d 65 6e 74 73 20 29 7b 0a 20 20 20  pSegments ){.   
86a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
86b0: 6f 62 5f 72 65 6f 70 65 6e 28 70 2d 3e 70 53 65  ob_reopen(p->pSe
86c0: 67 6d 65 6e 74 73 2c 20 69 42 6c 6f 63 6b 69 64  gments, iBlockid
86d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
86e0: 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65  if( 0==p->zSegme
86f0: 6e 74 73 54 62 6c 20 29 7b 0a 20 20 20 20 20 20  ntsTbl ){.      
8700: 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20  p->zSegmentsTbl 
8710: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8720: 66 28 22 25 73 5f 73 65 67 6d 65 6e 74 73 22 2c  f("%s_segments",
8730: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
8740: 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67    if( 0==p->zSeg
8750: 6d 65 6e 74 73 54 62 6c 20 29 20 72 65 74 75 72  mentsTbl ) retur
8760: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8770: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
8780: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
8790: 28 0a 20 20 20 20 20 20 20 70 2d 3e 64 62 2c 20  (.       p->db, 
87a0: 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 53 65 67 6d  p->zDb, p->zSegm
87b0: 65 6e 74 73 54 62 6c 2c 20 22 62 6c 6f 63 6b 22  entsTbl, "block"
87c0: 2c 20 69 42 6c 6f 63 6b 69 64 2c 20 30 2c 20 26  , iBlockid, 0, &
87d0: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 0a 20 20 20  p->pSegments.   
87e0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72   );.  }..  if( r
87f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8800: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
8810: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
8820: 65 73 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29  es(p->pSegments)
8830: 3b 0a 20 20 20 20 2a 70 6e 42 6c 6f 62 20 3d 20  ;.    *pnBlob = 
8840: 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28 20 70  nByte;.    if( p
8850: 61 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 63  aBlob ){.      c
8860: 68 61 72 20 2a 61 42 79 74 65 20 3d 20 73 71 6c  har *aByte = sql
8870: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
8880: 65 20 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41  e + FTS3_NODE_PA
8890: 44 44 49 4e 47 29 3b 0a 20 20 20 20 20 20 69 66  DDING);.      if
88a0: 28 20 21 61 42 79 74 65 20 29 7b 0a 20 20 20 20  ( !aByte ){.    
88b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
88c0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
88d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
88e0: 70 6e 4c 6f 61 64 20 26 26 20 6e 42 79 74 65 3e  pnLoad && nByte>
88f0: 28 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b  (FTS3_NODE_CHUNK
8900: 5f 54 48 52 45 53 48 4f 4c 44 29 20 29 7b 0a 20  _THRESHOLD) ){. 
8910: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d           nByte =
8920: 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b   FTS3_NODE_CHUNK
8930: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20  SIZE;.          
8940: 2a 70 6e 4c 6f 61 64 20 3d 20 6e 42 79 74 65 3b  *pnLoad = nByte;
8950: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8960: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8970: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 53 65  blob_read(p->pSe
8980: 67 6d 65 6e 74 73 2c 20 61 42 79 74 65 2c 20 6e  gments, aByte, n
8990: 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Byte, 0);.      
89a0: 20 20 6d 65 6d 73 65 74 28 26 61 42 79 74 65 5b    memset(&aByte[
89b0: 6e 42 79 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f  nByte], 0, FTS3_
89c0: 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20  NODE_PADDING);. 
89d0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
89e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
89f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8a00: 65 65 28 61 42 79 74 65 29 3b 0a 20 20 20 20 20  ee(aByte);.     
8a10: 20 20 20 20 20 61 42 79 74 65 20 3d 20 30 3b 0a       aByte = 0;.
8a20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a30: 7d 0a 20 20 20 20 20 20 2a 70 61 42 6c 6f 62 20  }.      *paBlob 
8a40: 3d 20 61 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20  = aByte;.    }. 
8a50: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
8a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
8a70: 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20  the blob handle 
8a80: 61 74 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c  at p->pSegments,
8a90: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 20   if it is open. 
8aa0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
8ab0: 76 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ve.** the sqlite
8ac0: 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 29  3Fts3ReadBlock()
8ad0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65   function for de
8ae0: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
8af0: 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e  qlite3Fts3Segmen
8b00: 74 73 43 6c 6f 73 65 28 46 74 73 33 54 61 62 6c  tsClose(Fts3Tabl
8b10: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
8b20: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70  _blob_close(p->p
8b30: 53 65 67 6d 65 6e 74 73 29 3b 0a 20 20 70 2d 3e  Segments);.  p->
8b40: 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 7d  pSegments = 0;.}
8b50: 0a 20 20 20 20 0a 73 74 61 74 69 63 20 69 6e 74  .    .static int
8b60: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 6e   fts3SegReaderIn
8b70: 63 72 52 65 61 64 28 46 74 73 33 53 65 67 52 65  crRead(Fts3SegRe
8b80: 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b 0a  ader *pReader){.
8b90: 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20    int nRead;    
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
8bc0: 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
8bd0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
8c00: 20 2a 2f 0a 0a 20 20 6e 52 65 61 64 20 3d 20 4d   */..  nRead = M
8c10: 49 4e 28 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  IN(pReader->nNod
8c20: 65 20 2d 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f  e - pReader->nPo
8c30: 70 75 6c 61 74 65 2c 20 46 54 53 33 5f 4e 4f 44  pulate, FTS3_NOD
8c40: 45 5f 43 48 55 4e 4b 53 49 5a 45 29 3b 0a 20 20  E_CHUNKSIZE);.  
8c50: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
8c60: 62 5f 72 65 61 64 28 0a 20 20 20 20 20 20 70 52  b_read(.      pR
8c70: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a 20  eader->pBlob, . 
8c80: 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e 61       &pReader->a
8c90: 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50  Node[pReader->nP
8ca0: 6f 70 75 6c 61 74 65 5d 2c 0a 20 20 20 20 20 20  opulate],.      
8cb0: 6e 52 65 61 64 2c 0a 20 20 20 20 20 20 70 52 65  nRead,.      pRe
8cc0: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a  ader->nPopulate.
8cd0: 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d    );..  if( rc==
8ce0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8cf0: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
8d00: 61 74 65 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20  ate += nRead;.  
8d10: 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64 65    memset(&pReade
8d20: 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72  r->aNode[pReader
8d30: 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c 20 30 2c  ->nPopulate], 0,
8d40: 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49   FTS3_NODE_PADDI
8d50: 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  NG);.    if( pRe
8d60: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d  ader->nPopulate=
8d70: 3d 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20  =pReader->nNode 
8d80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8d90: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61  _blob_close(pRea
8da0: 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20  der->pBlob);.   
8db0: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f     pReader->pBlo
8dc0: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 52 65  b = 0;.      pRe
8dd0: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20  ader->nPopulate 
8de0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
8df0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
8e00: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
8e10: 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28 46  gReaderRequire(F
8e20: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
8e30: 65 61 64 65 72 2c 20 63 68 61 72 20 2a 70 46 72  eader, char *pFr
8e40: 6f 6d 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  om, int nByte){.
8e50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8e60: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
8e70: 21 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20  !pReader->pBlob 
8e80: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 46 72 6f  .       || (pFro
8e90: 6d 3e 3d 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  m>=pReader->aNod
8ea0: 65 20 26 26 20 70 46 72 6f 6d 3c 26 70 52 65 61  e && pFrom<&pRea
8eb0: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
8ec0: 65 72 2d 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29 3b  er->nNode]).  );
8ed0: 0a 20 20 77 68 69 6c 65 28 20 70 52 65 61 64 65  .  while( pReade
8ee0: 72 2d 3e 70 42 6c 6f 62 20 26 26 20 72 63 3d 3d  r->pBlob && rc==
8ef0: 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
8f00: 26 26 20 20 28 70 46 72 6f 6d 20 2d 20 70 52 65  &&  (pFrom - pRe
8f10: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e 42  ader->aNode + nB
8f20: 79 74 65 29 3e 70 52 65 61 64 65 72 2d 3e 6e 50  yte)>pReader->nP
8f30: 6f 70 75 6c 61 74 65 0a 20 20 29 7b 0a 20 20 20  opulate.  ){.   
8f40: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
8f50: 64 65 72 49 6e 63 72 52 65 61 64 28 70 52 65 61  derIncrRead(pRea
8f60: 64 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  der);.  }.  retu
8f70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8f80: 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
8f90: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
8fa0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
8fb0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
8fc0: 69 6e 20 74 68 65 0a 2a 2a 20 73 65 67 6d 65 6e  in the.** segmen
8fd0: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
8fe0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
8ff0: 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 72  eturned. If ther
9000: 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 74 65 72  e is no next ter
9010: 6d 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  m,.** SQLITE_DON
9020: 45 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  E. Otherwise, an
9030: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
9040: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
9050: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  t fts3SegReaderN
9060: 65 78 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ext(.  Fts3Table
9070: 20 2a 70 2c 20 0a 20 20 46 74 73 33 53 65 67 52   *p, .  Fts3SegR
9080: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 2c 0a  eader *pReader,.
9090: 20 20 69 6e 74 20 62 49 6e 63 72 0a 29 7b 0a 20    int bIncr.){. 
90a0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
90d0: 6f 66 20 76 61 72 69 6f 75 73 20 73 75 62 2d 72  of various sub-r
90e0: 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 63 68 61  outines */.  cha
90f0: 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  r *pNext;       
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9110: 43 75 72 73 6f 72 20 76 61 72 69 61 62 6c 65 20  Cursor variable 
9120: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
9130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9140: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9150: 66 20 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20  f bytes in term 
9160: 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20  prefix */.  int 
9170: 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20  nSuffix;        
9180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9190: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
91a0: 6e 20 74 65 72 6d 20 73 75 66 66 69 78 20 2a 2f  n term suffix */
91b0: 0a 0a 20 20 69 66 28 20 21 70 52 65 61 64 65 72  ..  if( !pReader
91c0: 2d 3e 61 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  ->aDoclist ){.  
91d0: 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61 64 65    pNext = pReade
91e0: 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 65 6c 73  r->aNode;.  }els
91f0: 65 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 26  e{.    pNext = &
9200: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
9210: 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c  t[pReader->nDocl
9220: 69 73 74 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ist];.  }..  if(
9230: 20 21 70 4e 65 78 74 20 7c 7c 20 70 4e 65 78 74   !pNext || pNext
9240: 3e 3d 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  >=&pReader->aNod
9250: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  e[pReader->nNode
9260: 5d 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 66 74  ] ){..    if( ft
9270: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
9280: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b  ding(pReader) ){
9290: 0a 20 20 20 20 20 20 46 74 73 33 48 61 73 68 45  .      Fts3HashE
92a0: 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d 20 2a 28 70  lem *pElem = *(p
92b0: 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c  Reader->ppNextEl
92c0: 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
92d0: 45 6c 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Elem==0 ){.     
92e0: 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64     pReader->aNod
92f0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 0;.      }el
9300: 73 65 7b 0a 20 20 20 20 20 20 20 20 50 65 6e 64  se{.        Pend
9310: 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  ingList *pList =
9320: 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29   (PendingList *)
9330: 66 74 73 33 48 61 73 68 44 61 74 61 28 70 45 6c  fts3HashData(pEl
9340: 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  em);.        pRe
9350: 61 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63  ader->zTerm = (c
9360: 68 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65  har *)fts3HashKe
9370: 79 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  y(pElem);.      
9380: 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d    pReader->nTerm
9390: 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73 69   = fts3HashKeysi
93a0: 7a 65 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20  ze(pElem);.     
93b0: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64     pReader->nNod
93c0: 65 20 3d 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f  e = pReader->nDo
93d0: 63 6c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 6e  clist = pList->n
93e0: 44 61 74 61 20 2b 20 31 3b 0a 20 20 20 20 20 20  Data + 1;.      
93f0: 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65    pReader->aNode
9400: 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63   = pReader->aDoc
9410: 6c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 44  list = pList->aD
9420: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70 52 65  ata;.        pRe
9430: 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d  ader->ppNextElem
9440: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
9450: 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f  rt( pReader->aNo
9460: 64 65 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  de );.      }.  
9470: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9480: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
9490: 20 69 66 28 20 21 66 74 73 33 53 65 67 52 65 61   if( !fts3SegRea
94a0: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52  derIsRootOnly(pR
94b0: 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20  eader) ){.      
94c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65  sqlite3_free(pRe
94d0: 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20  ader->aNode);.  
94e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
94f0: 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 2d 3e  _close(pReader->
9500: 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 70 52  pBlob);.      pR
9510: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d 20 30  eader->pBlob = 0
9520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61  ;.    }.    pRea
9530: 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a  der->aNode = 0;.
9540: 0a 20 20 20 20 2f 2a 20 49 66 20 69 43 75 72 72  .    /* If iCurr
9550: 65 6e 74 42 6c 6f 63 6b 3e 3d 69 4c 65 61 66 45  entBlock>=iLeafE
9560: 6e 64 42 6c 6f 63 6b 2c 20 74 68 69 73 20 69 73  ndBlock, this is
9570: 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74 69 6f   an EOF conditio
9580: 6e 2e 20 41 6c 6c 20 6c 65 61 66 20 0a 20 20 20  n. All leaf .   
9590: 20 2a 2a 20 62 6c 6f 63 6b 73 20 68 61 76 65 20   ** blocks have 
95a0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 61  already been tra
95b0: 76 65 72 73 65 64 2e 20 20 2a 2f 0a 20 20 20 20  versed.  */.    
95c0: 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d  assert( pReader-
95d0: 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3c 3d  >iCurrentBlock<=
95e0: 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e  pReader->iLeafEn
95f0: 64 42 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  dBlock );.    if
9600: 28 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72  ( pReader->iCurr
9610: 65 6e 74 42 6c 6f 63 6b 3e 3d 70 52 65 61 64 65  entBlock>=pReade
9620: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
9630: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9640: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9650: 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  }..    rc = sqli
9660: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
9670: 28 0a 20 20 20 20 20 20 20 20 70 2c 20 2b 2b 70  (.        p, ++p
9680: 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74  Reader->iCurrent
9690: 42 6c 6f 63 6b 2c 20 26 70 52 65 61 64 65 72 2d  Block, &pReader-
96a0: 3e 61 4e 6f 64 65 2c 20 26 70 52 65 61 64 65 72  >aNode, &pReader
96b0: 2d 3e 6e 4e 6f 64 65 2c 20 0a 20 20 20 20 20 20  ->nNode, .      
96c0: 20 20 28 62 49 6e 63 72 20 3f 20 26 70 52 65 61    (bIncr ? &pRea
96d0: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3a  der->nPopulate :
96e0: 20 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   0).    );.    i
96f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9700: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9710: 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65    assert( pReade
9720: 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 29 3b 0a 20  r->pBlob==0 );. 
9730: 20 20 20 69 66 28 20 62 49 6e 63 72 20 26 26 20     if( bIncr && 
9740: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
9750: 74 65 3c 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  te<pReader->nNod
9760: 65 20 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64  e ){.      pRead
9770: 65 72 2d 3e 70 42 6c 6f 62 20 3d 20 70 2d 3e 70  er->pBlob = p->p
9780: 53 65 67 6d 65 6e 74 73 3b 0a 20 20 20 20 20 20  Segments;.      
9790: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30  p->pSegments = 0
97a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 78  ;.    }.    pNex
97b0: 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f  t = pReader->aNo
97c0: 64 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  de;.  }..  asser
97d0: 74 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65  t( !fts3SegReade
97e0: 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64  rIsPending(pRead
97f0: 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 66  er) );..  rc = f
9800: 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75  ts3SegReaderRequ
9810: 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 4e 65  ire(pReader, pNe
9820: 78 74 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  xt, FTS3_VARINT_
9830: 4d 41 58 2a 32 29 3b 0a 20 20 69 66 28 20 72 63  MAX*2);.  if( rc
9840: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
9850: 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 2f 2a  turn rc;.  .  /*
9860: 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
9870: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
9880: 47 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  G bytes of paddi
9890: 6e 67 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ng, the followin
98a0: 67 20 69 73 20 0a 20 20 2a 2a 20 73 61 66 65 20  g is .  ** safe 
98b0: 28 6e 6f 20 72 69 73 6b 20 6f 66 20 6f 76 65 72  (no risk of over
98c0: 72 65 61 64 29 20 65 76 65 6e 20 69 66 20 74 68  read) even if th
98d0: 65 20 6e 6f 64 65 20 64 61 74 61 20 69 73 20 63  e node data is c
98e0: 6f 72 72 75 70 74 65 64 2e 20 2a 2f 0a 20 20 70  orrupted. */.  p
98f0: 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65 33 46  Next += sqlite3F
9900: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
9910: 4e 65 78 74 2c 20 26 6e 50 72 65 66 69 78 29 3b  Next, &nPrefix);
9920: 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69  .  pNext += sqli
9930: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
9940: 33 32 28 70 4e 65 78 74 2c 20 26 6e 53 75 66 66  32(pNext, &nSuff
9950: 69 78 29 3b 0a 20 20 69 66 28 20 6e 50 72 65 66  ix);.  if( nPref
9960: 69 78 3c 30 20 7c 7c 20 6e 53 75 66 66 69 78 3c  ix<0 || nSuffix<
9970: 3d 30 20 0a 20 20 20 7c 7c 20 26 70 4e 65 78 74  =0 .   || &pNext
9980: 5b 6e 53 75 66 66 69 78 5d 3e 26 70 52 65 61 64  [nSuffix]>&pRead
9990: 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65  er->aNode[pReade
99a0: 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 29 7b 0a  r->nNode] .  ){.
99b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
99c0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a  E_CORRUPT_VTAB;.
99d0: 20 20 7d 0a 0a 20 20 69 66 28 20 6e 50 72 65 66    }..  if( nPref
99e0: 69 78 2b 6e 53 75 66 66 69 78 3e 70 52 65 61 64  ix+nSuffix>pRead
99f0: 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 29  er->nTermAlloc )
9a00: 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d  {.    int nNew =
9a10: 20 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69   (nPrefix+nSuffi
9a20: 78 29 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a  x)*2;.    char *
9a30: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  zNew = sqlite3_r
9a40: 65 61 6c 6c 6f 63 28 70 52 65 61 64 65 72 2d 3e  ealloc(pReader->
9a50: 7a 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20 20  zTerm, nNew);.  
9a60: 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20    if( !zNew ){. 
9a70: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9a80: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
9a90: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65      pReader->zTe
9aa0: 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 70  rm = zNew;.    p
9ab0: 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c  Reader->nTermAll
9ac0: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a  oc = nNew;.  }..
9ad0: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
9ae0: 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61  aderRequire(pRea
9af0: 64 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66  der, pNext, nSuf
9b00: 66 69 78 2b 46 54 53 33 5f 56 41 52 49 4e 54 5f  fix+FTS3_VARINT_
9b10: 4d 41 58 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  MAX);.  if( rc!=
9b20: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
9b30: 72 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63 70 79  rn rc;..  memcpy
9b40: 28 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d  (&pReader->zTerm
9b50: 5b 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78 74  [nPrefix], pNext
9b60: 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 52  , nSuffix);.  pR
9b70: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e  eader->nTerm = n
9b80: 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a  Prefix+nSuffix;.
9b90: 20 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66    pNext += nSuff
9ba0: 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73  ix;.  pNext += s
9bb0: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
9bc0: 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 70 52  int32(pNext, &pR
9bd0: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29  eader->nDoclist)
9be0: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f  ;.  pReader->aDo
9bf0: 63 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  clist = pNext;. 
9c00: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
9c10: 74 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  tList = 0;..  /*
9c20: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
9c30: 64 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74  doclist does not
9c40: 20 61 70 70 65 61 72 20 74 6f 20 65 78 74 65 6e   appear to exten
9c50: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
9c60: 66 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65  f the.  ** b-tre
9c70: 65 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68 61 74  e node. And that
9c80: 20 74 68 65 20 66 69 6e 61 6c 20 62 79 74 65 20   the final byte 
9c90: 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69  of the doclist i
9ca0: 73 20 30 78 30 30 2e 20 49 66 20 65 69 74 68 65  s 0x00. If eithe
9cb0: 72 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65  r .  ** of these
9cc0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 75   statements is u
9cd0: 6e 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20  ntrue, then the 
9ce0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
9cf0: 73 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a  s corrupt..  */.
9d00: 20 20 69 66 28 20 26 70 52 65 61 64 65 72 2d 3e    if( &pReader->
9d10: 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72  aDoclist[pReader
9d20: 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70 52 65  ->nDoclist]>&pRe
9d30: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
9d40: 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 20  der->nNode] .   
9d50: 7c 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e 50 6f  || (pReader->nPo
9d60: 70 75 6c 61 74 65 3d 3d 30 20 26 26 20 70 52 65  pulate==0 && pRe
9d70: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70  ader->aDoclist[p
9d80: 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74  Reader->nDoclist
9d90: 2d 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  -1]).  ){.    re
9da0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9db0: 55 50 54 5f 56 54 41 42 3b 0a 20 20 7d 0a 20 20  UPT_VTAB;.  }.  
9dc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9dd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
9de0: 68 65 20 53 65 67 52 65 61 64 65 72 20 74 6f 20  he SegReader to 
9df0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
9e00: 73 74 20 64 6f 63 69 64 20 69 6e 20 74 68 65 20  st docid in the 
9e10: 64 6f 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74  doclist associat
9e20: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 63  ed.** with the c
9e30: 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a  urrent term..*/.
9e40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
9e50: 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f 63  egReaderFirstDoc
9e60: 69 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 54  id(Fts3Table *pT
9e70: 61 62 2c 20 46 74 73 33 53 65 67 52 65 61 64 65  ab, Fts3SegReade
9e80: 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69  r *pReader){.  i
9e90: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9ea0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  K;.  assert( pRe
9eb0: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29  ader->aDoclist )
9ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 52 65  ;.  assert( !pRe
9ed0: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
9ee0: 74 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  t );.  if( pTab-
9ef0: 3e 62 44 65 73 63 49 64 78 20 26 26 20 66 74 73  >bDescIdx && fts
9f00: 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64  3SegReaderIsPend
9f10: 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a  ing(pReader) ){.
9f20: 20 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b      u8 bEof = 0;
9f30: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44  .    pReader->iD
9f40: 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 52  ocid = 0;.    pR
9f50: 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69  eader->nOffsetLi
9f60: 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  st = 0;.    sqli
9f70: 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50 72  te3Fts3DoclistPr
9f80: 65 76 28 30 2c 0a 20 20 20 20 20 20 20 20 70 52  ev(0,.        pR
9f90: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c  eader->aDoclist,
9fa0: 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69   pReader->nDocli
9fb0: 73 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 70 4f  st, &pReader->pO
9fc0: 66 66 73 65 74 4c 69 73 74 2c 20 0a 20 20 20 20  ffsetList, .    
9fd0: 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e 69 44      &pReader->iD
9fe0: 6f 63 69 64 2c 20 26 70 52 65 61 64 65 72 2d 3e  ocid, &pReader->
9ff0: 6e 4f 66 66 73 65 74 4c 69 73 74 2c 20 26 62 45  nOffsetList, &bE
a000: 6f 66 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  of.    );.  }els
a010: 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  e{.    rc = fts3
a020: 53 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65  SegReaderRequire
a030: 28 70 52 65 61 64 65 72 2c 20 70 52 65 61 64 65  (pReader, pReade
a040: 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 46 54 53  r->aDoclist, FTS
a050: 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20  3_VARINT_MAX);. 
a060: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a070: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
a080: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 46 74 73  t n = sqlite3Fts
a090: 33 47 65 74 56 61 72 69 6e 74 28 70 52 65 61 64  3GetVarint(pRead
a0a0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 26 70  er->aDoclist, &p
a0b0: 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 29 3b  Reader->iDocid);
a0c0: 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e  .      pReader->
a0d0: 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 26 70  pOffsetList = &p
a0e0: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
a0f0: 5b 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  [n];.    }.  }. 
a100: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a110: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
a120: 20 53 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f   SegReader to po
a130: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
a140: 64 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63  docid in the doc
a150: 6c 69 73 74 0a 2a 2a 20 61 73 73 6f 63 69 61 74  list.** associat
a160: 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ed with the curr
a170: 65 6e 74 20 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a  ent term..** .**
a180: 20 49 66 20 61 72 67 75 6d 65 6e 74 73 20 70 70   If arguments pp
a190: 4f 66 66 73 65 74 4c 69 73 74 20 61 6e 64 20 70  OffsetList and p
a1a0: 6e 4f 66 66 73 65 74 4c 69 73 74 20 61 72 65 20  nOffsetList are 
a1b0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a  not NULL, then .
a1c0: 2a 2a 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74  ** *ppOffsetList
a1d0: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
a1e0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
a1f0: 6c 75 6d 6e 2d 6f 66 66 73 65 74 20 6c 69 73 74  lumn-offset list
a200: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  .** in the docli
a210: 73 74 20 65 6e 74 72 79 20 28 69 2e 65 2e 20 69  st entry (i.e. i
a220: 6d 6d 65 64 69 61 74 65 6c 79 20 70 61 73 74 20  mmediately past 
a230: 74 68 65 20 64 6f 63 69 64 20 76 61 72 69 6e 74  the docid varint
a240: 29 2e 0a 2a 2a 20 2a 70 6e 4f 66 66 73 65 74 4c  )..** *pnOffsetL
a250: 69 73 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  ist is set to th
a260: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
a270: 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66  set of column-of
a280: 66 73 65 74 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e  fset.** lists, n
a290: 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ot including the
a2a0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
a2b0: 62 79 74 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  byte. For exampl
a2c0: 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e:.*/.static int
a2d0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
a2e0: 78 74 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54  xtDocid(.  Fts3T
a2f0: 61 62 6c 65 20 2a 70 54 61 62 2c 0a 20 20 46 74  able *pTab,.  Ft
a300: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
a310: 61 64 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ader,         /*
a320: 20 52 65 61 64 65 72 20 74 6f 20 61 64 76 61 6e   Reader to advan
a330: 63 65 20 74 6f 20 6e 65 78 74 20 64 6f 63 69 64  ce to next docid
a340: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f   */.  char **ppO
a350: 66 66 73 65 74 4c 69 73 74 2c 20 20 20 20 20 20  ffsetList,      
a360: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
a370: 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
a380: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 2a   position-list *
a390: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 66 66 73 65  /.  int *pnOffse
a3a0: 74 4c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  tList           
a3b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67      /* OUT: Leng
a3c0: 74 68 20 6f 66 20 2a 70 70 4f 66 66 73 65 74 4c  th of *ppOffsetL
a3d0: 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
a3e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
a3f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
a400: 2a 70 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f  *p = pReader->pO
a410: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 63 68 61  ffsetList;.  cha
a420: 72 20 63 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  r c = 0;..  asse
a430: 72 74 28 20 70 20 29 3b 0a 0a 20 20 69 66 28 20  rt( p );..  if( 
a440: 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 26  pTab->bDescIdx &
a450: 26 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  & fts3SegReaderI
a460: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
a470: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 70 65  ) ){.    /* A pe
a480: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 73 65 67 2d  nding-terms seg-
a490: 72 65 61 64 65 72 20 66 6f 72 20 61 6e 20 46 54  reader for an FT
a4a0: 53 34 20 74 61 62 6c 65 20 74 68 61 74 20 75 73  S4 table that us
a4b0: 65 73 20 6f 72 64 65 72 3d 64 65 73 63 2e 0a 20  es order=desc.. 
a4c0: 20 20 20 2a 2a 20 50 65 6e 64 69 6e 67 2d 74 65     ** Pending-te
a4d0: 72 6d 73 20 64 6f 63 6c 69 73 74 73 20 61 72 65  rms doclists are
a4e0: 20 61 6c 77 61 79 73 20 62 75 69 6c 74 20 75 70   always built up
a4f0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
a500: 64 65 72 2c 20 73 6f 0a 20 20 20 20 2a 2a 20 77  der, so.    ** w
a510: 65 20 68 61 76 65 20 74 6f 20 69 74 65 72 61 74  e have to iterat
a520: 65 20 74 68 72 6f 75 67 68 20 74 68 65 6d 20 62  e through them b
a530: 61 63 6b 77 61 72 64 73 20 68 65 72 65 2e 20 2a  ackwards here. *
a540: 2f 0a 20 20 20 20 75 38 20 62 45 6f 66 20 3d 20  /.    u8 bEof = 
a550: 30 3b 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66  0;.    if( ppOff
a560: 73 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  setList ){.     
a570: 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d   *ppOffsetList =
a580: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
a590: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e  tList;.      *pn
a5a0: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65  OffsetList = pRe
a5b0: 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73  ader->nOffsetLis
a5c0: 74 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t - 1;.    }.   
a5d0: 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c   sqlite3Fts3Docl
a5e0: 69 73 74 50 72 65 76 28 30 2c 0a 20 20 20 20 20  istPrev(0,.     
a5f0: 20 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63     pReader->aDoc
a600: 6c 69 73 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e  list, pReader->n
a610: 44 6f 63 6c 69 73 74 2c 20 26 70 2c 20 26 70 52  Doclist, &p, &pR
a620: 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 2c 0a 20  eader->iDocid,. 
a630: 20 20 20 20 20 20 20 26 70 52 65 61 64 65 72 2d         &pReader-
a640: 3e 6e 4f 66 66 73 65 74 4c 69 73 74 2c 20 26 62  >nOffsetList, &b
a650: 45 6f 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Eof.    );.    i
a660: 66 28 20 62 45 6f 66 20 29 7b 0a 20 20 20 20 20  f( bEof ){.     
a670: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
a680: 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  tList = 0;.    }
a690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 61  else{.      pRea
a6a0: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
a6b0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = p;.    }.  }e
a6c0: 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 50 6f 69  lse{..    /* Poi
a6d0: 6e 74 65 72 20 70 20 63 75 72 72 65 6e 74 6c 79  nter p currently
a6e0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 66   points at the f
a6f0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6e 20  irst byte of an 
a700: 6f 66 66 73 65 74 20 6c 69 73 74 2e 20 54 68 65  offset list. The
a710: 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
a720: 67 20 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73  g block advances
a730: 20 69 74 20 74 6f 20 70 6f 69 6e 74 20 6f 6e 65   it to point one
a740: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
a750: 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  nd of.    ** the
a760: 20 73 61 6d 65 20 6f 66 66 73 65 74 20 6c 69 73   same offset lis
a770: 74 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  t. */.    while(
a780: 20 31 20 29 7b 0a 20 20 0a 20 20 20 20 20 20 2f   1 ){.  .      /
a790: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
a7a0: 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20 28 61 6e  line of code (an
a7b0: 64 20 74 68 65 20 22 70 2b 2b 22 20 62 65 6c 6f  d the "p++" belo
a7c0: 77 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  w the while() lo
a7d0: 6f 70 29 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  op) is.      ** 
a7e0: 6e 6f 72 6d 61 6c 6c 79 20 61 6c 6c 20 74 68 61  normally all tha
a7f0: 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  t is required to
a800: 20 6d 6f 76 65 20 70 6f 69 6e 74 65 72 20 70 20   move pointer p 
a810: 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 20 0a  to the desired .
a820: 20 20 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f        ** positio
a830: 6e 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  n. The exception
a840: 20 69 73 20 69 66 20 74 68 69 73 20 6e 6f 64 65   is if this node
a850: 20 69 73 20 62 65 69 6e 67 20 6c 6f 61 64 65 64   is being loaded
a860: 20 66 72 6f 6d 20 64 69 73 6b 0a 20 20 20 20 20   from disk.     
a870: 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c   ** incrementall
a880: 79 20 61 6e 64 20 70 6f 69 6e 74 65 72 20 22 70  y and pointer "p
a890: 22 20 6e 6f 77 20 70 6f 69 6e 74 73 20 74 6f 20  " now points to 
a8a0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
a8b0: 61 73 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  assed.      ** t
a8c0: 68 65 20 70 6f 70 75 6c 61 74 65 64 20 70 61 72  he populated par
a8d0: 74 20 6f 66 20 70 52 65 61 64 65 72 2d 3e 61 4e  t of pReader->aN
a8e0: 6f 64 65 5b 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a  ode[]..      */.
a8f0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 20        while( *p 
a900: 7c 20 63 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26  | c ) c = *p++ &
a910: 20 30 78 38 30 3b 0a 20 20 20 20 20 20 61 73 73   0x80;.      ass
a920: 65 72 74 28 20 2a 70 3d 3d 30 20 29 3b 0a 20 20  ert( *p==0 );.  
a930: 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 61 64  .      if( pRead
a940: 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 7c 7c 20  er->pBlob==0 || 
a950: 70 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  p<&pReader->aNod
a960: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  e[pReader->nPopu
a970: 6c 61 74 65 5d 20 29 20 62 72 65 61 6b 3b 0a 20  late] ) break;. 
a980: 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
a990: 67 52 65 61 64 65 72 49 6e 63 72 52 65 61 64 28  gReaderIncrRead(
a9a0: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
a9b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a9c0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
a9d0: 20 20 20 7d 0a 20 20 20 20 70 2b 2b 3b 0a 20 20     }.    p++;.  
a9e0: 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69  .    /* If requi
a9f0: 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
aa00: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
aa10: 65 73 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65  es with a pointe
aa20: 72 20 74 6f 20 61 6e 64 20 74 68 65 0a 20 20 20  r to and the.   
aa30: 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
aa40: 70 72 65 76 69 6f 75 73 20 6f 66 66 73 65 74 2d  previous offset-
aa50: 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  list..    */.   
aa60: 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c 69 73   if( ppOffsetLis
aa70: 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 66  t ){.      *ppOf
aa80: 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64  fsetList = pRead
aa90: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b  er->pOffsetList;
aaa0: 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73 65 74  .      *pnOffset
aab0: 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 20 2d  List = (int)(p -
aac0: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
aad0: 74 4c 69 73 74 20 2d 20 31 29 3b 0a 20 20 20 20  tList - 1);.    
aae0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
aaf0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
ab00: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
ab10: 64 6f 63 6c 69 73 74 2c 20 73 65 74 20 70 4f 66  doclist, set pOf
ab20: 66 73 65 74 4c 69 73 74 20 74 6f 0a 20 20 20 20  fsetList to.    
ab30: 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  ** NULL. Otherwi
ab40: 73 65 2c 20 73 65 74 20 46 74 73 33 53 65 67 52  se, set Fts3SegR
ab50: 65 61 64 65 72 2e 69 44 6f 63 69 64 20 74 6f 20  eader.iDocid to 
ab60: 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20 61  the next docid a
ab70: 6e 64 0a 20 20 20 20 2a 2a 20 46 74 73 33 53 65  nd.    ** Fts3Se
ab80: 67 52 65 61 64 65 72 2e 70 4f 66 66 73 65 74 4c  gReader.pOffsetL
ab90: 69 73 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ist to point to 
aba0: 74 68 65 20 6e 65 78 74 20 6f 66 66 73 65 74 20  the next offset 
abb0: 6c 69 73 74 20 62 65 66 6f 72 65 0a 20 20 20 20  list before.    
abc0: 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20  ** returning..  
abd0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 3e 3d    */.    if( p>=
abe0: 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69  &pReader->aDocli
abf0: 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63  st[pReader->nDoc
ac00: 6c 69 73 74 5d 20 29 7b 0a 20 20 20 20 20 20 70  list] ){.      p
ac10: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
ac20: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ist = 0;.    }el
ac30: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
ac40: 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75  ts3SegReaderRequ
ac50: 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 2c 20  ire(pReader, p, 
ac60: 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29  FTS3_VARINT_MAX)
ac70: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
ac80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ac90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
aca0: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
acb0: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66     pReader->pOff
acc0: 73 65 74 4c 69 73 74 20 3d 20 70 20 2b 20 73 71  setList = p + sq
acd0: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
ace0: 6e 74 28 70 2c 20 26 69 44 65 6c 74 61 29 3b 0a  nt(p, &iDelta);.
acf0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
ad00: 2d 3e 62 44 65 73 63 49 64 78 20 29 7b 0a 20 20  ->bDescIdx ){.  
ad10: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
ad20: 3e 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c 74  >iDocid -= iDelt
ad30: 61 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  a;.        }else
ad40: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 61  {.          pRea
ad50: 64 65 72 2d 3e 69 44 6f 63 69 64 20 2b 3d 20 69  der->iDocid += i
ad60: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 7d  Delta;.        }
ad70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ad80: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
ad90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ada0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
adb0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69  s called to esti
adc0: 6d 61 74 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mate the amount 
add0: 6f 66 20 64 61 74 61 20 74 68 61 74 20 77 69 6c  of data that wil
ade0: 6c 20 62 65 20 0a 2a 2a 20 6c 6f 61 64 65 64 20  l be .** loaded 
adf0: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 49 66  from the disk If
ae00: 20 53 65 67 52 65 61 64 65 72 49 74 65 72 61 74   SegReaderIterat
ae10: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
ae20: 20 74 68 69 73 20 73 65 67 2d 72 65 61 64 65 72   this seg-reader
ae30: 2c 0a 2a 2a 20 69 6e 20 75 6e 69 74 73 20 6f 66  ,.** in units of
ae40: 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d 65 6e   average documen
ae50: 74 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  t size..** .** T
ae60: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
ae70: 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 49 66 20 74  as follows: If t
ae80: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 20  he caller has a 
ae90: 73 6d 61 6c 6c 20 64 6f 63 6c 69 73 74 20 74 68  small doclist th
aea0: 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  at .** contains 
aeb0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 4e 20  references to N 
aec0: 64 6f 63 75 6d 65 6e 74 73 2c 20 61 6e 64 20 69  documents, and i
aed0: 73 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 6d 65  s considering me
aee0: 72 67 69 6e 67 20 69 74 20 77 69 74 68 0a 2a 2a  rging it with.**
aef0: 20 61 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74   a large doclist
af00: 20 28 73 69 7a 65 20 58 20 22 61 76 65 72 61 67   (size X "averag
af10: 65 20 64 6f 63 75 6d 65 6e 74 73 22 29 2c 20 69  e documents"), i
af20: 74 20 6d 61 79 20 6f 70 74 20 6e 6f 74 20 74 6f  t may opt not to
af30: 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 6c 61 72   load.** the lar
af40: 67 65 20 64 6f 63 6c 69 73 74 20 69 66 20 58 3e  ge doclist if X>
af50: 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  N..*/.int sqlite
af60: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 6f  3Fts3SegReaderCo
af70: 73 74 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72  st(.  Fts3Cursor
af80: 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
af90: 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 63 75        /* FTS3 cu
afa0: 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  rsor handle */. 
afb0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
afc0: 70 52 65 61 64 65 72 2c 20 20 20 20 20 20 20 20  pReader,        
afd0: 20 2f 2a 20 53 65 67 6d 65 6e 74 2d 72 65 61 64   /* Segment-read
afe0: 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  er handle */.  i
aff0: 6e 74 20 2a 70 6e 43 6f 73 74 20 20 20 20 20 20  nt *pnCost      
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b010: 2a 20 49 4e 2f 4f 55 54 3a 20 4e 75 6d 62 65 72  * IN/OUT: Number
b020: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 2a   of bytes read *
b030: 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  /.){.  Fts3Table
b040: 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
b050: 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  *)pCsr->base.pVt
b060: 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ab;.  int rc = S
b070: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
b080: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
b090: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  code */.  int nC
b0a0: 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ost = 0;        
b0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
b0c0: 74 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  t in bytes to re
b0d0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 70 67  turn */.  int pg
b0e0: 73 7a 20 3d 20 70 2d 3e 6e 50 67 73 7a 3b 20 20  sz = p->nPgsz;  
b0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
b100: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20  abase page size 
b110: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 67  */..  assert( pg
b120: 73 7a 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  sz>0 );..  /* If
b130: 20 74 68 69 73 20 73 65 67 2d 72 65 61 64 65 72   this seg-reader
b140: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
b150: 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 61  pending-terms ta
b160: 62 6c 65 2c 20 6f 72 20 69 66 20 61 6c 6c 20 64  ble, or if all d
b170: 61 74 61 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ata.  ** for the
b180: 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f 72   segment is stor
b190: 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70  ed on the root p
b1a0: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
b1b0: 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74  e, then the cost
b1c0: 0a 20 20 2a 2a 20 69 73 20 7a 65 72 6f 2e 20 49  .  ** is zero. I
b1d0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
b1e0: 72 65 71 75 69 72 65 64 20 64 61 74 61 20 69 73  required data is
b1f0: 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 61 69 6e   already in main
b200: 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 20 20   memory..  */.  
b210: 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20  if( p->bHasStat 
b220: 0a 20 20 20 26 26 20 21 66 74 73 33 53 65 67 52  .   && !fts3SegR
b230: 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70  eaderIsPending(p
b240: 52 65 61 64 65 72 29 20 0a 20 20 20 26 26 20 21  Reader) .   && !
b250: 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 52  fts3SegReaderIsR
b260: 6f 6f 74 4f 6e 6c 79 28 70 52 65 61 64 65 72 29  ootOnly(pReader)
b270: 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e   .  ){.    int n
b280: 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 20 20 73 71  Blob = 0;.    sq
b290: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
b2a0: 63 6b 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 73  ck;..    if( pCs
b2b0: 72 2d 3e 6e 52 6f 77 41 76 67 3d 3d 30 20 29 7b  r->nRowAvg==0 ){
b2c0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 76  .      /* The av
b2d0: 65 72 61 67 65 20 64 6f 63 75 6d 65 6e 74 20 73  erage document s
b2e0: 69 7a 65 2c 20 77 68 69 63 68 20 69 73 20 72 65  ize, which is re
b2f0: 71 75 69 72 65 64 20 74 6f 20 63 61 6c 63 75 6c  quired to calcul
b300: 61 74 65 20 74 68 65 20 63 6f 73 74 0a 20 20 20  ate the cost.   
b310: 20 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 64 6f     ** of each do
b320: 63 6c 69 73 74 2c 20 68 61 73 20 6e 6f 74 20 79  clist, has not y
b330: 65 74 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  et been determin
b340: 65 64 2e 20 52 65 61 64 20 74 68 65 20 72 65 71  ed. Read the req
b350: 75 69 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  uired .      ** 
b360: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 25 5f  data from the %_
b370: 73 74 61 74 20 74 61 62 6c 65 20 74 6f 20 63 61  stat table to ca
b380: 6c 63 75 6c 61 74 65 20 69 74 2e 0a 20 20 20 20  lculate it..    
b390: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 6e    **.      ** En
b3a0: 74 72 79 20 30 20 6f 66 20 74 68 65 20 25 5f 73  try 0 of the %_s
b3b0: 74 61 74 20 74 61 62 6c 65 20 69 73 20 61 20 62  tat table is a b
b3c0: 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 28  lob containing (
b3d0: 6e 43 6f 6c 2b 31 29 20 46 54 53 33 20 0a 20 20  nCol+1) FTS3 .  
b3e0: 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 73 2c 20      ** varints, 
b3f0: 77 68 65 72 65 20 6e 43 6f 6c 20 69 73 20 74 68  where nCol is th
b400: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
b410: 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53 33 20  mns in the FTS3 
b420: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
b430: 54 68 65 20 66 69 72 73 74 20 76 61 72 69 6e 74  The first varint
b440: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b450: 66 20 64 6f 63 75 6d 65 6e 74 73 20 63 75 72 72  f documents curr
b460: 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 0a  ently stored in.
b470: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62        ** the tab
b480: 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
b490: 67 20 6e 43 6f 6c 20 76 61 72 69 6e 74 73 20 63  g nCol varints c
b4a0: 6f 6e 74 61 69 6e 20 74 68 65 20 74 6f 74 61 6c  ontain the total
b4b0: 20 61 6d 6f 75 6e 74 20 6f 66 0a 20 20 20 20 20   amount of.     
b4c0: 20 2a 2a 20 64 61 74 61 20 73 74 6f 72 65 64 20   ** data stored 
b4d0: 69 6e 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 65  in all rows of e
b4e0: 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
b4f0: 65 20 74 61 62 6c 65 2c 20 66 72 6f 6d 20 6c 65  e table, from le
b500: 66 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ft.      ** to r
b510: 69 67 68 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ight..      */. 
b520: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
b530: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20  t *pStmt;.      
b540: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 44  sqlite3_int64 nD
b550: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  oc = 0;.      sq
b560: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
b570: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
b580: 73 74 20 63 68 61 72 20 2a 70 45 6e 64 3b 0a 20  st char *pEnd;. 
b590: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b5a0: 2a 61 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  *a;..      rc = 
b5b0: 73 71 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63  sqlite3Fts3Selec
b5c0: 74 44 6f 63 74 6f 74 61 6c 28 70 2c 20 26 70 53  tDoctotal(p, &pS
b5d0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
b5e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b5f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
b600: 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   a = sqlite3_col
b610: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
b620: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
b630: 28 20 61 20 29 3b 0a 0a 20 20 20 20 20 20 70 45  ( a );..      pE
b640: 6e 64 20 3d 20 26 61 5b 73 71 6c 69 74 65 33 5f  nd = &a[sqlite3_
b650: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
b660: 6d 74 2c 20 30 29 5d 3b 0a 20 20 20 20 20 20 61  mt, 0)];.      a
b670: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
b680: 65 74 56 61 72 69 6e 74 28 61 2c 20 26 6e 44 6f  etVarint(a, &nDo
b690: 63 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  c);.      while(
b6a0: 20 61 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20   a<pEnd ){.     
b6b0: 20 20 20 61 20 2b 3d 20 73 71 6c 69 74 65 33 46     a += sqlite3F
b6c0: 74 73 33 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts3GetVarint(a, 
b6d0: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d  &nByte);.      }
b6e0: 0a 20 20 20 20 20 20 69 66 28 20 6e 44 6f 63 3d  .      if( nDoc=
b6f0: 3d 30 20 7c 7c 20 6e 42 79 74 65 3d 3d 30 20 29  =0 || nByte==0 )
b700: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b710: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
b720: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b730: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
b740: 41 42 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  AB;.      }..   
b750: 20 20 20 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67     pCsr->nRowAvg
b760: 20 3d 20 28 69 6e 74 29 28 28 28 6e 42 79 74 65   = (int)(((nByte
b770: 20 2f 20 6e 44 6f 63 29 20 2b 20 70 67 73 7a 29   / nDoc) + pgsz)
b780: 20 2f 20 70 67 73 7a 29 3b 0a 20 20 20 20 20 20   / pgsz);.      
b790: 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 52  assert( pCsr->nR
b7a0: 6f 77 41 76 67 3e 30 20 29 3b 20 0a 20 20 20 20  owAvg>0 ); .    
b7b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
b7c0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
b7d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b7e0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
b7f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b800: 41 73 73 75 6d 65 20 74 68 61 74 20 61 20 62 6c  Assume that a bl
b810: 6f 62 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  ob flows over on
b820: 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
b830: 73 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65  s if it is large
b840: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 28 70  r.    ** than (p
b850: 67 73 7a 2d 33 35 29 20 62 79 74 65 73 20 69 6e  gsz-35) bytes in
b860: 20 73 69 7a 65 20 28 74 68 65 20 66 69 6c 65 2d   size (the file-
b870: 66 6f 72 6d 61 74 20 64 6f 63 75 6d 65 6e 74 61  format documenta
b880: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 63 6f 6e 66  tion.    ** conf
b890: 69 72 6d 73 20 74 68 69 73 29 2e 0a 20 20 20 20  irms this)..    
b8a0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 42 6c 6f 63  */.    for(iBloc
b8b0: 6b 3d 70 52 65 61 64 65 72 2d 3e 69 53 74 61 72  k=pReader->iStar
b8c0: 74 42 6c 6f 63 6b 3b 20 69 42 6c 6f 63 6b 3c 3d  tBlock; iBlock<=
b8d0: 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e  pReader->iLeafEn
b8e0: 64 42 6c 6f 63 6b 3b 20 69 42 6c 6f 63 6b 2b 2b  dBlock; iBlock++
b8f0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b900: 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f  lite3Fts3ReadBlo
b910: 63 6b 28 70 2c 20 69 42 6c 6f 63 6b 2c 20 30 2c  ck(p, iBlock, 0,
b920: 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20 20   &nBlob, 0);.   
b930: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b940: 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
b950: 20 20 20 20 69 66 28 20 28 6e 42 6c 6f 62 2b 33      if( (nBlob+3
b960: 35 29 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  5)>pgsz ){.     
b970: 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
b980: 6e 42 6c 6f 62 20 2b 20 33 34 29 2f 70 67 73 7a  nBlob + 34)/pgsz
b990: 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 73 74 20  ;.        nCost 
b9a0: 2b 3d 20 28 28 6e 4f 76 66 6c 20 2b 20 70 43 73  += ((nOvfl + pCs
b9b0: 72 2d 3e 6e 52 6f 77 41 76 67 20 2d 20 31 29 2f  r->nRowAvg - 1)/
b9c0: 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67 29 3b 0a  pCsr->nRowAvg);.
b9d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b9e0: 7d 0a 0a 20 20 2a 70 6e 43 6f 73 74 20 2b 3d 20  }..  *pnCost += 
b9f0: 6e 43 6f 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  nCost;.  return 
ba00: 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
ba10: 65 33 46 74 73 33 4d 73 72 4f 76 66 6c 28 0a 20  e3Fts3MsrOvfl(. 
ba20: 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73   Fts3Cursor *pCs
ba30: 72 2c 20 0a 20 20 46 74 73 33 4d 75 6c 74 69 53  r, .  Fts3MultiS
ba40: 65 67 52 65 61 64 65 72 20 2a 70 4d 73 72 2c 0a  egReader *pMsr,.
ba50: 20 20 69 6e 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b    int *pnOvfl.){
ba60: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20  .  Fts3Table *p 
ba70: 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70 43  = (Fts3Table*)pC
ba80: 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
ba90: 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 30 3b    int nOvfl = 0;
baa0: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
bab0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bac0: 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d  .  int pgsz = p-
bad0: 3e 6e 50 67 73 7a 3b 0a 0a 20 20 61 73 73 65 72  >nPgsz;..  asser
bae0: 74 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29  t( p->bHasStat )
baf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 73 7a  ;.  assert( pgsz
bb00: 3e 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 69 3d  >0 );..  for(ii=
bb10: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
bb20: 20 26 26 20 69 69 3c 70 4d 73 72 2d 3e 6e 53 65   && ii<pMsr->nSe
bb30: 67 6d 65 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  gment; ii++){.  
bb40: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
bb50: 2a 70 52 65 61 64 65 72 20 3d 20 70 4d 73 72 2d  *pReader = pMsr-
bb60: 3e 61 70 53 65 67 6d 65 6e 74 5b 69 69 5d 3b 0a  >apSegment[ii];.
bb70: 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65 67      if( !fts3Seg
bb80: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
bb90: 70 52 65 61 64 65 72 29 20 0a 20 20 20 20 20 26  pReader) .     &
bba0: 26 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72  & !fts3SegReader
bbb0: 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52 65 61 64  IsRootOnly(pRead
bbc0: 65 72 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  er) .    ){.    
bbd0: 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20    int jj;.      
bbe0: 66 6f 72 28 6a 6a 3d 70 52 65 61 64 65 72 2d 3e  for(jj=pReader->
bbf0: 69 53 74 61 72 74 42 6c 6f 63 6b 3b 20 6a 6a 3c  iStartBlock; jj<
bc00: 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45  =pReader->iLeafE
bc10: 6e 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b 29 7b 0a  ndBlock; jj++){.
bc20: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
bc30: 62 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  b;.        rc = 
bc40: 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42  sqlite3Fts3ReadB
bc50: 6c 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30 2c 20 26  lock(p, jj, 0, &
bc60: 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20 20 20 20  nBlob, 0);.     
bc70: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bc80: 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
bc90: 20 20 20 20 20 20 69 66 28 20 28 6e 42 6c 6f 62        if( (nBlob
bca0: 2b 33 35 29 3e 70 67 73 7a 20 29 7b 0a 20 20 20  +35)>pgsz ){.   
bcb0: 20 20 20 20 20 20 20 6e 4f 76 66 6c 20 2b 3d 20         nOvfl += 
bcc0: 28 6e 42 6c 6f 62 20 2b 20 33 34 29 2f 70 67 73  (nBlob + 34)/pgs
bcd0: 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  z;.        }.   
bce0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
bcf0: 20 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f 76 66 6c   *pnOvfl = nOvfl
bd00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
bd10: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
bd20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
bd30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
bd40: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
bd50: 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f   as the .** seco
bd60: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
bd70: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
bd80: 53 65 67 52 65 61 64 65 72 46 72 65 65 28 46 74  SegReaderFree(Ft
bd90: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
bda0: 61 64 65 72 29 7b 0a 20 20 69 66 28 20 70 52 65  ader){.  if( pRe
bdb0: 61 64 65 72 20 26 26 20 21 66 74 73 33 53 65 67  ader && !fts3Seg
bdc0: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
bdd0: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
bde0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65  sqlite3_free(pRe
bdf0: 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20  ader->zTerm);.  
be00: 20 20 69 66 28 20 21 66 74 73 33 53 65 67 52 65    if( !fts3SegRe
be10: 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70  aderIsRootOnly(p
be20: 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20  Reader) ){.     
be30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
be40: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20  eader->aNode);. 
be50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f       sqlite3_blo
be60: 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 2d  b_close(pReader-
be70: 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 7d 0a 20  >pBlob);.    }. 
be80: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
be90: 65 28 70 52 65 61 64 65 72 29 3b 0a 7d 0a 0a 2f  e(pReader);.}../
bea0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
beb0: 6e 65 77 20 53 65 67 52 65 61 64 65 72 20 6f 62  new SegReader ob
bec0: 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ject..*/.int sql
bed0: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
bee0: 72 4e 65 77 28 0a 20 20 69 6e 74 20 69 41 67 65  rNew(.  int iAge
bef0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bf00: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
bf10: 6e 74 20 22 61 67 65 22 2e 20 2a 2f 0a 20 20 73  nt "age". */.  s
bf20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74  qlite3_int64 iSt
bf30: 61 72 74 4c 65 61 66 2c 20 20 20 20 20 20 20 2f  artLeaf,       /
bf40: 2a 20 46 69 72 73 74 20 6c 65 61 66 20 74 6f 20  * First leaf to 
bf50: 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73 71  traverse */.  sq
bf60: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64  lite3_int64 iEnd
bf70: 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 2f 2a  Leaf,         /*
bf80: 20 46 69 6e 61 6c 20 6c 65 61 66 20 74 6f 20 74   Final leaf to t
bf90: 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c  raverse */.  sql
bfa0: 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 42  ite3_int64 iEndB
bfb0: 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20  lock,        /* 
bfc0: 46 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f 66 20 73  Final block of s
bfd0: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  egment */.  cons
bfe0: 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c 20 20  t char *zRoot,  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
c000: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
c010: 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
c020: 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 20 20  int nRoot,      
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
c050: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f  r containing roo
c060: 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33  t node */.  Fts3
c070: 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70 52 65  SegReader **ppRe
c080: 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a 20 4f  ader        /* O
c090: 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20 46 74  UT: Allocated Ft
c0a0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2f 0a 29  s3SegReader */.)
c0b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c0c0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
c0d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
c0e0: 64 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52  de */.  Fts3SegR
c0f0: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 3b 20  eader *pReader; 
c100: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
c110: 20 61 6c 6c 6f 63 61 74 65 64 20 53 65 67 52 65   allocated SegRe
c120: 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ader object */. 
c130: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
c160: 6f 63 61 74 65 20 73 65 67 6d 65 6e 74 20 72 6f  ocate segment ro
c170: 6f 74 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  ot node */..  as
c180: 73 65 72 74 28 20 69 53 74 61 72 74 4c 65 61 66  sert( iStartLeaf
c190: 3c 3d 69 45 6e 64 4c 65 61 66 20 29 3b 0a 20 20  <=iEndLeaf );.  
c1a0: 69 66 28 20 69 53 74 61 72 74 4c 65 61 66 3d 3d  if( iStartLeaf==
c1b0: 30 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20  0 ){.    nExtra 
c1c0: 3d 20 6e 52 6f 6f 74 20 2b 20 46 54 53 33 5f 4e  = nRoot + FTS3_N
c1d0: 4f 44 45 5f 50 41 44 44 49 4e 47 3b 0a 20 20 7d  ODE_PADDING;.  }
c1e0: 0a 0a 20 20 70 52 65 61 64 65 72 20 3d 20 28 46  ..  pReader = (F
c1f0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 73  ts3SegReader *)s
c200: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
c210: 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64  zeof(Fts3SegRead
c220: 65 72 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20  er) + nExtra);. 
c230: 20 69 66 28 20 21 70 52 65 61 64 65 72 20 29 7b   if( !pReader ){
c240: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c250: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c260: 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20  memset(pReader, 
c270: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65  0, sizeof(Fts3Se
c280: 67 52 65 61 64 65 72 29 29 3b 0a 20 20 70 52 65  gReader));.  pRe
c290: 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 69 41 67  ader->iIdx = iAg
c2a0: 65 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 53  e;.  pReader->iS
c2b0: 74 61 72 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61  tartBlock = iSta
c2c0: 72 74 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65  rtLeaf;.  pReade
c2d0: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
c2e0: 20 3d 20 69 45 6e 64 4c 65 61 66 3b 0a 20 20 70   = iEndLeaf;.  p
c2f0: 52 65 61 64 65 72 2d 3e 69 45 6e 64 42 6c 6f 63  Reader->iEndBloc
c300: 6b 20 3d 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a  k = iEndBlock;..
c310: 20 20 69 66 28 20 6e 45 78 74 72 61 20 29 7b 0a    if( nExtra ){.
c320: 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
c330: 65 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f  e segment is sto
c340: 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6f 74 20  red in the root 
c350: 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 52 65  node. */.    pRe
c360: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63  ader->aNode = (c
c370: 68 61 72 20 2a 29 26 70 52 65 61 64 65 72 5b 31  har *)&pReader[1
c380: 5d 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e  ];.    pReader->
c390: 6e 4e 6f 64 65 20 3d 20 6e 52 6f 6f 74 3b 0a 20  nNode = nRoot;. 
c3a0: 20 20 20 6d 65 6d 63 70 79 28 70 52 65 61 64 65     memcpy(pReade
c3b0: 72 2d 3e 61 4e 6f 64 65 2c 20 7a 52 6f 6f 74 2c  r->aNode, zRoot,
c3c0: 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 6d 65 6d   nRoot);.    mem
c3d0: 73 65 74 28 26 70 52 65 61 64 65 72 2d 3e 61 4e  set(&pReader->aN
c3e0: 6f 64 65 5b 6e 52 6f 6f 74 5d 2c 20 30 2c 20 46  ode[nRoot], 0, F
c3f0: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
c400: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c410: 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e  pReader->iCurren
c420: 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61 72 74 4c  tBlock = iStartL
c430: 65 61 66 2d 31 3b 0a 20 20 7d 0a 0a 20 20 69 66  eaf-1;.  }..  if
c440: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c450: 29 7b 0a 20 20 20 20 2a 70 70 52 65 61 64 65 72  ){.    *ppReader
c460: 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 7d 65   = pReader;.  }e
c470: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
c480: 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65  Fts3SegReaderFre
c490: 65 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a  e(pReader);.  }.
c4a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c4b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
c4c0: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
c4d0: 69 6f 6e 20 75 73 65 64 20 61 73 20 61 20 71 73  ion used as a qs
c4e0: 6f 72 74 28 29 20 63 61 6c 6c 62 61 63 6b 20 77  ort() callback w
c4f0: 68 65 6e 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 61  hen sorting.** a
c500: 6e 20 61 72 72 61 79 20 6f 66 20 70 65 6e 64 69  n array of pendi
c510: 6e 67 20 74 65 72 6d 73 20 62 79 20 74 65 72 6d  ng terms by term
c520: 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 73  . This occurs as
c530: 20 70 61 72 74 20 6f 66 20 66 6c 75 73 68 69 6e   part of flushin
c540: 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
c550: 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
c560: 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c  -terms hash tabl
c570: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
c580: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c590: 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d   fts3CompareElem
c5a0: 42 79 54 65 72 6d 28 63 6f 6e 73 74 20 76 6f 69  ByTerm(const voi
c5b0: 64 20 2a 6c 68 73 2c 20 63 6f 6e 73 74 20 76 6f  d *lhs, const vo
c5c0: 69 64 20 2a 72 68 73 29 7b 0a 20 20 63 68 61 72  id *rhs){.  char
c5d0: 20 2a 7a 31 20 3d 20 66 74 73 33 48 61 73 68 4b   *z1 = fts3HashK
c5e0: 65 79 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65  ey(*(Fts3HashEle
c5f0: 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 63 68 61  m **)lhs);.  cha
c600: 72 20 2a 7a 32 20 3d 20 66 74 73 33 48 61 73 68  r *z2 = fts3Hash
c610: 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68 45 6c  Key(*(Fts3HashEl
c620: 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 20 20 69 6e  em **)rhs);.  in
c630: 74 20 6e 31 20 3d 20 66 74 73 33 48 61 73 68 4b  t n1 = fts3HashK
c640: 65 79 73 69 7a 65 28 2a 28 46 74 73 33 48 61 73  eysize(*(Fts3Has
c650: 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20  hElem **)lhs);. 
c660: 20 69 6e 74 20 6e 32 20 3d 20 66 74 73 33 48 61   int n2 = fts3Ha
c670: 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33  shKeysize(*(Fts3
c680: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29  HashElem **)rhs)
c690: 3b 0a 0a 20 20 69 6e 74 20 6e 20 3d 20 28 6e 31  ;..  int n = (n1
c6a0: 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a  <n2 ? n1 : n2);.
c6b0: 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70    int c = memcmp
c6c0: 28 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a 20 20 69  (z1, z2, n);.  i
c6d0: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( c==0 ){.    c
c6e0: 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a   = n1 - n2;.  }.
c6f0: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
c700: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c710: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  on is used to al
c720: 6c 6f 63 61 74 65 20 61 6e 20 46 74 73 33 53 65  locate an Fts3Se
c730: 67 52 65 61 64 65 72 20 74 68 61 74 20 69 74 65  gReader that ite
c740: 72 61 74 65 73 20 74 68 72 6f 75 67 68 0a 2a 2a  rates through.**
c750: 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65   a subset of the
c760: 20 74 65 72 6d 73 20 73 74 6f 72 65 64 20 69 6e   terms stored in
c770: 20 74 68 65 20 46 74 73 33 54 61 62 6c 65 2e 70   the Fts3Table.p
c780: 65 6e 64 69 6e 67 54 65 72 6d 73 20 61 72 72 61  endingTerms arra
c790: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
c7a0: 69 73 50 72 65 66 69 78 49 74 65 72 20 70 61 72  isPrefixIter par
c7b0: 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20  ameter is zero, 
c7c0: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
c7d0: 64 20 53 65 67 52 65 61 64 65 72 20 69 74 65 72  d SegReader iter
c7e0: 61 74 65 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20  ates.** through 
c7f0: 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
c800: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
c810: 61 62 6c 65 2e 20 4f 72 2c 20 69 66 20 69 73 50  able. Or, if isP
c820: 72 65 66 69 78 49 74 65 72 20 69 73 0a 2a 2a 20  refixIter is.** 
c830: 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 74 65  non-zero, it ite
c840: 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 65 61  rates through ea
c850: 63 68 20 74 65 72 6d 20 61 6e 64 20 69 74 73 20  ch term and its 
c860: 70 72 65 66 69 78 65 73 2e 20 46 6f 72 20 65 78  prefixes. For ex
c870: 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65  ample, if.** the
c880: 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 68   pending terms h
c890: 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ash table contai
c8a0: 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22 73 71  ns the terms "sq
c8b0: 6c 69 74 65 22 2c 20 22 6d 79 73 71 6c 22 20 61  lite", "mysql" a
c8c0: 6e 64 0a 2a 2a 20 22 66 69 72 65 62 69 72 64 22  nd.** "firebird"
c8d0: 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
c8e0: 74 6f 72 20 76 69 73 69 74 73 20 74 68 65 20 66  tor visits the f
c8f0: 6f 6c 6c 6f 77 69 6e 67 20 27 74 65 72 6d 73 27  ollowing 'terms'
c900: 20 28 69 6e 20 74 68 65 20 6f 72 64 65 72 0a 2a   (in the order.*
c910: 2a 20 73 68 6f 77 6e 29 3a 0a 2a 2a 0a 2a 2a 20  * shown):.**.** 
c920: 20 20 66 20 66 69 20 66 69 72 20 66 69 72 65 20    f fi fir fire 
c930: 66 69 72 65 62 20 66 69 72 65 62 69 20 66 69 72  fireb firebi fir
c940: 65 62 69 72 20 66 69 72 65 62 69 72 64 0a 2a 2a  ebir firebird.**
c950: 20 20 20 6d 20 6d 79 20 6d 79 73 20 6d 79 73 71     m my mys mysq
c960: 20 6d 79 73 71 6c 0a 2a 2a 20 20 20 73 20 73 71   mysql.**   s sq
c970: 20 73 71 6c 20 73 71 6c 69 20 73 71 6c 69 74 20   sql sqli sqlit 
c980: 73 71 6c 69 74 65 0a 2a 2a 0a 2a 2a 20 57 68 65  sqlite.**.** Whe
c990: 72 65 61 73 20 69 66 20 69 73 50 72 65 66 69 78  reas if isPrefix
c9a0: 49 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68  Iter is zero, th
c9b0: 65 20 74 65 72 6d 73 20 76 69 73 69 74 65 64 20  e terms visited 
c9c0: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 69 72  are:.**.**   fir
c9d0: 65 62 69 72 64 20 6d 79 73 71 6c 20 73 71 6c 69  ebird mysql sqli
c9e0: 74 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  te.*/.int sqlite
c9f0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 50 65  3Fts3SegReaderPe
ca00: 6e 64 69 6e 67 28 0a 20 20 46 74 73 33 54 61 62  nding(.  Fts3Tab
ca10: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
ca20: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
ca30: 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
ca40: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
ca50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ca60: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
ca70: 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a  or p->aIndex */.
ca80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ca90: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
caa0: 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 61    /* Term to sea
cab0: 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  rch for */.  int
cac0: 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   nTerm,         
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cae0: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a  Size of buffer z
caf0: 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 50  Term */.  int bP
cb00: 72 65 66 69 78 2c 20 20 20 20 20 20 20 20 20 20  refix,          
cb10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb20: 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20 69  e for a prefix i
cb30: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73  terator */.  Fts
cb40: 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70 52  3SegReader **ppR
cb50: 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a 20  eader        /* 
cb60: 4f 55 54 3a 20 53 65 67 52 65 61 64 65 72 20 66  OUT: SegReader f
cb70: 6f 72 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  or pending-terms
cb80: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67   */.){.  Fts3Seg
cb90: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 20  Reader *pReader 
cba0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 74 73 33  = 0;     /* Fts3
cbb0: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
cbc0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
cbd0: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61  Fts3HashElem **a
cbe0: 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  Elem = 0;       
cbf0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 65 72 6d  /* Array of term
cc00: 20 68 61 73 68 20 65 6e 74 72 69 65 73 20 74 6f   hash entries to
cc10: 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   scan */.  int n
cc20: 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  Elem = 0;       
cc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
cc40: 7a 65 20 6f 66 20 61 72 72 61 79 20 61 74 20 61  ze of array at a
cc50: 45 6c 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Elem */.  int rc
cc60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
cc70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
cc80: 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74  urn Code */.  Ft
cc90: 73 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a  s3Hash *pHash;..
cca0: 20 20 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 49    pHash = &p->aI
ccb0: 6e 64 65 78 5b 69 49 6e 64 65 78 5d 2e 68 50 65  ndex[iIndex].hPe
ccc0: 6e 64 69 6e 67 3b 0a 20 20 69 66 28 20 62 50 72  nding;.  if( bPr
ccd0: 65 66 69 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  efix ){.    int 
cce0: 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20  nAlloc = 0;     
ccf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
cd00: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 61  e of allocated a
cd10: 72 72 61 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f  rray at aElem */
cd20: 0a 20 20 20 20 46 74 73 33 48 61 73 68 45 6c 65  .    Fts3HashEle
cd30: 6d 20 2a 70 45 20 3d 20 30 3b 20 20 20 20 20 20  m *pE = 0;      
cd40: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
cd50: 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  ariable */..    
cd60: 66 6f 72 28 70 45 3d 66 74 73 33 48 61 73 68 46  for(pE=fts3HashF
cd70: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 3b  irst(pHash); pE;
cd80: 20 70 45 3d 66 74 73 33 48 61 73 68 4e 65 78 74   pE=fts3HashNext
cd90: 28 70 45 29 29 7b 0a 20 20 20 20 20 20 63 68 61  (pE)){.      cha
cda0: 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68 61 72 20  r *zKey = (char 
cdb0: 2a 29 66 74 73 33 48 61 73 68 4b 65 79 28 70 45  *)fts3HashKey(pE
cdc0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  );.      int nKe
cdd0: 79 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73  y = fts3HashKeys
cde0: 69 7a 65 28 70 45 29 3b 0a 20 20 20 20 20 20 69  ize(pE);.      i
cdf0: 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( nTerm==0 || (
ce00: 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26 26 20 30  nKey>=nTerm && 0
ce10: 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79 2c 20 7a  ==memcmp(zKey, z
ce20: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 20 29 7b  Term, nTerm)) ){
ce30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 6c  .        if( nEl
ce40: 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  em==nAlloc ){.  
ce50: 20 20 20 20 20 20 20 20 46 74 73 33 48 61 73 68          Fts3Hash
ce60: 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32 3b 0a 20  Elem **aElem2;. 
ce70: 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20           nAlloc 
ce80: 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 20  += 16;.         
ce90: 20 61 45 6c 65 6d 32 20 3d 20 28 46 74 73 33 48   aElem2 = (Fts3H
cea0: 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71 6c 69 74  ashElem **)sqlit
ceb0: 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
cec0: 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 2c            aElem,
ced0: 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 46   nAlloc*sizeof(F
cee0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 0a 20  ts3HashElem *). 
cef0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
cf00: 20 20 20 20 20 20 69 66 28 20 21 61 45 6c 65 6d        if( !aElem
cf10: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
cf20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
cf30: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
cf40: 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20 20 20 20  nElem = 0;.     
cf50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cf60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf70: 20 20 20 20 61 45 6c 65 6d 20 3d 20 61 45 6c 65      aElem = aEle
cf80: 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  m2;.        }.. 
cf90: 20 20 20 20 20 20 20 61 45 6c 65 6d 5b 6e 45 6c         aElem[nEl
cfa0: 65 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20 20 20 20  em++] = pE;.    
cfb0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
cfc0: 2a 20 49 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f  * If more than o
cfd0: 6e 65 20 74 65 72 6d 20 6d 61 74 63 68 65 73 20  ne term matches 
cfe0: 74 68 65 20 70 72 65 66 69 78 2c 20 73 6f 72 74  the prefix, sort
cff0: 20 74 68 65 20 46 74 73 33 48 61 73 68 45 6c 65   the Fts3HashEle
d000: 6d 0a 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 73  m.    ** objects
d010: 20 69 6e 20 74 65 72 6d 20 6f 72 64 65 72 20 75   in term order u
d020: 73 69 6e 67 20 71 73 6f 72 74 28 29 2e 20 54 68  sing qsort(). Th
d030: 69 73 20 75 73 65 73 20 74 68 65 20 73 61 6d 65  is uses the same
d040: 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
d050: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61 73 20 69  ** callback as i
d060: 73 20 75 73 65 64 20 77 68 65 6e 20 66 6c 75 73  s used when flus
d070: 68 69 6e 67 20 74 65 72 6d 73 20 74 6f 20 64 69  hing terms to di
d080: 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  sk..    */.    i
d090: 66 28 20 6e 45 6c 65 6d 3e 31 20 29 7b 0a 20 20  f( nElem>1 ){.  
d0a0: 20 20 20 20 71 73 6f 72 74 28 61 45 6c 65 6d 2c      qsort(aElem,
d0b0: 20 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f 66 28 46   nElem, sizeof(F
d0c0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 2c 20  ts3HashElem *), 
d0d0: 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42  fts3CompareElemB
d0e0: 79 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  yTerm);.    }.. 
d0f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
d100: 68 65 20 71 75 65 72 79 20 69 73 20 61 20 73 69  he query is a si
d110: 6d 70 6c 65 20 74 65 72 6d 20 6c 6f 6f 6b 75 70  mple term lookup
d120: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 74   that matches at
d130: 20 6d 6f 73 74 20 6f 6e 65 20 74 65 72 6d 20 69   most one term i
d140: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  n.    ** the ind
d150: 65 78 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 20  ex. All that is 
d160: 72 65 71 75 69 72 65 64 20 69 73 20 61 20 73 74  required is a st
d170: 72 61 69 67 68 74 20 68 61 73 68 2d 6c 6f 6f 6b  raight hash-look
d180: 75 70 2e 20 2a 2f 0a 20 20 20 20 46 74 73 33 48  up. */.    Fts3H
d190: 61 73 68 45 6c 65 6d 20 2a 70 45 20 3d 20 66 74  ashElem *pE = ft
d1a0: 73 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28 70  s3HashFindElem(p
d1b0: 48 61 73 68 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Hash, zTerm, nTe
d1c0: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 45 20  rm);.    if( pE 
d1d0: 29 7b 0a 20 20 20 20 20 20 61 45 6c 65 6d 20 3d  ){.      aElem =
d1e0: 20 26 70 45 3b 0a 20 20 20 20 20 20 6e 45 6c 65   &pE;.      nEle
d1f0: 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  m = 1;.    }.  }
d200: 0a 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3e 30 20  ..  if( nElem>0 
d210: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
d220: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65   = sizeof(Fts3Se
d230: 67 52 65 61 64 65 72 29 20 2b 20 28 6e 45 6c 65  gReader) + (nEle
d240: 6d 2b 31 29 2a 73 69 7a 65 6f 66 28 46 74 73 33  m+1)*sizeof(Fts3
d250: 48 61 73 68 45 6c 65 6d 20 2a 29 3b 0a 20 20 20  HashElem *);.   
d260: 20 70 52 65 61 64 65 72 20 3d 20 28 46 74 73 33   pReader = (Fts3
d270: 53 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c 69  SegReader *)sqli
d280: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
d290: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 52 65 61  );.    if( !pRea
d2a0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  der ){.      rc 
d2b0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
d2c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d2d0: 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72 2c   memset(pReader,
d2e0: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
d2f0: 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78 20    pReader->iIdx 
d300: 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20  = 0x7FFFFFFF;.  
d310: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70 4e      pReader->ppN
d320: 65 78 74 45 6c 65 6d 20 3d 20 28 46 74 73 33 48  extElem = (Fts3H
d330: 61 73 68 45 6c 65 6d 20 2a 2a 29 26 70 52 65 61  ashElem **)&pRea
d340: 64 65 72 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65  der[1];.      me
d350: 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e 70 70  mcpy(pReader->pp
d360: 4e 65 78 74 45 6c 65 6d 2c 20 61 45 6c 65 6d 2c  NextElem, aElem,
d370: 20 6e 45 6c 65 6d 2a 73 69 7a 65 6f 66 28 46 74   nElem*sizeof(Ft
d380: 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 29 3b 0a  s3HashElem *));.
d390: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
d3a0: 20 62 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20   bPrefix ){.    
d3b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 45 6c  sqlite3_free(aEl
d3c0: 65 6d 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65  em);.  }.  *ppRe
d3d0: 61 64 65 72 20 3d 20 70 52 65 61 64 65 72 3b 0a  ader = pReader;.
d3e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d3f0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
d400: 65 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 65  e entries pointe
d410: 64 20 74 6f 20 62 79 20 74 77 6f 20 46 74 73 33  d to by two Fts3
d420: 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63 74  SegReader struct
d430: 75 72 65 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72  ures. .** Compar
d440: 69 73 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ison is as follo
d450: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45  ws:.**.**   1) E
d460: 4f 46 20 69 73 20 67 72 65 61 74 65 72 20 74 68  OF is greater th
d470: 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  an not EOF..**.*
d480: 2a 20 20 20 32 29 20 54 68 65 20 63 75 72 72 65  *   2) The curre
d490: 6e 74 20 74 65 72 6d 73 20 28 69 66 20 61 6e 79  nt terms (if any
d4a0: 29 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20 75  ) are compared u
d4b0: 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49  sing memcmp(). I
d4c0: 66 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 74 65  f one.**      te
d4d0: 72 6d 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  rm is a prefix o
d4e0: 66 20 61 6e 6f 74 68 65 72 2c 20 74 68 65 20 6c  f another, the l
d4f0: 6f 6e 67 65 72 20 74 65 72 6d 20 69 73 20 63 6f  onger term is co
d500: 6e 73 69 64 65 72 65 64 20 74 68 65 0a 2a 2a 20  nsidered the.** 
d510: 20 20 20 20 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a       larger..**.
d520: 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65  **   3) By segme
d530: 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72  nt age. An older
d540: 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73   segment is cons
d550: 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a  idered larger..*
d560: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
d570: 33 53 65 67 52 65 61 64 65 72 43 6d 70 28 46 74  3SegReaderCmp(Ft
d580: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68  s3SegReader *pLh
d590: 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  s, Fts3SegReader
d5a0: 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72   *pRhs){.  int r
d5b0: 63 3b 0a 20 20 69 66 28 20 70 4c 68 73 2d 3e 61  c;.  if( pLhs->a
d5c0: 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e  Node && pRhs->aN
d5d0: 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
d5e0: 63 32 20 3d 20 70 4c 68 73 2d 3e 6e 54 65 72 6d  c2 = pLhs->nTerm
d5f0: 20 2d 20 70 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a   - pRhs->nTerm;.
d600: 20 20 20 20 69 66 28 20 72 63 32 3c 30 20 29 7b      if( rc2<0 ){
d610: 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63  .      rc = memc
d620: 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20  mp(pLhs->zTerm, 
d630: 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68  pRhs->zTerm, pLh
d640: 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d  s->nTerm);.    }
d650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
d660: 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54   memcmp(pLhs->zT
d670: 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d  erm, pRhs->zTerm
d680: 2c 20 70 52 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a  , pRhs->nTerm);.
d690: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
d6a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
d6b0: 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
d6c0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 28  else{.    rc = (
d6d0: 70 4c 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20  pLhs->aNode==0) 
d6e0: 2d 20 28 70 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d  - (pRhs->aNode==
d6f0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
d700: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
d710: 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68  pRhs->iIdx - pLh
d720: 73 2d 3e 69 49 64 78 3b 0a 20 20 7d 0a 20 20 61  s->iIdx;.  }.  a
d730: 73 73 65 72 74 28 20 72 63 21 3d 30 20 29 3b 0a  ssert( rc!=0 );.
d740: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d750: 2f 2a 0a 2a 2a 20 41 20 64 69 66 66 65 72 65 6e  /*.** A differen
d760: 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  t comparison fun
d770: 63 74 69 6f 6e 20 66 6f 72 20 53 65 67 52 65 61  ction for SegRea
d780: 64 65 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  der structures. 
d790: 49 6e 20 74 68 69 73 0a 2a 2a 20 76 65 72 73 69  In this.** versi
d7a0: 6f 6e 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  on, it is assume
d7b0: 64 20 74 68 61 74 20 65 61 63 68 20 53 65 67 52  d that each SegR
d7c0: 65 61 64 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  eader points to 
d7d0: 61 6e 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 61  an entry in.** a
d7e0: 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 69 64 65   doclist for ide
d7f0: 6e 74 69 63 61 6c 20 74 65 72 6d 73 2e 20 43 6f  ntical terms. Co
d800: 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
d810: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d820: 2a 2a 20 20 20 31 29 20 45 4f 46 20 28 65 6e 64  **   1) EOF (end
d830: 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 74   of doclist in t
d840: 68 69 73 20 63 61 73 65 29 20 69 73 20 67 72 65  his case) is gre
d850: 61 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f  ater than not EO
d860: 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 42 79  F..**.**   2) By
d870: 20 63 75 72 72 65 6e 74 20 64 6f 63 69 64 2e 0a   current docid..
d880: 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79 20 73 65  **.**   3) By se
d890: 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c  gment age. An ol
d8a0: 64 65 72 20 73 65 67 6d 65 6e 74 20 69 73 20 63  der segment is c
d8b0: 6f 6e 73 69 64 65 72 65 64 20 6c 61 72 67 65 72  onsidered larger
d8c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d8d0: 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
d8e0: 6c 69 73 74 43 6d 70 28 46 74 73 33 53 65 67 52  listCmp(Fts3SegR
d8f0: 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73  eader *pLhs, Fts
d900: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73  3SegReader *pRhs
d910: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28 70  ){.  int rc = (p
d920: 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  Lhs->pOffsetList
d930: 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66  ==0)-(pRhs->pOff
d940: 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69  setList==0);.  i
d950: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
d960: 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64  if( pLhs->iDocid
d970: 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20 29  ==pRhs->iDocid )
d980: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52 68  {.      rc = pRh
d990: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e  s->iIdx - pLhs->
d9a0: 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iIdx;.    }else{
d9b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c 68  .      rc = (pLh
d9c0: 73 2d 3e 69 44 6f 63 69 64 20 3e 20 70 52 68 73  s->iDocid > pRhs
d9d0: 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a 20  ->iDocid) ? 1 : 
d9e0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
d9f0: 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e  assert( pLhs->aN
da00: 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f  ode && pRhs->aNo
da10: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  de );.  return r
da20: 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
da30: 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
da40: 6c 69 73 74 43 6d 70 52 65 76 28 46 74 73 33 53  listCmpRev(Fts3S
da50: 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20  egReader *pLhs, 
da60: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
da70: 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Rhs){.  int rc =
da80: 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c   (pLhs->pOffsetL
da90: 69 73 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70  ist==0)-(pRhs->p
daa0: 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a  OffsetList==0);.
dab0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
dac0: 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f     if( pLhs->iDo
dad0: 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69  cid==pRhs->iDoci
dae0: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
daf0: 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68  pRhs->iIdx - pLh
db00: 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c  s->iIdx;.    }el
db10: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  se{.      rc = (
db20: 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20 3c 20 70  pLhs->iDocid < p
db30: 52 68 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31  Rhs->iDocid) ? 1
db40: 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   : -1;.    }.  }
db50: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 68 73 2d  .  assert( pLhs-
db60: 3e 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e  >aNode && pRhs->
db70: 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72  aNode );.  retur
db80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
db90: 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d 20  ompare the term 
dba0: 74 68 61 74 20 74 68 65 20 46 74 73 33 53 65 67  that the Fts3Seg
dbb0: 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61  Reader object pa
dbc0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
dbd0: 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f  t argument.** po
dbe0: 69 6e 74 73 20 74 6f 20 77 69 74 68 20 74 68 65  ints to with the
dbf0: 20 74 65 72 6d 20 73 70 65 63 69 66 69 65 64 20   term specified 
dc00: 62 79 20 61 72 67 75 6d 65 6e 74 73 20 7a 54 65  by arguments zTe
dc10: 72 6d 20 61 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a  rm and nTerm. .*
dc20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 67  *.** If the pSeg
dc30: 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 6c 72   iterator is alr
dc40: 65 61 64 79 20 61 74 20 45 4f 46 2c 20 72 65 74  eady at EOF, ret
dc50: 75 72 6e 20 30 2e 20 4f 74 68 65 72 77 69 73 65  urn 0. Otherwise
dc60: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 2d 76 65 20  , return.** -ve 
dc70: 69 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d  if the pSeg term
dc80: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 54   is less than zT
dc90: 65 72 6d 2f 6e 54 65 72 6d 2c 20 30 20 69 66 20  erm/nTerm, 0 if 
dca0: 74 68 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72  the two terms ar
dcb0: 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 6f 72 20 2b  e.** equal, or +
dcc0: 76 65 20 69 66 20 74 68 65 20 70 53 65 67 20 74  ve if the pSeg t
dcd0: 65 72 6d 20 69 73 20 67 72 65 61 74 65 72 20 74  erm is greater t
dce0: 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e  han zTerm/nTerm.
dcf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
dd00: 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72 6d  ts3SegReaderTerm
dd10: 43 6d 70 28 0a 20 20 46 74 73 33 53 65 67 52 65  Cmp(.  Fts3SegRe
dd20: 61 64 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20  ader *pSeg,     
dd30: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
dd40: 74 20 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20  t reader object 
dd50: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
dd60: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
dd70: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
dd80: 63 6f 6d 70 61 72 65 20 74 6f 20 2a 2f 0a 20 20  compare to */.  
dd90: 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20  int nTerm       
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
ddc0: 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
ddd0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  /.){.  int res =
dde0: 20 30 3b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e   0;.  if( pSeg->
ddf0: 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  aNode ){.    if(
de00: 20 70 53 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65   pSeg->nTerm>nTe
de10: 72 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  rm ){.      res 
de20: 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a  = memcmp(pSeg->z
de30: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
de40: 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rm);.    }else{.
de50: 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63        res = memc
de60: 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20  mp(pSeg->zTerm, 
de70: 7a 54 65 72 6d 2c 20 70 53 65 67 2d 3e 6e 54 65  zTerm, pSeg->nTe
de80: 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rm);.    }.    i
de90: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
dea0: 20 20 20 72 65 73 20 3d 20 70 53 65 67 2d 3e 6e     res = pSeg->n
deb0: 54 65 72 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20 20  Term-nTerm;.    
dec0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
ded0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  es;.}../*.** Arg
dee0: 75 6d 65 6e 74 20 61 70 53 65 67 6d 65 6e 74 20  ument apSegment 
def0: 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  is an array of n
df00: 53 65 67 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 73  Segment elements
df10: 2e 20 49 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68  . It is known th
df20: 61 74 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  at.** the final 
df30: 28 6e 53 65 67 6d 65 6e 74 2d 6e 53 75 73 70 65  (nSegment-nSuspe
df40: 63 74 29 20 6d 65 6d 62 65 72 73 20 61 72 65 20  ct) members are 
df50: 61 6c 72 65 61 64 79 20 69 6e 20 73 6f 72 74 65  already in sorte
df60: 64 20 6f 72 64 65 72 0a 2a 2a 20 28 61 63 63 6f  d order.** (acco
df70: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
df80: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
df90: 20 70 72 6f 76 69 64 65 64 29 2e 20 54 68 69 73   provided). This
dfa0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 75 66 66 6c   function shuffl
dfb0: 65 73 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20  es.** the array 
dfc0: 61 72 6f 75 6e 64 20 75 6e 74 69 6c 20 61 6c 6c  around until all
dfd0: 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20   entries are in 
dfe0: 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2f  sorted order..*/
dff0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
e000: 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 0a  3SegReaderSort(.
e010: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
e020: 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20  **apSegment,    
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 20 2f 2a 20 41 72 72 61 79 20 74 6f 20 73 6f 72   /* Array to sor
e050: 74 20 65 6e 74 72 69 65 73 20 6f 66 20 2a 2f 0a  t entries of */.
e060: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20    int nSegment, 
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53 65   /* Size of apSe
e0a0: 67 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  gment array */. 
e0b0: 20 69 6e 74 20 6e 53 75 73 70 65 63 74 2c 20 20   int nSuspect,  
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 2f 2a 20 55 6e 73 6f 72 74 65 64 20 65 6e 74 72  /* Unsorted entr
e0f0: 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74  y count */.  int
e100: 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67   (*xCmp)(Fts3Seg
e110: 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65  Reader *, Fts3Se
e120: 67 52 65 61 64 65 72 20 2a 29 20 20 2f 2a 20 43  gReader *)  /* C
e130: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
e140: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  on */.){.  int i
e150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
e170: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
e180: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53  */..  assert( nS
e190: 75 73 70 65 63 74 3c 3d 6e 53 65 67 6d 65 6e 74  uspect<=nSegment
e1a0: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 53 75 73 70   );..  if( nSusp
e1b0: 65 63 74 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 20  ect==nSegment ) 
e1c0: 6e 53 75 73 70 65 63 74 2d 2d 3b 0a 20 20 66 6f  nSuspect--;.  fo
e1d0: 72 28 69 3d 6e 53 75 73 70 65 63 74 2d 31 3b 20  r(i=nSuspect-1; 
e1e0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
e1f0: 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a  int j;.    for(j
e200: 3d 69 3b 20 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d  =i; j<(nSegment-
e210: 31 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  1); j++){.      
e220: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
e230: 54 6d 70 3b 0a 20 20 20 20 20 20 69 66 28 20 78  Tmp;.      if( x
e240: 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d  Cmp(apSegment[j]
e250: 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d  , apSegment[j+1]
e260: 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  )<0 ) break;.   
e270: 20 20 20 70 54 6d 70 20 3d 20 61 70 53 65 67 6d     pTmp = apSegm
e280: 65 6e 74 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20  ent[j+1];.      
e290: 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d  apSegment[j+1] =
e2a0: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20   apSegment[j];. 
e2b0: 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a       apSegment[j
e2c0: 5d 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a  ] = pTmp;.    }.
e2d0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
e2e0: 42 55 47 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  BUG.  /* Check t
e2f0: 68 61 74 20 74 68 65 20 6c 69 73 74 20 72 65 61  hat the list rea
e300: 6c 6c 79 20 69 73 20 73 6f 72 74 65 64 20 6e 6f  lly is sorted no
e310: 77 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  w. */.  for(i=0;
e320: 20 69 3c 28 6e 53 75 73 70 65 63 74 2d 31 29 3b   i<(nSuspect-1);
e330: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
e340: 74 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65 6e  t( xCmp(apSegmen
e350: 74 5b 69 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b  t[i], apSegment[
e360: 69 2b 31 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a 23  i+1])<0 );.  }.#
e370: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
e380: 49 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64 20  Insert a record 
e390: 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d 65  into the %_segme
e3a0: 6e 74 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  nts table..*/.st
e3b0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 57 72 69  atic int fts3Wri
e3c0: 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73  teSegment(.  Fts
e3d0: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e3f0: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
e400: 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
e410: 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 20  3_int64 iBlock, 
e420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
e430: 63 6b 20 69 64 20 66 6f 72 20 6e 65 77 20 62 6c  ck id for new bl
e440: 6f 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ock */.  char *z
e450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e460: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
e470: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
e480: 6e 74 61 69 6e 69 6e 67 20 62 6c 6f 63 6b 20 64  ntaining block d
e490: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  ata */.  int n  
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
e4c0: 20 6f 66 20 62 75 66 66 65 72 20 7a 20 69 6e 20   of buffer z in 
e4d0: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  bytes */.){.  sq
e4e0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
e4f0: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74  t;.  int rc = ft
e500: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
e510: 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53  _INSERT_SEGMENTS
e520: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
e530: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e540: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
e550: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
e560: 74 2c 20 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20  t, 1, iBlock);. 
e570: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
e580: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a  blob(pStmt, 2, z
e590: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
e5a0: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
e5b0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
e5c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
e5d0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d  eset(pStmt);.  }
e5e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e5f0: 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ./* .** Insert a
e600: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
e610: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
e620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
e630: 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 0a  ts3WriteSegdir(.
e640: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
e670: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
e680: 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6a0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76  * Value for "lev
e6b0: 65 6c 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  el" field */.  i
e6c0: 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6e0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 69 64 78  * Value for "idx
e6f0: 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c  " field */.  sql
e700: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
e710: 74 42 6c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20  tBlock,      /* 
e720: 56 61 6c 75 65 20 66 6f 72 20 22 73 74 61 72 74  Value for "start
e730: 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f  _block" field */
e740: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
e750: 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20   iLeafEndBlock, 
e760: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
e770: 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63  "leaves_end_bloc
e780: 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71  k" field */.  sq
e790: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64  lite3_int64 iEnd
e7a0: 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a  Block,        /*
e7b0: 20 56 61 6c 75 65 20 66 6f 72 20 22 65 6e 64 5f   Value for "end_
e7c0: 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a  block" field */.
e7d0: 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c 20 20    char *zRoot,  
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 2f 2a 20 42 6c 6f 62 20 76 61 6c 75 65 20    /* Blob value 
e800: 66 6f 72 20 22 72 6f 6f 74 22 20 66 69 65 6c 64  for "root" field
e810: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 20   */.  int nRoot 
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e840: 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75 66 66  of bytes in buff
e850: 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 29 7b 0a 20  er zRoot */.){. 
e860: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
e870: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Stmt;.  int rc =
e880: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
e890: 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 44 49  SQL_INSERT_SEGDI
e8a0: 52 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  R, &pStmt, 0);. 
e8b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e8c0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
e8d0: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
e8e0: 2c 20 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20  , 1, iLevel);.  
e8f0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
e900: 6e 74 28 70 53 74 6d 74 2c 20 32 2c 20 69 49 64  nt(pStmt, 2, iId
e910: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
e920: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
e930: 2c 20 33 2c 20 69 53 74 61 72 74 42 6c 6f 63 6b  , 3, iStartBlock
e940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
e950: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
e960: 20 34 2c 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63   4, iLeafEndBloc
e970: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  k);.    sqlite3_
e980: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
e990: 2c 20 35 2c 20 69 45 6e 64 42 6c 6f 63 6b 29 3b  , 5, iEndBlock);
e9a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
e9b0: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 36 2c  d_blob(pStmt, 6,
e9c0: 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 53   zRoot, nRoot, S
e9d0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
e9e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
e9f0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d  pStmt);.    rc =
ea00: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
ea10: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Stmt);.  }.  ret
ea20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ea30: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
ea40: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70   of the common p
ea50: 72 65 66 69 78 20 28 69 66 20 61 6e 79 29 20 73  refix (if any) s
ea60: 68 61 72 65 64 20 62 79 20 7a 50 72 65 76 20 61  hared by zPrev a
ea70: 6e 64 0a 2a 2a 20 7a 4e 65 78 74 2c 20 69 6e 20  nd.** zNext, in 
ea80: 62 79 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  bytes. For examp
ea90: 6c 65 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73  le, .**.**   fts
eaa0: 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  3PrefixCompress(
eab0: 22 61 62 63 22 2c 20 33 2c 20 22 61 62 63 64 65  "abc", 3, "abcde
eac0: 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75  f", 6)   // retu
ead0: 72 6e 73 20 33 0a 2a 2a 20 20 20 66 74 73 33 50  rns 3.**   fts3P
eae0: 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61  refixCompress("a
eaf0: 62 58 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22  bX", 3, "abcdef"
eb00: 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e  , 6)   // return
eb10: 73 20 32 0a 2a 2a 20 20 20 66 74 73 33 50 72 65  s 2.**   fts3Pre
eb20: 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58  fixCompress("abX
eb30: 22 2c 20 33 2c 20 22 58 62 63 64 65 66 22 2c 20  ", 3, "Xbcdef", 
eb40: 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20  6)   // returns 
eb50: 30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  0.*/.static int 
eb60: 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
eb70: 73 73 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ss(.  const char
eb80: 20 2a 7a 50 72 65 76 2c 20 20 20 20 20 20 20 20   *zPrev,        
eb90: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
eba0: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69  containing previ
ebb0: 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ous term */.  in
ebc0: 74 20 6e 50 72 65 76 2c 20 20 20 20 20 20 20 20  t nPrev,        
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ebe0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
ebf0: 7a 50 72 65 76 20 69 6e 20 62 79 74 65 73 20 2a  zPrev in bytes *
ec00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ec10: 7a 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  zNext,          
ec20: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
ec30: 6e 74 61 69 6e 69 6e 67 20 6e 65 78 74 20 74 65  ntaining next te
ec40: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 78  rm */.  int nNex
ec50: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
ec60: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
ec70: 6f 66 20 62 75 66 66 65 72 20 7a 4e 65 78 74 20  of buffer zNext 
ec80: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
ec90: 20 69 6e 74 20 6e 3b 0a 20 20 55 4e 55 53 45 44   int n;.  UNUSED
eca0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 65 78 74  _PARAMETER(nNext
ecb0: 29 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  );.  for(n=0; n<
ecc0: 6e 50 72 65 76 20 26 26 20 7a 50 72 65 76 5b 6e  nPrev && zPrev[n
ecd0: 5d 3d 3d 7a 4e 65 78 74 5b 6e 5d 3b 20 6e 2b 2b  ]==zNext[n]; n++
ece0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
ecf0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 65 72 6d  ../*.** Add term
ed00: 20 7a 54 65 72 6d 20 74 6f 20 74 68 65 20 53 65   zTerm to the Se
ed10: 67 6d 65 6e 74 4e 6f 64 65 2e 20 49 74 20 69 73  gmentNode. It is
ed20: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
ed30: 20 7a 54 65 72 6d 20 69 73 20 6c 61 72 67 65 72   zTerm is larger
ed40: 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74  .** (according t
ed50: 6f 20 6d 65 6d 63 6d 70 29 20 74 68 61 6e 20 74  o memcmp) than t
ed60: 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  he previous term
ed70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ed80: 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28  fts3NodeAddTerm(
ed90: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
edc0: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
edd0: 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 2a 70 70  SegmentNode **pp
ede0: 54 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Tree,           
edf0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65  /* IN/OUT: Segme
ee00: 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f  ntNode handle */
ee10: 20 0a 20 20 69 6e 74 20 69 73 43 6f 70 79 54 65   .  int isCopyTe
ee20: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
ee30: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a      /* True if z
ee40: 54 65 72 6d 2f 6e 54 65 72 6d 20 69 73 20 74 72  Term/nTerm is tr
ee50: 61 6e 73 69 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  ansient */.  con
ee60: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee80: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
ee90: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  r containing ter
eea0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  m */.  int nTerm
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
eed0: 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20  f term in bytes 
eee0: 2a 2f 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74 4e  */.){.  SegmentN
eef0: 6f 64 65 20 2a 70 54 72 65 65 20 3d 20 2a 70 70  ode *pTree = *pp
ef00: 54 72 65 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Tree;.  int rc;.
ef10: 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
ef20: 4e 65 77 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74  New;..  /* First
ef30: 20 74 72 79 20 74 6f 20 61 70 70 65 6e 64 20 74   try to append t
ef40: 68 65 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  he term to the c
ef50: 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20 52 65 74  urrent node. Ret
ef60: 75 72 6e 20 65 61 72 6c 79 20 69 66 20 0a 20 20  urn early if .  
ef70: 2a 2a 20 74 68 69 73 20 69 73 20 70 6f 73 73 69  ** this is possi
ef80: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
ef90: 70 54 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  pTree ){.    int
efa0: 20 6e 44 61 74 61 20 3d 20 70 54 72 65 65 2d 3e   nData = pTree->
efb0: 6e 44 61 74 61 3b 20 20 20 20 20 2f 2a 20 43 75  nData;     /* Cu
efc0: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 6e 6f  rrent size of no
efd0: 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  de in bytes */. 
efe0: 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 6e 44     int nReq = nD
eff0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
f000: 20 2f 2a 20 52 65 71 75 69 72 65 64 20 73 70 61   /* Required spa
f010: 63 65 20 61 66 74 65 72 20 61 64 64 69 6e 67 20  ce after adding 
f020: 7a 54 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  zTerm */.    int
f030: 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
f040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f050: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
f060: 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73   prefix compress
f070: 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ion */.    int n
f080: 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20  Suffix;         
f090: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 66 66           /* Suff
f0a0: 69 78 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 20 20  ix length */..  
f0b0: 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33    nPrefix = fts3
f0c0: 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
f0d0: 54 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 70 54 72  Tree->zTerm, pTr
f0e0: 65 65 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72 6d  ee->nTerm, zTerm
f0f0: 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 6e 53  , nTerm);.    nS
f100: 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50  uffix = nTerm-nP
f110: 72 65 66 69 78 3b 0a 0a 20 20 20 20 6e 52 65 71  refix;..    nReq
f120: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56   += sqlite3Fts3V
f130: 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78  arintLen(nPrefix
f140: 29 2b 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  )+sqlite3Fts3Var
f150: 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 2b  intLen(nSuffix)+
f160: 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 69 66 28  nSuffix;.    if(
f170: 20 6e 52 65 71 3c 3d 70 2d 3e 6e 4e 6f 64 65 53   nReq<=p->nNodeS
f180: 69 7a 65 20 7c 7c 20 21 70 54 72 65 65 2d 3e 7a  ize || !pTree->z
f190: 54 65 72 6d 20 29 7b 0a 0a 20 20 20 20 20 20 69  Term ){..      i
f1a0: 66 28 20 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65  f( nReq>p->nNode
f1b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
f1c0: 2f 2a 20 41 6e 20 75 6e 75 73 75 61 6c 20 63 61  /* An unusual ca
f1d0: 73 65 3a 20 74 68 69 73 20 69 73 20 74 68 65 20  se: this is the 
f1e0: 66 69 72 73 74 20 74 65 72 6d 20 74 6f 20 62 65  first term to be
f1f0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 6f   added to the no
f200: 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  de.        ** an
f210: 64 20 74 68 65 20 73 74 61 74 69 63 20 6e 6f 64  d the static nod
f220: 65 20 62 75 66 66 65 72 20 28 70 2d 3e 6e 4e 6f  e buffer (p->nNo
f230: 64 65 53 69 7a 65 20 62 79 74 65 73 29 20 69 73  deSize bytes) is
f240: 20 6e 6f 74 20 6c 61 72 67 65 0a 20 20 20 20 20   not large.     
f250: 20 20 20 2a 2a 20 65 6e 6f 75 67 68 2e 20 55 73     ** enough. Us
f260: 65 20 61 20 73 65 70 61 72 61 74 65 6c 79 20 6d  e a separately m
f270: 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 69  alloced buffer i
f280: 6e 73 74 65 61 64 20 54 68 69 73 20 77 61 73 74  nstead This wast
f290: 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d  es.        ** p-
f2a0: 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74 65 73  >nNodeSize bytes
f2b0: 2c 20 62 75 74 20 73 69 6e 63 65 20 74 68 69 73  , but since this
f2c0: 20 73 63 65 6e 61 72 69 6f 20 6f 6e 6c 79 20 63   scenario only c
f2d0: 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 0a  omes about when.
f2e0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
f2f0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 20  atabase contain 
f300: 74 77 6f 20 74 65 72 6d 73 20 74 68 61 74 20 73  two terms that s
f310: 68 61 72 65 20 61 20 70 72 65 66 69 78 20 6f 66  hare a prefix of
f320: 20 61 6c 6d 6f 73 74 20 32 4b 42 2c 20 0a 20 20   almost 2KB, .  
f330: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73        ** this is
f340: 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f   not expected to
f350: 20 62 65 20 61 20 73 65 72 69 6f 75 73 20 70 72   be a serious pr
f360: 6f 62 6c 65 6d 2e 20 0a 20 20 20 20 20 20 20 20  oblem. .        
f370: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f380: 74 28 20 70 54 72 65 65 2d 3e 61 44 61 74 61 3d  t( pTree->aData=
f390: 3d 28 63 68 61 72 20 2a 29 26 70 54 72 65 65 5b  =(char *)&pTree[
f3a0: 31 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  1] );.        pT
f3b0: 72 65 65 2d 3e 61 44 61 74 61 20 3d 20 28 63 68  ree->aData = (ch
f3c0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
f3d0: 6c 6f 63 28 6e 52 65 71 29 3b 0a 20 20 20 20 20  loc(nReq);.     
f3e0: 20 20 20 69 66 28 20 21 70 54 72 65 65 2d 3e 61     if( !pTree->a
f3f0: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
f400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f410: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
f420: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
f430: 69 66 28 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d  if( pTree->zTerm
f440: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
f450: 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69  here is no prefi
f460: 78 2d 6c 65 6e 67 74 68 20 66 69 65 6c 64 20 66  x-length field f
f470: 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e  or first term in
f480: 20 61 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20   a node */.     
f490: 20 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69     nData += sqli
f4a0: 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
f4b0: 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e  (&pTree->aData[n
f4c0: 44 61 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b  Data], nPrefix);
f4d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
f4e0: 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
f4f0: 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
f500: 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74  Tree->aData[nDat
f510: 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  a], nSuffix);.  
f520: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 54 72 65      memcpy(&pTre
f530: 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c  e->aData[nData],
f540: 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d   &zTerm[nPrefix]
f550: 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20  , nSuffix);.    
f560: 20 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 3d    pTree->nData =
f570: 20 6e 44 61 74 61 20 2b 20 6e 53 75 66 66 69 78   nData + nSuffix
f580: 3b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e  ;.      pTree->n
f590: 45 6e 74 72 79 2b 2b 3b 0a 0a 20 20 20 20 20 20  Entry++;..      
f5a0: 69 66 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29  if( isCopyTerm )
f5b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
f5c0: 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3c 6e 54 65  ree->nMalloc<nTe
f5d0: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rm ){.          
f5e0: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c  char *zNew = sql
f5f0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 54 72  ite3_realloc(pTr
f600: 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65  ee->zMalloc, nTe
f610: 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 20  rm*2);.         
f620: 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20   if( !zNew ){.  
f630: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f640: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f650: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f660: 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 4d 61 6c       pTree->nMal
f670: 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20  loc = nTerm*2;. 
f680: 20 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e           pTree->
f690: 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a  zMalloc = zNew;.
f6a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f6b0: 20 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d    pTree->zTerm =
f6c0: 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b   pTree->zMalloc;
f6d0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
f6e0: 70 54 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 7a 54  pTree->zTerm, zT
f6f0: 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
f700: 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72       pTree->nTer
f710: 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  m = nTerm;.     
f720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f730: 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 28  pTree->zTerm = (
f740: 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20  char *)zTerm;.  
f750: 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 54 65        pTree->nTe
f760: 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20  rm = nTerm;.    
f770: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
f780: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
f790: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
f7a0: 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
f7b0: 68 65 72 65 2c 20 69 74 20 77 61 73 20 6e 6f 74  here, it was not
f7c0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70   possible to app
f7d0: 65 6e 64 20 7a 54 65 72 6d 20 74 6f 20 74 68 65  end zTerm to the
f7e0: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6e 6f  .  ** current no
f7f0: 64 65 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77  de. Create a new
f800: 20 6e 6f 64 65 20 28 61 20 72 69 67 68 74 2d 73   node (a right-s
f810: 69 62 6c 69 6e 67 20 6f 66 20 74 68 65 20 63 75  ibling of the cu
f820: 72 72 65 6e 74 20 6e 6f 64 65 29 2e 0a 20 20 2a  rrent node)..  *
f830: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
f840: 20 66 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 74   first node in t
f850: 68 65 20 74 72 65 65 2c 20 74 68 65 20 74 65 72  he tree, the ter
f860: 6d 20 69 73 20 61 64 64 65 64 20 74 6f 20 69 74  m is added to it
f870: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65  ..  **.  ** Othe
f880: 72 77 69 73 65 2c 20 74 68 65 20 74 65 72 6d 20  rwise, the term 
f890: 69 73 20 6e 6f 74 20 61 64 64 65 64 20 74 6f 20  is not added to 
f8a0: 74 68 65 20 6e 65 77 20 6e 6f 64 65 2c 20 69 74  the new node, it
f8b0: 20 69 73 20 6c 65 66 74 20 65 6d 70 74 79 20 66   is left empty f
f8c0: 6f 72 0a 20 20 2a 2a 20 6e 6f 77 2e 20 49 6e 73  or.  ** now. Ins
f8d0: 74 65 61 64 2c 20 74 68 65 20 74 65 72 6d 20 69  tead, the term i
f8e0: 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  s inserted into 
f8f0: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 54  the parent of pT
f900: 72 65 65 2e 20 49 66 20 70 54 72 65 65 20 0a 20  ree. If pTree . 
f910: 20 2a 2a 20 68 61 73 20 6e 6f 20 70 61 72 65 6e   ** has no paren
f920: 74 2c 20 6f 6e 65 20 69 73 20 63 72 65 61 74 65  t, one is create
f930: 64 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70  d here..  */.  p
f940: 4e 65 77 20 3d 20 28 53 65 67 6d 65 6e 74 4e 6f  New = (SegmentNo
f950: 64 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  de *)sqlite3_mal
f960: 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65  loc(sizeof(Segme
f970: 6e 74 4e 6f 64 65 29 20 2b 20 70 2d 3e 6e 4e 6f  ntNode) + p->nNo
f980: 64 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  deSize);.  if( !
f990: 70 4e 65 77 20 29 7b 0a 20 20 20 20 72 65 74 75  pNew ){.    retu
f9a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
f9b0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
f9c0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65  ew, 0, sizeof(Se
f9d0: 67 6d 65 6e 74 4e 6f 64 65 29 29 3b 0a 20 20 70  gmentNode));.  p
f9e0: 4e 65 77 2d 3e 6e 44 61 74 61 20 3d 20 31 20 2b  New->nData = 1 +
f9f0: 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
fa00: 3b 0a 20 20 70 4e 65 77 2d 3e 61 44 61 74 61 20  ;.  pNew->aData 
fa10: 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b  = (char *)&pNew[
fa20: 31 5d 3b 0a 0a 20 20 69 66 28 20 70 54 72 65 65  1];..  if( pTree
fa30: 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e   ){.    SegmentN
fa40: 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  ode *pParent = p
fa50: 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Tree->pParent;. 
fa60: 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65     rc = fts3Node
fa70: 41 64 64 54 65 72 6d 28 70 2c 20 26 70 50 61 72  AddTerm(p, &pPar
fa80: 65 6e 74 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c  ent, isCopyTerm,
fa90: 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
faa0: 20 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e 70      if( pTree->p
fab0: 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  Parent==0 ){.   
fac0: 20 20 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e     pTree->pParen
fad0: 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20  t = pParent;.   
fae0: 20 7d 0a 20 20 20 20 70 54 72 65 65 2d 3e 70 52   }.    pTree->pR
faf0: 69 67 68 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  ight = pNew;.   
fb00: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74   pNew->pLeftmost
fb10: 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d   = pTree->pLeftm
fb20: 6f 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ost;.    pNew->p
fb30: 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
fb40: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4d 61 6c  ;.    pNew->zMal
fb50: 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61  loc = pTree->zMa
fb60: 6c 6c 6f 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lloc;.    pNew->
fb70: 6e 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d  nMalloc = pTree-
fb80: 3e 6e 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 54  >nMalloc;.    pT
fb90: 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  ree->zMalloc = 0
fba0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
fbb0: 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d  New->pLeftmost =
fbc0: 20 70 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20   pNew;.    rc = 
fbd0: 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28  fts3NodeAddTerm(
fbe0: 70 2c 20 26 70 4e 65 77 2c 20 69 73 43 6f 70 79  p, &pNew, isCopy
fbf0: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
fc00: 72 6d 29 3b 20 0a 20 20 7d 0a 0a 20 20 2a 70 70  rm); .  }..  *pp
fc10: 54 72 65 65 20 3d 20 70 4e 65 77 3b 0a 20 20 72  Tree = pNew;.  r
fc20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fc30: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
fc40: 6f 6e 20 66 6f 72 20 66 74 73 33 4e 6f 64 65 57  on for fts3NodeW
fc50: 72 69 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  rite()..*/.stati
fc60: 63 20 69 6e 74 20 66 74 73 33 54 72 65 65 46 69  c int fts3TreeFi
fc70: 6e 69 73 68 4e 6f 64 65 28 0a 20 20 53 65 67 6d  nishNode(.  Segm
fc80: 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20  entNode *pTree, 
fc90: 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20  .  int iHeight, 
fca0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
fcb0: 20 69 4c 65 66 74 43 68 69 6c 64 0a 29 7b 0a 20   iLeftChild.){. 
fcc0: 20 69 6e 74 20 6e 53 74 61 72 74 3b 0a 20 20 61   int nStart;.  a
fcd0: 73 73 65 72 74 28 20 69 48 65 69 67 68 74 3e 3d  ssert( iHeight>=
fce0: 31 20 26 26 20 69 48 65 69 67 68 74 3c 31 32 38  1 && iHeight<128
fcf0: 20 29 3b 0a 20 20 6e 53 74 61 72 74 20 3d 20 46   );.  nStart = F
fd00: 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2d  TS3_VARINT_MAX -
fd10: 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
fd20: 6e 74 4c 65 6e 28 69 4c 65 66 74 43 68 69 6c 64  ntLen(iLeftChild
fd30: 29 3b 0a 20 20 70 54 72 65 65 2d 3e 61 44 61 74  );.  pTree->aDat
fd40: 61 5b 6e 53 74 61 72 74 5d 20 3d 20 28 63 68 61  a[nStart] = (cha
fd50: 72 29 69 48 65 69 67 68 74 3b 0a 20 20 73 71 6c  r)iHeight;.  sql
fd60: 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
fd70: 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b  t(&pTree->aData[
fd80: 6e 53 74 61 72 74 2b 31 5d 2c 20 69 4c 65 66 74  nStart+1], iLeft
fd90: 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e  Child);.  return
fda0: 20 6e 53 74 61 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   nStart;.}../*.*
fdb0: 2a 20 57 72 69 74 65 20 74 68 65 20 62 75 66 66  * Write the buff
fdc0: 65 72 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65  er for the segme
fdd0: 6e 74 20 6e 6f 64 65 20 70 54 72 65 65 20 61 6e  nt node pTree an
fde0: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 70 65 65  d all of its pee
fdf0: 72 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  rs to the.** dat
fe00: 61 62 61 73 65 2e 20 54 68 65 6e 20 63 61 6c 6c  abase. Then call
fe10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
fe20: 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 77 72  ecursively to wr
fe30: 69 74 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f  ite the parent o
fe40: 66 20 0a 2a 2a 20 70 54 72 65 65 20 61 6e 64 20  f .** pTree and 
fe50: 69 74 73 20 70 65 65 72 73 20 74 6f 20 74 68 65  its peers to the
fe60: 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a   database. .**.*
fe70: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 70 54 72  * Except, if pTr
fe80: 65 65 20 69 73 20 61 20 72 6f 6f 74 20 6e 6f 64  ee is a root nod
fe90: 65 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  e, do not write 
fea0: 69 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  it to the databa
feb0: 73 65 2e 20 49 6e 73 74 65 61 64 2c 0a 2a 2a 20  se. Instead,.** 
fec0: 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69 61  set output varia
fed0: 62 6c 65 73 20 2a 70 61 52 6f 6f 74 20 61 6e 64  bles *paRoot and
fee0: 20 2a 70 6e 52 6f 6f 74 20 74 6f 20 63 6f 6e 74   *pnRoot to cont
fef0: 61 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  ain the root nod
ff00: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
ff10: 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
ff20: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
ff30: 64 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  d output variabl
ff40: 65 20 2a 70 69 4c 61 73 74 20 69 73 0a 2a 2a 20  e *piLast is.** 
ff50: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
ff60: 73 74 20 62 6c 6f 63 6b 69 64 20 77 72 69 74 74  st blockid writt
ff70: 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
ff80: 73 65 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 6e  se (or zero if n
ff90: 6f 0a 2a 2a 20 62 6c 6f 63 6b 73 20 77 65 72 65  o.** blocks were
ffa0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
ffb0: 64 62 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  db). Otherwise, 
ffc0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
ffd0: 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
ffe0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
fff0: 69 6e 74 20 66 74 73 33 4e 6f 64 65 57 72 69 74  int fts3NodeWrit
10000 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
10010 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
10020 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
10030 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
10040 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
10050 54 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Tree,           
10060 20 20 2f 2a 20 53 65 67 6d 65 6e 74 4e 6f 64 65    /* SegmentNode
10070 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
10080 20 69 48 65 69 67 68 74 2c 20 20 20 20 20 20 20   iHeight,       
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100a0 48 65 69 67 68 74 20 6f 66 20 74 68 69 73 20 6e  Height of this n
100b0 6f 64 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a 20  ode in tree */. 
100c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
100d0 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 20 20  Leaf,           
100e0 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20   /* Block id of 
100f0 66 69 72 73 74 20 6c 65 61 66 20 6e 6f 64 65 20  first leaf node 
10100 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
10110 36 34 20 69 46 72 65 65 2c 20 20 20 20 20 20 20  64 iFree,       
10120 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64       /* Block id
10130 20 6f 66 20 6e 65 78 74 20 66 72 65 65 20 73 6c   of next free sl
10140 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  ot in %_segments
10150 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
10160 74 36 34 20 2a 70 69 4c 61 73 74 2c 20 20 20 20  t64 *piLast,    
10170 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c        /* OUT: Bl
10180 6f 63 6b 20 69 64 20 6f 66 20 6c 61 73 74 20 65  ock id of last e
10190 6e 74 72 79 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ntry written */.
101a0 20 20 63 68 61 72 20 2a 2a 70 61 52 6f 6f 74 2c    char **paRoot,
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 2f 2a 20 4f 55 54 3a 20 44 61 74 61 20 66    /* OUT: Data f
101d0 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  or root node */.
101e0 20 20 69 6e 74 20 2a 70 6e 52 6f 6f 74 20 20 20    int *pnRoot   
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
10210 66 20 72 6f 6f 74 20 6e 6f 64 65 20 69 6e 20 62  f root node in b
10220 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
10230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10240 0a 0a 20 20 69 66 28 20 21 70 54 72 65 65 2d 3e  ..  if( !pTree->
10250 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f  pParent ){.    /
10260 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74  * Root node of t
10270 68 65 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20  he tree. */.    
10280 69 6e 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73  int nStart = fts
10290 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28  3TreeFinishNode(
102a0 70 54 72 65 65 2c 20 69 48 65 69 67 68 74 2c 20  pTree, iHeight, 
102b0 69 4c 65 61 66 29 3b 0a 20 20 20 20 2a 70 69 4c  iLeaf);.    *piL
102c0 61 73 74 20 3d 20 69 46 72 65 65 2d 31 3b 0a 20  ast = iFree-1;. 
102d0 20 20 20 2a 70 6e 52 6f 6f 74 20 3d 20 70 54 72     *pnRoot = pTr
102e0 65 65 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61  ee->nData - nSta
102f0 72 74 3b 0a 20 20 20 20 2a 70 61 52 6f 6f 74 20  rt;.    *paRoot 
10300 3d 20 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b  = &pTree->aData[
10310 6e 53 74 61 72 74 5d 3b 0a 20 20 7d 65 6c 73 65  nStart];.  }else
10320 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64  {.    SegmentNod
10330 65 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 73 71  e *pIter;.    sq
10340 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78  lite3_int64 iNex
10350 74 46 72 65 65 20 3d 20 69 46 72 65 65 3b 0a 20  tFree = iFree;. 
10360 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
10370 20 69 4e 65 78 74 4c 65 61 66 20 3d 20 69 4c 65   iNextLeaf = iLe
10380 61 66 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  af;.    for(pIte
10390 72 3d 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f  r=pTree->pLeftmo
103a0 73 74 3b 20 70 49 74 65 72 20 26 26 20 72 63 3d  st; pIter && rc=
103b0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 49 74 65  =SQLITE_OK; pIte
103c0 72 3d 70 49 74 65 72 2d 3e 70 52 69 67 68 74 29  r=pIter->pRight)
103d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 74 61  {.      int nSta
103e0 72 74 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e  rt = fts3TreeFin
103f0 69 73 68 4e 6f 64 65 28 70 49 74 65 72 2c 20 69  ishNode(pIter, i
10400 48 65 69 67 68 74 2c 20 69 4e 65 78 74 4c 65 61  Height, iNextLea
10410 66 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57  f);.      int nW
10420 72 69 74 65 20 3d 20 70 49 74 65 72 2d 3e 6e 44  rite = pIter->nD
10430 61 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20  ata - nStart;.  
10440 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
10450 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  WriteSegment(p, 
10460 69 4e 65 78 74 46 72 65 65 2c 20 26 70 49 74 65  iNextFree, &pIte
10470 72 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d  r->aData[nStart]
10480 2c 20 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20  , nWrite);.     
10490 20 69 4e 65 78 74 46 72 65 65 2b 2b 3b 0a 20 20   iNextFree++;.  
104a0 20 20 20 20 69 4e 65 78 74 4c 65 61 66 20 2b 3d      iNextLeaf +=
104b0 20 28 70 49 74 65 72 2d 3e 6e 45 6e 74 72 79 2b   (pIter->nEntry+
104c0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
104d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
104e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
104f0 20 69 4e 65 78 74 4c 65 61 66 3d 3d 69 46 72 65   iNextLeaf==iFre
10500 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  e );.      rc = 
10510 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20  fts3NodeWrite(. 
10520 20 20 20 20 20 20 20 20 20 70 2c 20 70 54 72 65           p, pTre
10530 65 2d 3e 70 50 61 72 65 6e 74 2c 20 69 48 65 69  e->pParent, iHei
10540 67 68 74 2b 31 2c 20 69 46 72 65 65 2c 20 69 4e  ght+1, iFree, iN
10550 65 78 74 46 72 65 65 2c 20 70 69 4c 61 73 74 2c  extFree, piLast,
10560 20 70 61 52 6f 6f 74 2c 20 70 6e 52 6f 6f 74 0a   paRoot, pnRoot.
10570 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
10580 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
10590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
105a0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ll memory alloca
105b0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
105c0 20 77 69 74 68 20 74 68 65 20 74 72 65 65 20 70   with the tree p
105d0 54 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Tree..*/.static 
105e0 76 6f 69 64 20 66 74 73 33 4e 6f 64 65 46 72 65  void fts3NodeFre
105f0 65 28 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70  e(SegmentNode *p
10600 54 72 65 65 29 7b 0a 20 20 69 66 28 20 70 54 72  Tree){.  if( pTr
10610 65 65 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e  ee ){.    Segmen
10620 74 4e 6f 64 65 20 2a 70 20 3d 20 70 54 72 65 65  tNode *p = pTree
10630 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20  ->pLeftmost;.   
10640 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28 70 2d   fts3NodeFree(p-
10650 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 77  >pParent);.    w
10660 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20  hile( p ){.     
10670 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52   SegmentNode *pR
10680 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74  ight = p->pRight
10690 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
106a0 44 61 74 61 21 3d 28 63 68 61 72 20 2a 29 26 70  Data!=(char *)&p
106b0 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [1] ){.        s
106c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
106d0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
106e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
106f0 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 4d 61  ght==0 || p->zMa
10700 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lloc==0 );.     
10710 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
10720 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
10730 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
10740 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 52 69 67  ;.      p = pRig
10750 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ht;.    }.  }.}.
10760 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72  ./*.** Add a ter
10770 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  m to the segment
10780 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
10790 65 64 20 62 79 20 74 68 65 20 53 65 67 6d 65 6e  ed by the Segmen
107a0 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a  tWriter object.*
107b0 2a 20 2a 70 70 57 72 69 74 65 72 2e 20 57 68 65  * *ppWriter. Whe
107c0 6e 20 61 64 64 69 6e 67 20 74 68 65 20 66 69 72  n adding the fir
107d0 73 74 20 74 65 72 6d 20 74 6f 20 61 20 73 65 67  st term to a seg
107e0 6d 65 6e 74 2c 20 2a 70 70 57 72 69 74 65 72 20  ment, *ppWriter 
107f0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 70 61 73  should.** be pas
10800 73 65 64 20 4e 55 4c 4c 2e 20 54 68 69 73 20 66  sed NULL. This f
10810 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 6c 6c  unction will all
10820 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65 67 6d  ocate a new Segm
10830 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74  entWriter object
10840 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 69  .** and return i
10850 74 20 76 69 61 20 74 68 65 20 69 6e 70 75 74 2f  t via the input/
10860 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
10870 2a 70 70 57 72 69 74 65 72 20 69 6e 20 74 68 69  *ppWriter in thi
10880 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
10890 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
108a0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
108b0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
108c0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
108d0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
108e0 6e 74 20 66 74 73 33 53 65 67 57 72 69 74 65 72  nt fts3SegWriter
108f0 41 64 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65  Add(.  Fts3Table
10900 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10910 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
10920 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
10930 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65  /.  SegmentWrite
10940 72 20 2a 2a 70 70 57 72 69 74 65 72 2c 20 20 20  r **ppWriter,   
10950 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
10960 65 67 6d 65 6e 74 57 72 69 74 65 72 20 68 61 6e  egmentWriter han
10970 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73  dle */ .  int is
10980 43 6f 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20  CopyTerm,       
10990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
109a0 65 20 69 66 20 62 75 66 66 65 72 20 7a 54 65 72  e if buffer zTer
109b0 6d 20 6d 75 73 74 20 62 65 20 63 6f 70 69 65 64  m must be copied
109c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
109d0 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
109e0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
109f0 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
10a00 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20  ining term */.  
10a10 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
10a40 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f  in bytes */.  co
10a50 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  nst char *aDocli
10a60 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st,           /*
10a70 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
10a80 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f  er containing do
10a90 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  clist */.  int n
10aa0 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20  Doclist         
10ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10ac0 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e  ze of doclist in
10ad0 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
10ae0 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20  nt nPrefix;     
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10b00 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70  * Size of term p
10b10 72 65 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a  refix in bytes *
10b20 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b  /.  int nSuffix;
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10b50 65 72 6d 20 73 75 66 66 69 78 20 69 6e 20 62 79  erm suffix in by
10b60 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  tes */.  int nRe
10b70 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
10b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10b90 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
10ba0 69 72 65 64 20 6f 6e 20 6c 65 61 66 20 70 61 67  ired on leaf pag
10bb0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  e */.  int nData
10bc0 3b 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65  ;.  SegmentWrite
10bd0 72 20 2a 70 57 72 69 74 65 72 20 3d 20 2a 70 70  r *pWriter = *pp
10be0 57 72 69 74 65 72 3b 0a 0a 20 20 69 66 28 20 21  Writer;..  if( !
10bf0 70 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20 69  pWriter ){.    i
10c00 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  nt rc;.    sqlit
10c10 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10c20 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
10c30 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74   the SegmentWrit
10c40 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
10c50 20 20 20 20 70 57 72 69 74 65 72 20 3d 20 28 53      pWriter = (S
10c60 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 29 73  egmentWriter *)s
10c70 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
10c80 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57 72 69 74  zeof(SegmentWrit
10c90 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  er));.    if( !p
10ca0 57 72 69 74 65 72 20 29 20 72 65 74 75 72 6e 20  Writer ) return 
10cb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10cc0 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72    memset(pWriter
10cd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d  , 0, sizeof(Segm
10ce0 65 6e 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20  entWriter));.   
10cf0 20 2a 70 70 57 72 69 74 65 72 20 3d 20 70 57 72   *ppWriter = pWr
10d00 69 74 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  iter;..    /* Al
10d10 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
10d20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 63 63 75  in which to accu
10d30 6d 75 6c 61 74 65 20 64 61 74 61 20 2a 2f 0a 20  mulate data */. 
10d40 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74     pWriter->aDat
10d50 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  a = (char *)sqli
10d60 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 4e  te3_malloc(p->nN
10d70 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  odeSize);.    if
10d80 28 20 21 70 57 72 69 74 65 72 2d 3e 61 44 61 74  ( !pWriter->aDat
10d90 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  a ) return SQLIT
10da0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72  E_NOMEM;.    pWr
10db0 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 70 2d  iter->nSize = p-
10dc0 3e 6e 4e 6f 64 65 53 69 7a 65 3b 0a 0a 20 20 20  >nNodeSize;..   
10dd0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
10de0 74 20 66 72 65 65 20 62 6c 6f 63 6b 69 64 20 69  t free blockid i
10df0 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  n the %_segments
10e00 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63   table */.    rc
10e10 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
10e20 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45  , SQL_NEXT_SEGME
10e30 4e 54 53 5f 49 44 2c 20 26 70 53 74 6d 74 2c 20  NTS_ID, &pStmt, 
10e40 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
10e50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
10e60 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 53  rn rc;.    if( S
10e70 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
10e80 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
10e90 7b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  {.      pWriter-
10ea0 3e 69 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >iFree = sqlite3
10eb0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
10ec0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  tmt, 0);.      p
10ed0 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74 20 3d  Writer->iFirst =
10ee0 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b   pWriter->iFree;
10ef0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10f00 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
10f10 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tmt);.    if( rc
10f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
10f30 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e  turn rc;.  }.  n
10f40 44 61 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e  Data = pWriter->
10f50 6e 44 61 74 61 3b 0a 0a 20 20 6e 50 72 65 66 69  nData;..  nPrefi
10f60 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f  x = fts3PrefixCo
10f70 6d 70 72 65 73 73 28 70 57 72 69 74 65 72 2d 3e  mpress(pWriter->
10f80 7a 54 65 72 6d 2c 20 70 57 72 69 74 65 72 2d 3e  zTerm, pWriter->
10f90 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  nTerm, zTerm, nT
10fa0 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78 20  erm);.  nSuffix 
10fb0 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b  = nTerm-nPrefix;
10fc0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
10fd0 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
10fe0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 62 79   are required by
10ff0 20 74 68 69 73 20 6e 65 77 20 65 6e 74 72 79 20   this new entry 
11000 2a 2f 0a 20 20 6e 52 65 71 20 3d 20 73 71 6c 69  */.  nReq = sqli
11010 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
11020 28 6e 50 72 65 66 69 78 29 20 2b 20 20 20 20 2f  (nPrefix) +    /
11030 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  * varint contain
11040 69 6e 67 20 70 72 65 66 69 78 20 73 69 7a 65 20  ing prefix size 
11050 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  */.    sqlite3Ft
11060 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66  s3VarintLen(nSuf
11070 66 69 78 29 20 2b 20 20 20 20 20 20 20 20 20 2f  fix) +         /
11080 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  * varint contain
11090 69 6e 67 20 73 75 66 66 69 78 20 73 69 7a 65 20  ing suffix size 
110a0 2a 2f 0a 20 20 20 20 6e 53 75 66 66 69 78 20 2b  */.    nSuffix +
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
110d0 2a 20 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f  * Term suffix */
110e0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
110f0 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69  VarintLen(nDocli
11100 73 74 29 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  st) +        /* 
11110 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
11120 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b  */.    nDoclist;
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11150 2a 20 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a  * Doclist data *
11160 2f 0a 0a 20 20 69 66 28 20 6e 44 61 74 61 3e 30  /..  if( nData>0
11170 20 26 26 20 6e 44 61 74 61 2b 6e 52 65 71 3e 70   && nData+nReq>p
11180 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20  ->nNodeSize ){. 
11190 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
111a0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  /* The current l
111b0 65 61 66 20 6e 6f 64 65 20 69 73 20 66 75 6c 6c  eaf node is full
111c0 2e 20 57 72 69 74 65 20 69 74 20 6f 75 74 20 74  . Write it out t
111d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
111e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
111f0 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  WriteSegment(p, 
11200 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b  pWriter->iFree++
11210 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  , pWriter->aData
11220 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66  , nData);.    if
11230 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11240 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
11250 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63 75 72    /* Add the cur
11260 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74 68 65  rent term to the
11270 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 74   interior node t
11280 72 65 65 2e 20 54 68 65 20 74 65 72 6d 20 61 64  ree. The term ad
11290 64 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ded to.    ** th
112a0 65 20 69 6e 74 65 72 69 6f 72 20 74 72 65 65 20  e interior tree 
112b0 6d 75 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  must:.    **.   
112c0 20 2a 2a 20 20 20 61 29 20 62 65 20 67 72 65 61   **   a) be grea
112d0 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ter than the lar
112e0 67 65 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  gest term on the
112f0 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73 74 20   leaf node just 
11300 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 20  written.    **  
11310 20 20 20 20 74 6f 20 74 68 65 20 64 61 74 61 62      to the datab
11320 61 73 65 20 28 73 74 69 6c 6c 20 61 76 61 69 6c  ase (still avail
11330 61 62 6c 65 20 69 6e 20 70 57 72 69 74 65 72 2d  able in pWriter-
11340 3e 7a 54 65 72 6d 29 2c 20 61 6e 64 0a 20 20 20  >zTerm), and.   
11350 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29 20   **.    **   b) 
11360 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
11370 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65 72  equal to the ter
11380 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61 64  m about to be ad
11390 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a 20  ded to the new. 
113a0 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66 20     **      leaf 
113b0 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65 72  node (zTerm/nTer
113c0 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  m)..    **.    *
113d0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
113e0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65  , it must be the
113f0 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72 6d   prefix of zTerm
11400 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 74   1 byte longer t
11410 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  han.    ** the c
11420 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66  ommon prefix (if
11430 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20 61   any) of zTerm a
11440 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  nd pWriter->zTer
11450 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  m..    */.    as
11460 73 65 72 74 28 20 6e 50 72 65 66 69 78 3c 6e 54  sert( nPrefix<nT
11470 65 72 6d 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  erm );.    rc = 
11480 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28  fts3NodeAddTerm(
11490 70 2c 20 26 70 57 72 69 74 65 72 2d 3e 70 54 72  p, &pWriter->pTr
114a0 65 65 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20  ee, isCopyTerm, 
114b0 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31  zTerm, nPrefix+1
114c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
114d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
114e0 6e 20 72 63 3b 0a 0a 20 20 20 20 6e 44 61 74 61  n rc;..    nData
114f0 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65   = 0;.    pWrite
11500 72 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 0a 20  r->nTerm = 0;.. 
11510 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a     nPrefix = 0;.
11520 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
11530 65 72 6d 3b 0a 20 20 20 20 6e 52 65 71 20 3d 20  erm;.    nReq = 
11540 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11560 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61   /* varint conta
11570 69 6e 69 6e 67 20 70 72 65 66 69 78 20 73 69 7a  ining prefix siz
11580 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
11590 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
115a0 6e 54 65 72 6d 29 20 2b 20 20 20 20 20 20 20 20  nTerm) +        
115b0 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61   /* varint conta
115c0 69 6e 69 6e 67 20 73 75 66 66 69 78 20 73 69 7a  ining suffix siz
115d0 65 20 2a 2f 0a 20 20 20 20 20 20 6e 54 65 72 6d  e */.      nTerm
115e0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 2f 2a 20 54 65 72 6d 20 73 75 66 66 69 78 20   /* Term suffix 
11610 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
11620 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44  Fts3VarintLen(nD
11630 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20 20 2f  oclist) +      /
11640 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
11650 74 20 2a 2f 0a 20 20 20 20 20 20 6e 44 6f 63 6c  t */.      nDocl
11660 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64 61 74 61   /* Doclist data
11690 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   */.  }..  /* If
116a0 20 74 68 65 20 62 75 66 66 65 72 20 63 75 72 72   the buffer curr
116b0 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ently allocated 
116c0 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
116d0 20 74 68 69 73 20 65 6e 74 72 79 2c 20 72 65 61   this entry, rea
116e0 6c 6c 6f 63 0a 20 20 2a 2a 20 74 68 65 20 62 75  lloc.  ** the bu
116f0 66 66 65 72 20 74 6f 20 6d 61 6b 65 20 69 74 20  ffer to make it 
11700 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 0a 20 20  large enough..  
11710 2a 2f 0a 20 20 69 66 28 20 6e 52 65 71 3e 70 57  */.  if( nReq>pW
11720 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 7b 0a  riter->nSize ){.
11730 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 20 3d      char *aNew =
11740 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
11750 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c  (pWriter->aData,
11760 20 6e 52 65 71 29 3b 0a 20 20 20 20 69 66 28 20   nReq);.    if( 
11770 21 61 4e 65 77 20 29 20 72 65 74 75 72 6e 20 53  !aNew ) return S
11780 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11790 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20   pWriter->aData 
117a0 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 57 72 69  = aNew;.    pWri
117b0 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 6e 52 65  ter->nSize = nRe
117c0 71 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  q;.  }.  assert(
117d0 20 6e 44 61 74 61 2b 6e 52 65 71 3c 3d 70 57 72   nData+nReq<=pWr
117e0 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 3b 0a 0a  iter->nSize );..
117f0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
11800 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65  prefix-compresse
11810 64 20 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c 69  d term and docli
11820 73 74 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  st to the buffer
11830 2e 20 2a 2f 0a 20 20 6e 44 61 74 61 20 2b 3d 20  . */.  nData += 
11840 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
11850 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61  rint(&pWriter->a
11860 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72  Data[nData], nPr
11870 65 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b  efix);.  nData +
11880 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
11890 56 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d  Varint(&pWriter-
118a0 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e  >aData[nData], n
118b0 53 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63 70  Suffix);.  memcp
118c0 79 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74  y(&pWriter->aDat
118d0 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d  a[nData], &zTerm
118e0 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66  [nPrefix], nSuff
118f0 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20  ix);.  nData += 
11900 6e 53 75 66 66 69 78 3b 0a 20 20 6e 44 61 74 61  nSuffix;.  nData
11910 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
11920 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74 65  utVarint(&pWrite
11930 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c  r->aData[nData],
11940 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 6d 65   nDoclist);.  me
11950 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d 3e 61  mcpy(&pWriter->a
11960 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 61 44 6f  Data[nData], aDo
11970 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29  clist, nDoclist)
11980 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  ;.  pWriter->nDa
11990 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 44 6f  ta = nData + nDo
119a0 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 53 61 76  clist;..  /* Sav
119b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  e the current te
119c0 72 6d 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  rm so that it ca
119d0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 72 65  n be used to pre
119e0 66 69 78 2d 63 6f 6d 70 72 65 73 73 20 74 68 65  fix-compress the
119f0 20 6e 65 78 74 2e 0a 20 20 2a 2a 20 49 66 20 74   next..  ** If t
11a00 68 65 20 69 73 43 6f 70 79 54 65 72 6d 20 70 61  he isCopyTerm pa
11a10 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c  rameter is true,
11a20 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
11a30 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 20   pointed to by. 
11a40 20 2a 2a 20 7a 54 65 72 6d 20 69 73 20 74 72 61   ** zTerm is tra
11a50 6e 73 69 65 6e 74 2c 20 73 6f 20 74 61 6b 65 20  nsient, so take 
11a60 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74 65  a copy of the te
11a70 72 6d 20 64 61 74 61 2e 20 4f 74 68 65 72 77 69  rm data. Otherwi
11a80 73 65 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 73 74  se, just.  ** st
11a90 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ore a copy of th
11aa0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
11ab0 20 20 69 66 28 20 69 73 43 6f 70 79 54 65 72 6d    if( isCopyTerm
11ac0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 65 72   ){.    if( nTer
11ad0 6d 3e 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c  m>pWriter->nMall
11ae0 6f 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  oc ){.      char
11af0 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *zNew = sqlite3
11b00 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72  _realloc(pWriter
11b10 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d  ->zMalloc, nTerm
11b20 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  *2);.      if( !
11b30 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  zNew ){.        
11b40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11b50 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
11b60 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c     pWriter->nMal
11b70 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20  loc = nTerm*2;. 
11b80 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 4d       pWriter->zM
11b90 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20  alloc = zNew;.  
11ba0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54 65      pWriter->zTe
11bb0 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 7d  rm = zNew;.    }
11bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 72  .    assert( pWr
11bd0 69 74 65 72 2d 3e 7a 54 65 72 6d 3d 3d 70 57 72  iter->zTerm==pWr
11be0 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b  iter->zMalloc );
11bf0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 72 69  .    memcpy(pWri
11c00 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72  ter->zTerm, zTer
11c10 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  m, nTerm);.  }el
11c20 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  se{.    pWriter-
11c30 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a  >zTerm = (char *
11c40 29 7a 54 65 72 6d 3b 0a 20 20 7d 0a 20 20 70 57  )zTerm;.  }.  pW
11c50 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e  riter->nTerm = n
11c60 54 65 72 6d 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Term;..  return 
11c70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11c80 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 64 61  .** Flush all da
11c90 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
11ca0 74 68 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72  th the SegmentWr
11cb0 69 74 65 72 20 6f 62 6a 65 63 74 20 70 57 72 69  iter object pWri
11cc0 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ter to the.** da
11cd0 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75 6e  tabase. This fun
11ce0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 63 61  ction must be ca
11cf0 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20 74  lled after all t
11d00 65 72 6d 73 20 68 61 76 65 20 62 65 65 6e 20 61  erms have been a
11d10 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73  dded.** to the s
11d20 65 67 6d 65 6e 74 20 75 73 69 6e 67 20 66 74 73  egment using fts
11d30 33 53 65 67 57 72 69 74 65 72 41 64 64 28 29 2e  3SegWriterAdd().
11d40 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
11d50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20  SQLITE_OK is.** 
11d60 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
11d70 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
11d80 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
11d90 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
11da0 57 72 69 74 65 72 46 6c 75 73 68 28 0a 20 20 46  WriterFlush(.  F
11db0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11dd0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
11de0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d  handle */.  Segm
11df0 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74  entWriter *pWrit
11e00 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  er,         /* S
11e10 65 67 6d 65 6e 74 57 72 69 74 65 72 20 74 6f 20  egmentWriter to 
11e20 66 6c 75 73 68 20 74 6f 20 74 68 65 20 64 62 20  flush to the db 
11e30 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
11e60 72 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e  r 'level' column
11e70 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a   of %_segdir */.
11e80 20 20 69 6e 74 20 69 49 64 78 20 20 20 20 20 20    int iIdx      
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ea0 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 27    /* Value for '
11eb0 69 64 78 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25  idx' column of %
11ec0 5f 73 65 67 64 69 72 20 2a 2f 0a 29 7b 0a 20 20  _segdir */.){.  
11ed0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
11f00 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
11f10 3e 70 54 72 65 65 20 29 7b 0a 20 20 20 20 73 71  >pTree ){.    sq
11f20 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73  lite3_int64 iLas
11f30 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c  t = 0;      /* L
11f40 61 72 67 65 73 74 20 62 6c 6f 63 6b 20 69 64 20  argest block id 
11f50 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
11f60 61 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ase */.    sqlit
11f70 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 4c 65  e3_int64 iLastLe
11f80 61 66 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72 67  af;      /* Larg
11f90 65 73 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 69  est leaf block i
11fa0 64 20 77 72 69 74 74 65 6e 20 74 6f 20 64 62 20  d written to db 
11fb0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 6f  */.    char *zRo
11fc0 6f 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ot = NULL;      
11fd0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
11fe0 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
11ff0 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a  ning root node *
12000 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20  /.    int nRoot 
12010 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12020 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
12030 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 0a  uffer zRoot */..
12040 20 20 20 20 69 4c 61 73 74 4c 65 61 66 20 3d 20      iLastLeaf = 
12050 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a  pWriter->iFree;.
12060 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69      rc = fts3Wri
12070 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72  teSegment(p, pWr
12080 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70  iter->iFree++, p
12090 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 70  Writer->aData, p
120a0 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b 0a  Writer->nData);.
120b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
120c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
120d0 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69 74  c = fts3NodeWrit
120e0 65 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 70 54  e(p, pWriter->pT
120f0 72 65 65 2c 20 31 2c 0a 20 20 20 20 20 20 20 20  ree, 1,.        
12100 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73    pWriter->iFirs
12110 74 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65  t, pWriter->iFre
12120 65 2c 20 26 69 4c 61 73 74 2c 20 26 7a 52 6f 6f  e, &iLast, &zRoo
12130 74 2c 20 26 6e 52 6f 6f 74 29 3b 0a 20 20 20 20  t, &nRoot);.    
12140 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
12150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12160 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
12170 65 67 64 69 72 28 0a 20 20 20 20 20 20 20 20 20  egdir(.         
12180 20 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78   p, iLevel, iIdx
12190 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73  , pWriter->iFirs
121a0 74 2c 20 69 4c 61 73 74 4c 65 61 66 2c 20 69 4c  t, iLastLeaf, iL
121b0 61 73 74 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f  ast, zRoot, nRoo
121c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
121d0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 6e  e{.    /* The en
121e0 74 69 72 65 20 74 72 65 65 20 66 69 74 73 20 6f  tire tree fits o
121f0 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  n the root node.
12200 20 57 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   Write it to the
12210 20 73 65 67 64 69 72 20 74 61 62 6c 65 2e 20 2a   segdir table. *
12220 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57  /.    rc = fts3W
12230 72 69 74 65 53 65 67 64 69 72 28 0a 20 20 20 20  riteSegdir(.    
12240 20 20 20 20 70 2c 20 69 4c 65 76 65 6c 2c 20 69      p, iLevel, i
12250 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 70 57  Idx, 0, 0, 0, pW
12260 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 70 57  riter->aData, pW
12270 72 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20  riter->nData);. 
12280 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12290 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
122a0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 68 65 6c 64   all memory held
122b0 20 62 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57   by the SegmentW
122c0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 70 61 73  riter object pas
122d0 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 66  sed as the .** f
122e0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
122f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
12300 73 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28  s3SegWriterFree(
12310 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70  SegmentWriter *p
12320 57 72 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70  Writer){.  if( p
12330 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Writer ){.    sq
12340 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74  lite3_free(pWrit
12350 65 72 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  er->aData);.    
12360 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
12370 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  iter->zMalloc);.
12380 20 20 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65      fts3NodeFree
12390 28 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 29  (pWriter->pTree)
123a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
123b0 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20 20 7d  ee(pWriter);.  }
123c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
123d0 72 73 74 20 76 61 6c 75 65 20 69 6e 20 74 68 65  rst value in the
123e0 20 61 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69   apVal[] array i
123f0 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
12400 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
12410 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12420 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65  n tests if there
12430 20 65 78 69 73 74 20 61 6e 79 20 64 6f 63 75 6d   exist any docum
12440 65 6e 74 73 20 77 69 74 68 20 64 6f 63 69 64 20  ents with docid 
12450 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 61  values that.** a
12460 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  re different fro
12470 6d 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 20  m that integer. 
12480 69 2e 65 2e 20 69 66 20 64 65 6c 65 74 69 6e 67  i.e. if deleting
12490 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
124a0 74 68 20 64 6f 63 69 64 0a 2a 2a 20 70 52 6f 77  th docid.** pRow
124b0 69 64 20 77 6f 75 6c 64 20 6d 65 61 6e 20 74 68  id would mean th
124c0 65 20 46 54 53 33 20 74 61 62 6c 65 20 77 65 72  e FTS3 table wer
124d0 65 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  e empty..**.** I
124e0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
124f0 69 73 45 6d 70 74 79 20 69 73 20 73 65 74 20 74  isEmpty is set t
12500 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  o true if the ta
12510 62 6c 65 20 69 73 20 65 6d 70 74 79 20 65 78 63  ble is empty exc
12520 65 70 74 20 66 6f 72 0a 2a 2a 20 64 6f 63 75 6d  ept for.** docum
12530 65 6e 74 20 70 52 6f 77 69 64 2c 20 6f 72 20 66  ent pRowid, or f
12540 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2c 20  alse otherwise, 
12550 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
12560 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
12570 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
12580 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
12590 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
125a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
125b0 74 20 66 74 73 33 49 73 45 6d 70 74 79 28 46 74  t fts3IsEmpty(Ft
125c0 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69  s3Table *p, sqli
125d0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69  te3_value *pRowi
125e0 64 2c 20 69 6e 74 20 2a 70 69 73 45 6d 70 74 79  d, int *pisEmpty
125f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
12600 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
12610 72 63 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53  rc;.  rc = fts3S
12620 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 53  qlStmt(p, SQL_IS
12630 5f 45 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c 20  _EMPTY, &pStmt, 
12640 26 70 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20  &pRowid);.  if( 
12650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12660 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
12670 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
12680 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
12690 20 20 2a 70 69 73 45 6d 70 74 79 20 3d 20 73 71    *pisEmpty = sq
126a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
126b0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
126c0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
126d0 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
126e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
12700 70 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c 61 72  pnMax to the lar
12710 67 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65 76  gest segment lev
12720 65 6c 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  el in the databa
12730 73 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  se for the index
12740 0a 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  .** iIndex..**.*
12750 2a 20 53 65 67 6d 65 6e 74 20 6c 65 76 65 6c 73  * Segment levels
12760 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
12770 68 65 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d  he 'level' colum
12780 6e 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69  n of the %_segdi
12790 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  r table..**.** R
127a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
127b0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
127c0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
127d0 72 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a 2a  r code if not..*
127e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
127f0 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c  3SegmentMaxLevel
12800 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69  (Fts3Table *p, i
12810 6e 74 20 69 49 6e 64 65 78 2c 20 69 6e 74 20 2a  nt iIndex, int *
12820 70 6e 4d 61 78 29 7b 0a 20 20 73 71 6c 69 74 65  pnMax){.  sqlite
12830 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
12840 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
12850 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20  t( iIndex>=0 && 
12860 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78  iIndex<p->nIndex
12870 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 70 53   );..  /* Set pS
12880 74 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d 70 69  tmt to the compi
12890 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 3a 0a  led version of:.
128a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45    **.  **   SELE
128b0 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20 46 52  CT max(level) FR
128c0 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
128d0 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  ' WHERE level BE
128e0 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a 20 20  TWEEN ? AND ?.  
128f0 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20 69 73  **.  ** (1024 is
12900 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20 76 61   actually the va
12910 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53  lue of macro FTS
12920 33 5f 53 45 47 44 49 52 5f 50 52 45 46 49 58 4c  3_SEGDIR_PREFIXL
12930 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a 2f 0a  EVEL_STR)..  */.
12940 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
12950 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
12960 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45  _SEGDIR_MAX_LEVE
12970 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  L, &pStmt, 0);. 
12980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12990 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
129a0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
129b0 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 69 49 6e  nt(pStmt, 1, iIn
129c0 64 65 78 2a 46 54 53 33 5f 53 45 47 44 49 52 5f  dex*FTS3_SEGDIR_
129d0 4d 41 58 4c 45 56 45 4c 29 3b 0a 20 20 73 71 6c  MAXLEVEL);.  sql
129e0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
129f0 74 6d 74 2c 20 32 2c 20 28 69 49 6e 64 65 78 2b  tmt, 2, (iIndex+
12a00 31 29 2a 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  1)*FTS3_SEGDIR_M
12a10 41 58 4c 45 56 45 4c 20 2d 20 31 29 3b 0a 20 20  AXLEVEL - 1);.  
12a20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
12a30 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
12a40 6d 74 29 20 29 7b 0a 20 20 20 20 2a 70 6e 4d 61  mt) ){.    *pnMa
12a50 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
12a60 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
12a70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
12a80 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
12a90 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  mt);.}../*.** Th
12aa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12ab0 73 65 64 20 61 66 74 65 72 20 6d 65 72 67 69 6e  sed after mergin
12ac0 67 20 6d 75 6c 74 69 70 6c 65 20 73 65 67 6d 65  g multiple segme
12ad0 6e 74 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  nts into a singl
12ae0 65 20 6c 61 72 67 65 0a 2a 2a 20 73 65 67 6d 65  e large.** segme
12af0 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  nt to delete the
12b00 20 6f 6c 64 2c 20 6e 6f 77 20 72 65 64 75 6e 64   old, now redund
12b10 61 6e 74 2c 20 73 65 67 6d 65 6e 74 20 62 2d 74  ant, segment b-t
12b20 72 65 65 73 2e 20 53 70 65 63 69 66 69 63 61 6c  rees. Specifical
12b30 6c 79 2c 0a 2a 2a 20 69 74 3a 0a 2a 2a 20 0a 2a  ly,.** it:.** .*
12b40 2a 20 20 20 31 29 20 44 65 6c 65 74 65 73 20 61  *   1) Deletes a
12b50 6c 6c 20 25 5f 73 65 67 6d 65 6e 74 73 20 65 6e  ll %_segments en
12b60 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 73 65  tries for the se
12b70 67 6d 65 6e 74 73 20 61 73 73 6f 63 69 61 74 65  gments associate
12b80 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 20 20  d with .**      
12b90 65 61 63 68 20 6f 66 20 74 68 65 20 53 65 67 52  each of the SegR
12ba0 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69 6e  eader objects in
12bb0 20 74 68 65 20 61 72 72 61 79 20 70 61 73 73 65   the array passe
12bc0 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20 0a  d as the third .
12bd0 2a 2a 20 20 20 20 20 20 61 72 67 75 6d 65 6e 74  **      argument
12be0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29  , and.**.**   2)
12bf0 20 64 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73   deletes all %_s
12c00 65 67 64 69 72 20 65 6e 74 72 69 65 73 20 77 69  egdir entries wi
12c10 74 68 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2c  th level iLevel,
12c20 20 6f 72 20 61 6c 6c 20 25 5f 73 65 67 64 69 72   or all %_segdir
12c30 0a 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73  .**      entries
12c40 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6c   regardless of l
12c50 65 76 65 6c 20 69 66 20 28 69 4c 65 76 65 6c 3c  evel if (iLevel<
12c60 30 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  0)..**.** SQLITE
12c70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
12c80 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
12c90 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
12ca0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
12cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
12cc0 33 44 65 6c 65 74 65 53 65 67 64 69 72 28 0a 20  3DeleteSegdir(. 
12cd0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cf0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
12d00 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
12d10 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20  t iIndex,       
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d30 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49   Index for p->aI
12d40 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndex */.  int iL
12d50 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
12d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
12d70 65 6c 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65  el of %_segdir e
12d80 6e 74 72 69 65 73 20 74 6f 20 64 65 6c 65 74 65  ntries to delete
12d90 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61   */.  Fts3SegRea
12da0 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c  der **apSegment,
12db0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
12dc0 66 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65  f SegReader obje
12dd0 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  cts */.  int nRe
12de0 61 64 65 72 20 20 20 20 20 20 20 20 20 20 20 20  ader            
12df0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12e00 20 6f 66 20 61 72 72 61 79 20 61 70 53 65 67 6d   of array apSegm
12e10 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
12e20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
12e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12e40 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
12e50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
12e80 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
12e90 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b  3_stmt *pDelete;
12ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
12eb0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65   statement to de
12ec0 6c 65 74 65 20 72 6f 77 73 20 2a 2f 0a 0a 20 20  lete rows */..  
12ed0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
12ee0 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
12ef0 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26  EGMENTS_RANGE, &
12f00 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 66  pDelete, 0);.  f
12f10 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
12f20 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64  TE_OK && i<nRead
12f30 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  er; i++){.    Ft
12f40 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
12f50 67 6d 65 6e 74 20 3d 20 61 70 53 65 67 6d 65 6e  gment = apSegmen
12f60 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  t[i];.    if( pS
12f70 65 67 6d 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c  egment->iStartBl
12f80 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ock ){.      sql
12f90 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
12fa0 70 44 65 6c 65 74 65 2c 20 31 2c 20 70 53 65 67  pDelete, 1, pSeg
12fb0 6d 65 6e 74 2d 3e 69 53 74 61 72 74 42 6c 6f 63  ment->iStartBloc
12fc0 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
12fd0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65  3_bind_int64(pDe
12fe0 6c 65 74 65 2c 20 32 2c 20 70 53 65 67 6d 65 6e  lete, 2, pSegmen
12ff0 74 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20  t->iEndBlock);. 
13000 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
13010 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20  p(pDelete);.    
13020 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
13030 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20  eset(pDelete);. 
13040 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
13050 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13060 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13070 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c   }..  assert( iL
13080 65 76 65 6c 3e 3d 30 20 7c 7c 20 69 4c 65 76 65  evel>=0 || iLeve
13090 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
130a0 52 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 69  R_ALL );.  if( i
130b0 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
130c0 55 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20  URSOR_ALL ){.   
130d0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
130e0 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f  t(p, SQL_DELETE_
130f0 53 45 47 44 49 52 5f 52 41 4e 47 45 2c 20 26 70  SEGDIR_RANGE, &p
13100 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20  Delete, 0);.    
13110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13120 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
13130 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c  e3_bind_int(pDel
13140 65 74 65 2c 20 31 2c 20 69 49 6e 64 65 78 2a 46  ete, 1, iIndex*F
13150 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
13160 56 45 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  VEL);.      sqli
13170 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 44 65  te3_bind_int(pDe
13180 6c 65 74 65 2c 20 32 2c 20 28 69 49 6e 64 65 78  lete, 2, (iIndex
13190 2b 31 29 20 2a 20 46 54 53 33 5f 53 45 47 44 49  +1) * FTS3_SEGDI
131a0 52 5f 4d 41 58 4c 45 56 45 4c 20 2d 20 31 29 3b  R_MAXLEVEL - 1);
131b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
131c0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
131d0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
131e0 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c 2c  TE_SEGDIR_LEVEL,
131f0 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20   &pDelete, 0);. 
13200 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13220 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
13230 44 65 6c 65 74 65 2c 20 31 2c 20 69 49 6e 64 65  Delete, 1, iInde
13240 78 2a 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  x*FTS3_SEGDIR_MA
13250 58 4c 45 56 45 4c 20 2b 20 69 4c 65 76 65 6c 29  XLEVEL + iLevel)
13260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
13270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13280 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13290 73 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20  step(pDelete);. 
132a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
132b0 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a  reset(pDelete);.
132c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
132d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
132e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
132f0 20 63 61 6c 6c 65 64 2c 20 62 75 66 66 65 72 20   called, buffer 
13300 2a 70 70 4c 69 73 74 20 28 73 69 7a 65 20 2a 70  *ppList (size *p
13310 6e 4c 69 73 74 20 62 79 74 65 73 29 20 63 6f 6e  nList bytes) con
13320 74 61 69 6e 73 20 0a 2a 2a 20 61 20 70 6f 73 69  tains .** a posi
13330 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 6d  tion list that m
13340 61 79 20 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20  ay (or may not) 
13350 66 65 61 74 75 72 65 20 6d 75 6c 74 69 70 6c 65  feature multiple
13360 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 0a 2a   columns. This.*
13370 2a 20 66 75 6e 63 74 69 6f 6e 20 61 64 6a 75 73  * function adjus
13380 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 2a  ts the pointer *
13390 70 70 4c 69 73 74 20 61 6e 64 20 74 68 65 20 6c  ppList and the l
133a0 65 6e 67 74 68 20 2a 70 6e 4c 69 73 74 20 73 6f  ength *pnList so
133b0 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 69 64   that they.** id
133c0 65 6e 74 69 66 79 20 74 68 65 20 73 75 62 73 65  entify the subse
133d0 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  t of the positio
133e0 6e 20 6c 69 73 74 20 74 68 61 74 20 63 6f 72 72  n list that corr
133f0 65 73 70 6f 6e 64 73 20 74 6f 20 63 6f 6c 75 6d  esponds to colum
13400 6e 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n iCol..**.** If
13410 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 65 6e   there are no en
13420 74 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e 70  tries in the inp
13430 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ut position list
13440 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c   for column iCol
13450 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73  , then.** *pnLis
13460 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
13470 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
13480 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
13490 64 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74  d fts3ColumnFilt
134a0 65 72 28 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20  er(.  int iCol, 
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
134d0 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a  to filter on */.
134e0 20 20 63 68 61 72 20 2a 2a 70 70 4c 69 73 74 2c    char **ppList,
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69    /* IN/OUT: Poi
13510 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e  nter to position
13520 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a   list */.  int *
13530 70 6e 4c 69 73 74 20 20 20 20 20 20 20 20 20 20  pnList          
13540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
13550 2f 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75  /OUT: Size of bu
13560 66 66 65 72 20 2a 70 70 4c 69 73 74 20 69 6e 20  ffer *ppList in 
13570 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  bytes */.){.  ch
13580 61 72 20 2a 70 4c 69 73 74 20 3d 20 2a 70 70 4c  ar *pList = *ppL
13590 69 73 74 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74  ist;.  int nList
135a0 20 3d 20 2a 70 6e 4c 69 73 74 3b 0a 20 20 63 68   = *pnList;.  ch
135b0 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 4c 69 73  ar *pEnd = &pLis
135c0 74 5b 6e 4c 69 73 74 5d 3b 0a 20 20 69 6e 74 20  t[nList];.  int 
135d0 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20  iCurrent = 0;.  
135e0 63 68 61 72 20 2a 70 20 3d 20 70 4c 69 73 74 3b  char *p = pList;
135f0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ..  assert( iCol
13600 3e 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  >=0 );.  while( 
13610 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20  1 ){.    char c 
13620 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
13630 70 3c 70 45 6e 64 20 26 26 20 28 63 20 7c 20 2a  p<pEnd && (c | *
13640 70 29 26 30 78 46 45 20 29 20 63 20 3d 20 2a 70  p)&0xFE ) c = *p
13650 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 0a 20 20  ++ & 0x80;.  .  
13660 20 20 69 66 28 20 69 43 6f 6c 3d 3d 69 43 75 72    if( iCol==iCur
13670 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 4c  rent ){.      nL
13680 69 73 74 20 3d 20 28 69 6e 74 29 28 70 20 2d 20  ist = (int)(p - 
13690 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 62 72  pList);.      br
136a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
136b0 6e 4c 69 73 74 20 2d 3d 20 28 69 6e 74 29 28 70  nList -= (int)(p
136c0 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 70   - pList);.    p
136d0 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 69 66  List = p;.    if
136e0 28 20 6e 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( nList==0 ){.  
136f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13700 0a 20 20 20 20 70 20 3d 20 26 70 4c 69 73 74 5b  .    p = &pList[
13710 31 5d 3b 0a 20 20 20 20 70 20 2b 3d 20 73 71 6c  1];.    p += sql
13720 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
13730 74 33 32 28 70 2c 20 26 69 43 75 72 72 65 6e 74  t32(p, &iCurrent
13740 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4c 69 73  );.  }..  *ppLis
13750 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 2a 70 6e  t = pList;.  *pn
13760 4c 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a  List = nList;.}.
13770 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
13780 4d 73 72 49 6e 63 72 53 74 61 72 74 28 0a 20 20  MsrIncrStart(.  
13790 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137b0 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
137c0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
137d0 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
137e0 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20  *pCsr,       /* 
137f0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
13800 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20     /* Column to 
13830 6d 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63  match on. */.  c
13840 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
13850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
13860 2a 20 54 65 72 6d 20 74 6f 20 69 74 65 72 61 74  * Term to iterat
13870 65 20 74 68 72 6f 75 67 68 20 61 20 64 6f 63 6c  e through a docl
13880 69 73 74 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ist for */.  int
13890 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138b0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
138c0 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20  in zTerm */.){. 
138d0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53   int i;.  int nS
138e0 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e  egment = pCsr->n
138f0 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28  Segment;.  int (
13900 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65  *xCmp)(Fts3SegRe
13910 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52  ader *, Fts3SegR
13920 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20  eader *) = (.   
13930 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66   p->bDescIdx ? f
13940 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
13950 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33  istCmpRev : fts3
13960 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
13970 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  Cmp.  );..  asse
13980 72 74 28 20 70 43 73 72 2d 3e 70 46 69 6c 74 65  rt( pCsr->pFilte
13990 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
139a0 28 20 7a 54 65 72 6d 20 26 26 20 6e 54 65 72 6d  ( zTerm && nTerm
139b0 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 76 61  >0 );..  /* Adva
139c0 6e 63 65 20 65 61 63 68 20 73 65 67 6d 65 6e 74  nce each segment
139d0 20 69 74 65 72 61 74 6f 72 20 75 6e 74 69 6c 20   iterator until 
139e0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
139f0 20 74 65 72 6d 20 7a 54 65 72 6d 2f 6e 54 65 72   term zTerm/nTer
13a00 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  m. */.  for(i=0;
13a10 20 69 3c 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b   i<nSegment; i++
13a20 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52 65  ){.    Fts3SegRe
13a30 61 64 65 72 20 2a 70 53 65 67 20 3d 20 70 43 73  ader *pSeg = pCs
13a40 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b  r->apSegment[i];
13a50 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
13a60 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 65 67  int rc = fts3Seg
13a70 52 65 61 64 65 72 4e 65 78 74 28 70 2c 20 70 53  ReaderNext(p, pS
13a80 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  eg, 1);.      if
13a90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13aa0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13ab0 20 7d 77 68 69 6c 65 28 20 66 74 73 33 53 65 67   }while( fts3Seg
13ac0 52 65 61 64 65 72 54 65 72 6d 43 6d 70 28 70 53  ReaderTermCmp(pS
13ad0 65 67 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  eg, zTerm, nTerm
13ae0 29 3c 30 20 29 3b 0a 20 20 7d 0a 20 20 66 74 73  )<0 );.  }.  fts
13af0 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 70  3SegReaderSort(p
13b00 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20  Csr->apSegment, 
13b10 6e 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65  nSegment, nSegme
13b20 6e 74 2c 20 66 74 73 33 53 65 67 52 65 61 64 65  nt, fts3SegReade
13b30 72 43 6d 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 74  rCmp);..  /* Det
13b40 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
13b50 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20  of the segments 
13b60 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 20 74  actually point t
13b70 6f 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a  o zTerm/nTerm. *
13b80 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
13b90 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  Segment; i++){. 
13ba0 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
13bb0 20 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61   *pSeg = pCsr->a
13bc0 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20  pSegment[i];.   
13bd0 20 69 66 28 20 21 70 53 65 67 2d 3e 61 4e 6f 64   if( !pSeg->aNod
13be0 65 20 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64  e || fts3SegRead
13bf0 65 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c 20  erTermCmp(pSeg, 
13c00 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 20 29 7b  zTerm, nTerm) ){
13c10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13c20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e    }.  }.  pCsr->
13c30 6e 41 64 76 61 6e 63 65 20 3d 20 69 3b 0a 0a 20  nAdvance = i;.. 
13c40 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68   /* Advance each
13c50 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 73   of the segments
13c60 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
13c70 20 66 69 72 73 74 20 64 6f 63 69 64 2e 20 2a 2f   first docid. */
13c80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
13c90 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b  sr->nAdvance; i+
13ca0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  +){.    int rc =
13cb0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 46 69   fts3SegReaderFi
13cc0 72 73 74 44 6f 63 69 64 28 70 2c 20 70 43 73 72  rstDocid(p, pCsr
13cd0 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b  ->apSegment[i]);
13ce0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13cf0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
13d00 72 63 3b 0a 20 20 7d 0a 20 20 66 74 73 33 53 65  rc;.  }.  fts3Se
13d10 67 52 65 61 64 65 72 53 6f 72 74 28 70 43 73 72  gReaderSort(pCsr
13d20 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 69 2c 20  ->apSegment, i, 
13d30 69 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 61 73 73  i, xCmp);..  ass
13d40 65 72 74 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69  ert( iCol<0 || i
13d50 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Col<p->nColumn )
13d60 3b 0a 20 20 70 43 73 72 2d 3e 69 43 6f 6c 46 69  ;.  pCsr->iColFi
13d70 6c 74 65 72 20 3d 20 69 43 6f 6c 3b 0a 0a 20 20  lter = iCol;..  
13d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13d90 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
13da0 46 74 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28  Fts3MsrIncrNext(
13db0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dd0 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
13de0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
13df0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
13e00 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20 20  er *pMsr,       
13e10 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74  /* Multi-segment
13e20 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20 2a  -reader handle *
13e30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
13e40 34 20 2a 70 69 44 6f 63 69 64 2c 20 20 20 20 20  4 *piDocid,     
13e50 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69      /* OUT: Doci
13e60 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61  d value */.  cha
13e70 72 20 2a 2a 70 61 50 6f 73 6c 69 73 74 2c 20 20  r **paPoslist,  
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e90 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
13ea0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
13eb0 0a 20 20 69 6e 74 20 2a 70 6e 50 6f 73 6c 69 73  .  int *pnPoslis
13ec0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
13ed0 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
13ee0 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
13ef0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
13f00 20 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 70    int nMerge = p
13f10 4d 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 0a 20  Msr->nAdvance;. 
13f20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
13f30 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 4d 73  *apSegment = pMs
13f40 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20  r->apSegment;.  
13f50 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33  int (*xCmp)(Fts3
13f60 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73  SegReader *, Fts
13f70 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d 20  3SegReader *) = 
13f80 28 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49 64  (.    p->bDescId
13f90 78 20 3f 20 66 74 73 33 53 65 67 52 65 61 64 65  x ? fts3SegReade
13fa0 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20 3a  rDoclistCmpRev :
13fb0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
13fc0 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20  clistCmp.  );.. 
13fd0 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d 30 20 29   if( nMerge==0 )
13fe0 7b 0a 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74  {.    *paPoslist
13ff0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
14000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14010 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
14020 20 20 20 69 6e 74 20 6e 53 6f 72 74 3b 0a 20 20     int nSort;.  
14030 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
14040 2a 70 53 65 67 3b 0a 20 20 20 20 70 53 65 67 20  *pSeg;.    pSeg 
14050 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e  = pMsr->apSegmen
14060 74 5b 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  t[0];..    if( p
14070 53 65 67 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  Seg->pOffsetList
14080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 61  ==0 ){.      *pa
14090 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Poslist = 0;.   
140a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
140b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
140c0 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  c;.      char *p
140d0 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  List;.      int 
140e0 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  nList;.      int
140f0 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
14100 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d  3_int64 iDocid =
14110 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69   apSegment[0]->i
14120 44 6f 63 69 64 3b 0a 0a 20 20 20 20 20 20 72 63  Docid;..      rc
14130 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
14140 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53  NextDocid(p, apS
14150 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73  egment[0], &pLis
14160 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
14170 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 77    j = 1;.      w
14180 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
14190 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 26 26 20  _OK .        && 
141a0 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20 20  j<nMerge.       
141b0 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d   && apSegment[j]
141c0 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a 20 20  ->pOffsetList.  
141d0 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
141e0 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69  nt[j]->iDocid==i
141f0 44 6f 63 69 64 0a 20 20 20 20 20 20 29 7b 0a 20  Docid.      ){. 
14200 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
14210 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63  SegReaderNextDoc
14220 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b  id(p, apSegment[
14230 6a 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  j], 0, 0);.     
14240 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     j++;.      }.
14250 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14260 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
14270 20 72 63 3b 0a 20 20 20 20 20 20 66 74 73 33 53   rc;.      fts3S
14280 65 67 52 65 61 64 65 72 53 6f 72 74 28 70 4d 73  egReaderSort(pMs
14290 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d  r->apSegment, nM
142a0 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a  erge, j, xCmp);.
142b0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 73 72 2d  .      if( pMsr-
142c0 3e 69 43 6f 6c 46 69 6c 74 65 72 3e 3d 30 20 29  >iColFilter>=0 )
142d0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 43 6f  {.        fts3Co
142e0 6c 75 6d 6e 46 69 6c 74 65 72 28 70 4d 73 72 2d  lumnFilter(pMsr-
142f0 3e 69 43 6f 6c 46 69 6c 74 65 72 2c 20 26 70 4c  >iColFilter, &pL
14300 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
14310 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14320 20 6e 4c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20   nList>0 ){.    
14330 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 69      *piDocid = i
14340 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 2a  Docid;.        *
14350 70 61 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73  paPoslist = pLis
14360 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 50 6f  t;.        *pnPo
14370 73 6c 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20  slist = nList;. 
14380 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
143a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
143b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74  QLITE_OK;.}..int
143c0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
143d0 65 61 64 65 72 53 74 61 72 74 28 0a 20 20 46 74  eaderStart(.  Ft
143e0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14400 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
14410 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d  andle */.  Fts3M
14420 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
14430 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr,       /* Cu
14440 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rsor object */. 
14450 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a   Fts3SegFilter *
14460 70 46 69 6c 74 65 72 20 20 20 20 20 20 20 20 20  pFilter         
14470 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
14480 20 6f 6e 20 72 61 6e 67 65 20 6f 66 20 69 74 65   on range of ite
14490 72 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  ration */.){.  i
144a0 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  nt i;..  /* Init
144b0 69 61 6c 69 7a 65 20 74 68 65 20 63 75 72 73 6f  ialize the curso
144c0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 43  r object */.  pC
144d0 73 72 2d 3e 70 46 69 6c 74 65 72 20 3d 20 70 46  sr->pFilter = pF
144e0 69 6c 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 66 20  ilter;..  /* If 
144f0 74 68 65 20 46 74 73 33 53 65 67 46 69 6c 74 65  the Fts3SegFilte
14500 72 20 64 65 66 69 6e 65 73 20 61 20 73 70 65 63  r defines a spec
14510 69 66 69 63 20 74 65 72 6d 20 28 6f 72 20 74 65  ific term (or te
14520 72 6d 20 70 72 65 66 69 78 29 20 74 6f 20 73 65  rm prefix) to se
14530 61 72 63 68 20 0a 20 20 2a 2a 20 66 6f 72 2c 20  arch .  ** for, 
14540 74 68 65 6e 20 61 64 76 61 6e 63 65 20 65 61 63  then advance eac
14550 68 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  h segment iterat
14560 6f 72 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e  or until it poin
14570 74 73 20 74 6f 20 61 20 74 65 72 6d 20 6f 66 0a  ts to a term of.
14580 20 20 2a 2a 20 65 71 75 61 6c 20 6f 72 20 67 72    ** equal or gr
14590 65 61 74 65 72 20 76 61 6c 75 65 20 74 68 61 6e  eater value than
145a0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
145b0 65 72 6d 2e 20 54 68 69 73 20 70 72 65 76 65 6e  erm. This preven
145c0 74 73 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 6e 6e  ts many.  ** unn
145d0 65 63 65 73 73 61 72 79 20 6d 65 72 67 65 2f 73  ecessary merge/s
145e0 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 66  ort operations f
145f0 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72  or the case wher
14600 65 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74  e single segment
14610 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 6c 65 61  .  ** b-tree lea
14620 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e 20  f nodes contain 
14630 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 65  more than one te
14640 72 6d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  rm..  */.  for(i
14650 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67  =0; i<pCsr->nSeg
14660 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ment; i++){.    
14670 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 46 69 6c  int nTerm = pFil
14680 74 65 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  ter->nTerm;.    
14690 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
146a0 6d 20 3d 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65  m = pFilter->zTe
146b0 72 6d 3b 0a 20 20 20 20 46 74 73 33 53 65 67 52  rm;.    Fts3SegR
146c0 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 70 43  eader *pSeg = pC
146d0 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d  sr->apSegment[i]
146e0 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
146f0 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 65   int rc = fts3Se
14700 67 52 65 61 64 65 72 4e 65 78 74 28 70 2c 20 70  gReaderNext(p, p
14710 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Seg, 0);.      i
14720 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14730 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14740 20 20 7d 77 68 69 6c 65 28 20 7a 54 65 72 6d 20    }while( zTerm 
14750 26 26 20 66 74 73 33 53 65 67 52 65 61 64 65 72  && fts3SegReader
14760 54 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54  TermCmp(pSeg, zT
14770 65 72 6d 2c 20 6e 54 65 72 6d 29 3c 30 20 29 3b  erm, nTerm)<0 );
14780 0a 20 20 7d 0a 20 20 66 74 73 33 53 65 67 52 65  .  }.  fts3SegRe
14790 61 64 65 72 53 6f 72 74 28 0a 20 20 20 20 20 20  aderSort(.      
147a0 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c  pCsr->apSegment,
147b0 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2c   pCsr->nSegment,
147c0 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2c   pCsr->nSegment,
147d0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d   fts3SegReaderCm
147e0 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  p);..  return SQ
147f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20  LITE_OK;.}..int 
14800 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
14810 61 64 65 72 53 74 65 70 28 0a 20 20 46 74 73 33  aderStep(.  Fts3
14820 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
14830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
14840 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
14850 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
14860 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
14870 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r        /* Curs
14880 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  or object */.){.
14890 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
148a0 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74 20 69 73 49  E_OK;..  int isI
148b0 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 20 28 70  gnoreEmpty =  (p
148c0 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c  Csr->pFilter->fl
148d0 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45  ags & FTS3_SEGME
148e0 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 29  NT_IGNORE_EMPTY)
148f0 3b 0a 20 20 69 6e 74 20 69 73 52 65 71 75 69 72  ;.  int isRequir
14900 65 50 6f 73 20 3d 20 20 20 28 70 43 73 72 2d 3e  ePos =   (pCsr->
14910 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
14920 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45   FTS3_SEGMENT_RE
14930 51 55 49 52 45 5f 50 4f 53 29 3b 0a 20 20 69 6e  QUIRE_POS);.  in
14940 74 20 69 73 43 6f 6c 46 69 6c 74 65 72 20 3d 20  t isColFilter = 
14950 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65     (pCsr->pFilte
14960 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f  r->flags & FTS3_
14970 53 45 47 4d 45 4e 54 5f 43 4f 4c 55 4d 4e 5f 46  SEGMENT_COLUMN_F
14980 49 4c 54 45 52 29 3b 0a 20 20 69 6e 74 20 69 73  ILTER);.  int is
14990 50 72 65 66 69 78 20 3d 20 20 20 20 20 20 20 28  Prefix =       (
149a0 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66  pCsr->pFilter->f
149b0 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d  lags & FTS3_SEGM
149c0 45 4e 54 5f 50 52 45 46 49 58 29 3b 0a 20 20 69  ENT_PREFIX);.  i
149d0 6e 74 20 69 73 53 63 61 6e 20 3d 20 20 20 20 20  nt isScan =     
149e0 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74      (pCsr->pFilt
149f0 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33  er->flags & FTS3
14a00 5f 53 45 47 4d 45 4e 54 5f 53 43 41 4e 29 3b 0a  _SEGMENT_SCAN);.
14a10 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
14a20 20 2a 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 70   **apSegment = p
14a30 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a  Csr->apSegment;.
14a40 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
14a50 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b   pCsr->nSegment;
14a60 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72  .  Fts3SegFilter
14a70 20 2a 70 46 69 6c 74 65 72 20 3d 20 70 43 73 72   *pFilter = pCsr
14a80 2d 3e 70 46 69 6c 74 65 72 3b 0a 20 20 69 6e 74  ->pFilter;.  int
14a90 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67   (*xCmp)(Fts3Seg
14aa0 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65  Reader *, Fts3Se
14ab0 67 52 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20  gReader *) = (. 
14ac0 20 20 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f     p->bDescIdx ?
14ad0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
14ae0 63 6c 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74  clistCmpRev : ft
14af0 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69  s3SegReaderDocli
14b00 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66  stCmp.  );..  if
14b10 28 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  ( pCsr->nSegment
14b20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14b30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 64 6f 20 7b 0a  ITE_OK;..  do {.
14b40 20 20 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 0a      int nMerge;.
14b50 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 0a 20 20      int i;.  .  
14b60 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65    /* Advance the
14b70 20 66 69 72 73 74 20 70 43 73 72 2d 3e 6e 41 64   first pCsr->nAd
14b80 76 61 6e 63 65 20 65 6e 74 72 69 65 73 20 69 6e  vance entries in
14b90 20 74 68 65 20 61 70 53 65 67 6d 65 6e 74 5b 5d   the apSegment[]
14ba0 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 66 6f   array.    ** fo
14bb0 72 77 61 72 64 2e 20 54 68 65 6e 20 73 6f 72 74  rward. Then sort
14bc0 20 74 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64   the list in ord
14bd0 65 72 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65  er of current te
14be0 72 6d 20 61 67 61 69 6e 2e 20 20 0a 20 20 20 20  rm again.  .    
14bf0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
14c00 69 3c 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65  i<pCsr->nAdvance
14c10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
14c20 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
14c30 4e 65 78 74 28 70 2c 20 61 70 53 65 67 6d 65 6e  Next(p, apSegmen
14c40 74 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  t[i], 0);.      
14c50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14c60 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
14c70 20 20 20 7d 0a 20 20 20 20 66 74 73 33 53 65 67     }.    fts3Seg
14c80 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65 67  ReaderSort(apSeg
14c90 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c 20  ment, nSegment, 
14ca0 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 2c 20  pCsr->nAdvance, 
14cb0 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d 70  fts3SegReaderCmp
14cc0 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64  );.    pCsr->nAd
14cd0 76 61 6e 63 65 20 3d 20 30 3b 0a 0a 20 20 20 20  vance = 0;..    
14ce0 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 73 65  /* If all the se
14cf0 67 2d 72 65 61 64 65 72 73 20 61 72 65 20 61 74  g-readers are at
14d00 20 45 4f 46 2c 20 77 65 27 72 65 20 66 69 6e 69   EOF, we're fini
14d10 73 68 65 64 2e 20 72 65 74 75 72 6e 20 53 51 4c  shed. return SQL
14d20 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 20 20 61  ITE_OK. */.    a
14d30 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
14d40 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  E_OK );.    if( 
14d50 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 4e  apSegment[0]->aN
14d60 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ode==0 ) break;.
14d70 0a 20 20 20 20 70 43 73 72 2d 3e 6e 54 65 72 6d  .    pCsr->nTerm
14d80 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d   = apSegment[0]-
14d90 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 70 43 73 72  >nTerm;.    pCsr
14da0 2d 3e 7a 54 65 72 6d 20 3d 20 61 70 53 65 67 6d  ->zTerm = apSegm
14db0 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b 0a 0a  ent[0]->zTerm;..
14dc0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
14dd0 73 20 61 20 70 72 65 66 69 78 2d 73 65 61 72 63  s a prefix-searc
14de0 68 2c 20 61 6e 64 20 69 66 20 74 68 65 20 74 65  h, and if the te
14df0 72 6d 20 74 68 61 74 20 61 70 53 65 67 6d 65 6e  rm that apSegmen
14e00 74 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20 20 20  t[0] points.    
14e10 2a 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74 20 73  ** to does not s
14e20 68 61 72 65 20 61 20 73 75 66 66 69 78 20 77 69  hare a suffix wi
14e30 74 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72  th pFilter->zTer
14e40 6d 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20 61 6c  m/nTerm, then al
14e50 6c 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  l .    ** requir
14e60 65 64 20 63 61 6c 6c 62 61 63 6b 73 20 68 61 76  ed callbacks hav
14e70 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 49 6e 20  e been made. In 
14e80 74 68 69 73 20 63 61 73 65 20 65 78 69 74 20 65  this case exit e
14e90 61 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  arly..    **.   
14ea0 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
14eb0 66 20 74 68 69 73 20 69 73 20 61 20 73 65 61 72  f this is a sear
14ec0 63 68 20 66 6f 72 20 61 6e 20 65 78 61 63 74 20  ch for an exact 
14ed0 6d 61 74 63 68 2c 20 61 6e 64 20 74 68 65 20 66  match, and the f
14ee0 69 72 73 74 20 74 65 72 6d 0a 20 20 20 20 2a 2a  irst term.    **
14ef0 20 6f 66 20 73 65 67 6d 65 6e 74 20 61 70 53 65   of segment apSe
14f00 67 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f 74 20  gment[0] is not 
14f10 61 20 6d 61 74 63 68 2c 20 65 78 69 74 20 65 61  a match, exit ea
14f20 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rly..    */.    
14f30 69 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65  if( pFilter->zTe
14f40 72 6d 20 26 26 20 21 69 73 53 63 61 6e 20 29 7b  rm && !isScan ){
14f50 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d  .      if( pCsr-
14f60 3e 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72 2d 3e  >nTerm<pFilter->
14f70 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c  nTerm .       ||
14f80 20 28 21 69 73 50 72 65 66 69 78 20 26 26 20 70   (!isPrefix && p
14f90 43 73 72 2d 3e 6e 54 65 72 6d 3e 70 46 69 6c 74  Csr->nTerm>pFilt
14fa0 65 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20 20  er->nTerm).     
14fb0 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 43 73 72    || memcmp(pCsr
14fc0 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72  ->zTerm, pFilter
14fd0 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72  ->zTerm, pFilter
14fe0 2d 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20 20 20  ->nTerm) .      
14ff0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
15000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15010 0a 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 31 3b  .    nMerge = 1;
15020 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 4d 65 72  .    while( nMer
15030 67 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20 20 20  ge<nSegment .   
15040 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e       && apSegmen
15050 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f 64 65  t[nMerge]->aNode
15060 0a 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65  .        && apSe
15070 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 6e  gment[nMerge]->n
15080 54 65 72 6d 3d 3d 70 43 73 72 2d 3e 6e 54 65 72  Term==pCsr->nTer
15090 6d 20 0a 20 20 20 20 20 20 20 20 26 26 20 30 3d  m .        && 0=
150a0 3d 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a 54  =memcmp(pCsr->zT
150b0 65 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6e  erm, apSegment[n
150c0 4d 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c 20 70  Merge]->zTerm, p
150d0 43 73 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20  Csr->nTerm).    
150e0 29 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67 65 2b  ){.      nMerge+
150f0 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  +;.    }..    as
15100 73 65 72 74 28 20 69 73 49 67 6e 6f 72 65 45 6d  sert( isIgnoreEm
15110 70 74 79 20 7c 7c 20 28 69 73 52 65 71 75 69 72  pty || (isRequir
15120 65 50 6f 73 20 26 26 20 21 69 73 43 6f 6c 46 69  ePos && !isColFi
15130 6c 74 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  lter) );.    if(
15140 20 6e 4d 65 72 67 65 3d 3d 31 20 0a 20 20 20 20   nMerge==1 .    
15150 20 26 26 20 21 69 73 49 67 6e 6f 72 65 45 6d 70   && !isIgnoreEmp
15160 74 79 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ty .     && (p->
15170 62 44 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20 66  bDescIdx==0 || f
15180 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
15190 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b  nding(apSegment[
151a0 30 5d 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20  0])==0).    ){. 
151b0 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c       pCsr->aDocl
151c0 69 73 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  ist = apSegment[
151d0 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20  0]->aDoclist;.  
151e0 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69      pCsr->nDocli
151f0 73 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30  st = apSegment[0
15200 5d 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20  ]->nDoclist;.   
15210 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
15220 4f 57 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OW;.    }else{. 
15230 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73       int nDoclis
15240 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
15250 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c   /* Size of docl
15260 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ist */.      sql
15270 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76  ite3_int64 iPrev
15280 20 3d 20 30 3b 20 20 20 20 2f 2a 20 50 72 65 76   = 0;    /* Prev
15290 69 6f 75 73 20 64 6f 63 69 64 20 73 74 6f 72 65  ious docid store
152a0 64 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  d in doclist */.
152b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  .      /* The cu
152c0 72 72 65 6e 74 20 74 65 72 6d 20 6f 66 20 74 68  rrent term of th
152d0 65 20 66 69 72 73 74 20 6e 4d 65 72 67 65 20 65  e first nMerge e
152e0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 61 72  ntries in the ar
152f0 72 61 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ray.      ** of 
15300 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62  Fts3SegReader ob
15310 6a 65 63 74 73 20 69 73 20 74 68 65 20 73 61 6d  jects is the sam
15320 65 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 73 20  e. The doclists 
15330 6d 75 73 74 20 62 65 20 6d 65 72 67 65 64 0a 20  must be merged. 
15340 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 20 73 69       ** and a si
15350 6e 67 6c 65 20 74 65 72 6d 20 72 65 74 75 72 6e  ngle term return
15360 65 64 20 77 69 74 68 20 74 68 65 20 6d 65 72 67  ed with the merg
15370 65 64 20 64 6f 63 6c 69 73 74 2e 0a 20 20 20 20  ed doclist..    
15380 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
15390 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 3b 20 69 2b  =0; i<nMerge; i+
153a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33  +){.        fts3
153b0 53 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f  SegReaderFirstDo
153c0 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74  cid(p, apSegment
153d0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
153e0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
153f0 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74 2c  rSort(apSegment,
15400 20 6e 4d 65 72 67 65 2c 20 6e 4d 65 72 67 65 2c   nMerge, nMerge,
15410 20 78 43 6d 70 29 3b 0a 20 20 20 20 20 20 77 68   xCmp);.      wh
15420 69 6c 65 28 20 61 70 53 65 67 6d 65 6e 74 5b 30  ile( apSegment[0
15430 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29  ]->pOffsetList )
15440 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15470 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 73   segments that s
15480 68 61 72 65 20 61 20 64 6f 63 69 64 20 2a 2f 0a  hare a docid */.
15490 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c          char *pL
154a0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ist;.        int
154b0 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   nList;.        
154c0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
154d0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
154e0 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67 6d   iDocid = apSegm
154f0 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a  ent[0]->iDocid;.
15500 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52          fts3SegR
15510 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70  eaderNextDocid(p
15520 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2c 20  , apSegment[0], 
15530 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
15540 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a  .        j = 1;.
15550 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
15560 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20 20 20  <nMerge.        
15570 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74      && apSegment
15580 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  [j]->pOffsetList
15590 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
155a0 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44  apSegment[j]->iD
155b0 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20 20 20  ocid==iDocid.   
155c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
155d0 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e    fts3SegReaderN
155e0 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65  extDocid(p, apSe
155f0 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b  gment[j], 0, 0);
15600 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
15610 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
15620 20 20 20 69 66 28 20 69 73 43 6f 6c 46 69 6c 74     if( isColFilt
15630 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
15640 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72  fts3ColumnFilter
15650 28 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c 2c 20  (pFilter->iCol, 
15660 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
15670 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
15680 20 20 20 20 69 66 28 20 21 69 73 49 67 6e 6f 72      if( !isIgnor
15690 65 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73 74 3e  eEmpty || nList>
156a0 30 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 20 20  0 ){..          
156b0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
156c0 20 27 64 6f 63 69 64 27 20 64 65 6c 74 61 20 76   'docid' delta v
156d0 61 6c 75 65 20 74 6f 20 77 72 69 74 65 20 69 6e  alue to write in
156e0 74 6f 20 74 68 65 20 6d 65 72 67 65 64 20 0a 20  to the merged . 
156f0 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c           ** docl
15700 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ist. */.        
15710 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
15720 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
15730 20 20 69 66 28 20 70 2d 3e 62 44 65 73 63 49 64    if( p->bDescId
15740 78 20 26 26 20 6e 44 6f 63 6c 69 73 74 3e 30 20  x && nDoclist>0 
15750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
15760 44 65 6c 74 61 20 3d 20 69 50 72 65 76 20 2d 20  Delta = iPrev - 
15770 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20  iDocid;.        
15780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15790 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20 69 44       iDelta = iD
157a0 6f 63 69 64 20 2d 20 69 50 72 65 76 3b 0a 20 20  ocid - iPrev;.  
157b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
157c0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 65 6c      assert( iDel
157d0 74 61 3e 30 20 7c 7c 20 28 6e 44 6f 63 6c 69 73  ta>0 || (nDoclis
157e0 74 3d 3d 30 20 26 26 20 69 44 65 6c 74 61 3d 3d  t==0 && iDelta==
157f0 69 44 6f 63 69 64 29 20 29 3b 0a 20 20 20 20 20  iDocid) );.     
15800 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 6f       assert( nDo
15810 63 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65 6c 74  clist>0 || iDelt
15820 61 3d 3d 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20  a==iDocid );..  
15830 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20          nByte = 
15840 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
15850 74 4c 65 6e 28 69 44 65 6c 74 61 29 20 2b 20 28  tLen(iDelta) + (
15860 69 73 52 65 71 75 69 72 65 50 6f 73 3f 6e 4c 69  isRequirePos?nLi
15870 73 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20 20 20  st+1:0);.       
15880 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 2b     if( nDoclist+
15890 6e 42 79 74 65 3e 70 43 73 72 2d 3e 6e 42 75 66  nByte>pCsr->nBuf
158a0 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fer ){.         
158b0 20 20 20 63 68 61 72 20 2a 61 4e 65 77 3b 0a 20     char *aNew;. 
158c0 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d             pCsr-
158d0 3e 6e 42 75 66 66 65 72 20 3d 20 28 6e 44 6f 63  >nBuffer = (nDoc
158e0 6c 69 73 74 2b 6e 42 79 74 65 29 2a 32 3b 0a 20  list+nByte)*2;. 
158f0 20 20 20 20 20 20 20 20 20 20 20 61 4e 65 77 20             aNew 
15900 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
15910 63 28 70 43 73 72 2d 3e 61 42 75 66 66 65 72 2c  c(pCsr->aBuffer,
15920 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b   pCsr->nBuffer);
15930 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
15940 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
15950 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15960 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15970 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15980 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 42 75         pCsr->aBu
15990 66 66 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20  ffer = aNew;.   
159a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
159b0 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 73     nDoclist += s
159c0 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
159d0 69 6e 74 28 26 70 43 73 72 2d 3e 61 42 75 66 66  int(&pCsr->aBuff
159e0 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69 44  er[nDoclist], iD
159f0 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  elta);.         
15a00 20 69 50 72 65 76 20 3d 20 69 44 6f 63 69 64 3b   iPrev = iDocid;
15a10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
15a20 73 52 65 71 75 69 72 65 50 6f 73 20 29 7b 0a 20  sRequirePos ){. 
15a30 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
15a40 79 28 26 70 43 73 72 2d 3e 61 42 75 66 66 65 72  y(&pCsr->aBuffer
15a50 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 70 4c 69 73  [nDoclist], pLis
15a60 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  t, nList);.     
15a70 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20         nDoclist 
15a80 2b 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  += nList;.      
15a90 20 20 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66        pCsr->aBuf
15aa0 66 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b 5d 20  fer[nDoclist++] 
15ab0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
15ac0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
15ad0 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
15ae0 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65  aderSort(apSegme
15af0 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 78  nt, nMerge, j, x
15b00 43 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cmp);.      }.  
15b10 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 74      if( nDoclist
15b20 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
15b30 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70  sr->aDoclist = p
15b40 43 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20  Csr->aBuffer;.  
15b50 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63        pCsr->nDoc
15b60 6c 69 73 74 20 3d 20 6e 44 6f 63 6c 69 73 74 3b  list = nDoclist;
15b70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
15b80 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20  LITE_ROW;.      
15b90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 73 72  }.    }.    pCsr
15ba0 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 6e 4d 65  ->nAdvance = nMe
15bb0 72 67 65 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  rge;.  }while( r
15bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
15bd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15be0 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
15bf0 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73  s3SegReaderFinis
15c00 68 28 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  h(.  Fts3MultiSe
15c10 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20  gReader *pCsr   
15c20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62      /* Cursor ob
15c30 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ject */.){.  if(
15c40 20 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74   pCsr ){.    int
15c50 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
15c60 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e   i<pCsr->nSegmen
15c70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  t; i++){.      s
15c80 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
15c90 64 65 72 46 72 65 65 28 70 43 73 72 2d 3e 61 70  derFree(pCsr->ap
15ca0 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Segment[i]);.   
15cb0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
15cc0 72 65 65 28 70 43 73 72 2d 3e 61 70 53 65 67 6d  ree(pCsr->apSegm
15cd0 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
15ce0 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 42 75  3_free(pCsr->aBu
15cf0 66 66 65 72 29 3b 0a 0a 20 20 20 20 70 43 73 72  ffer);..    pCsr
15d00 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a  ->nSegment = 0;.
15d10 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d      pCsr->apSegm
15d20 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ent = 0;.    pCs
15d30 72 2d 3e 61 42 75 66 66 65 72 20 3d 20 30 3b 0a  r->aBuffer = 0;.
15d40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72    }.}../*.** Mer
15d50 67 65 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65  ge all level iLe
15d60 76 65 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  vel segments in 
15d70 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 74  the database int
15d80 6f 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69  o a single .** i
15d90 4c 65 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e  Level+1 segment.
15da0 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30   Or, if iLevel<0
15db0 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  , merge all segm
15dc0 65 6e 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73  ents into a.** s
15dd0 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 77 69  ingle segment wi
15de0 74 68 20 61 20 6c 65 76 65 6c 20 65 71 75 61 6c  th a level equal
15df0 20 74 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61   to the numerica
15e00 6c 6c 79 20 6c 61 72 67 65 73 74 20 6c 65 76 65  lly largest leve
15e10 6c 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  l .** currently 
15e20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
15e30 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
15e40 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
15e50 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 69  is called with i
15e60 4c 65 76 65 6c 3c 30 2c 20 62 75 74 20 74 68 65  Level<0, but the
15e70 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a  re is only one.*
15e80 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65  * segment in the
15e90 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54   database, SQLIT
15ea0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
15eb0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
15ec0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
15ed0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
15ee0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15ef0 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
15f00 20 6f 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20   occurs, .** an 
15f10 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
15f20 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
15f30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
15f40 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 46 74  3SegmentMerge(Ft
15f50 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20  s3Table *p, int 
15f60 69 49 6e 64 65 78 2c 20 69 6e 74 20 69 4c 65 76  iIndex, int iLev
15f70 65 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  el){.  int rc;  
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
15fa0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
15fb0 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
15fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15fd0 64 65 78 20 6f 66 20 6e 65 77 20 73 65 67 6d 65  dex of new segme
15fe0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  nt */.  int iNew
15ff0 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20 20  Level = 0;      
16000 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
16010 2f 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65  /index to create
16020 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 61 74 20   new segment at 
16030 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74  */.  SegmentWrit
16040 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 30 3b  er *pWriter = 0;
16050 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
16060 77 72 69 74 65 20 74 68 65 20 6e 65 77 2c 20 6d  write the new, m
16070 65 72 67 65 64 2c 20 73 65 67 6d 65 6e 74 20 2a  erged, segment *
16080 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65  /.  Fts3SegFilte
16090 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20 20 20  r filter;       
160a0 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
160b0 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e 64 69  erm filter condi
160c0 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 4d 75  tion */.  Fts3Mu
160d0 6c 74 69 53 65 67 52 65 61 64 65 72 20 63 73 72  ltiSegReader csr
160e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ;        /* Curs
160f0 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
16100 72 6f 75 67 68 20 6c 65 76 65 6c 28 73 29 20 2a  rough level(s) *
16110 2f 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72 65 45  /.  int bIgnoreE
16120 6d 70 74 79 20 3d 20 30 3b 20 20 20 20 20 20 20  mpty = 0;       
16130 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
16140 67 6e 6f 72 65 20 65 6d 70 74 79 20 73 65 67 6d  gnore empty segm
16150 65 6e 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ents */..  asser
16160 74 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f  t( iLevel==FTS3_
16170 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 0a 20 20  SEGCURSOR_ALL.  
16180 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d       || iLevel==
16190 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50  FTS3_SEGCURSOR_P
161a0 45 4e 44 49 4e 47 0a 20 20 20 20 20 20 20 7c 7c  ENDING.       ||
161b0 20 69 4c 65 76 65 6c 3e 3d 30 0a 20 20 29 3b 0a   iLevel>=0.  );.
161c0 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
161d0 3c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58  <FTS3_SEGDIR_MAX
161e0 4c 45 56 45 4c 20 29 3b 0a 20 20 61 73 73 65 72  LEVEL );.  asser
161f0 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20  t( iIndex>=0 && 
16200 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78  iIndex<p->nIndex
16210 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
16220 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
16230 43 75 72 73 6f 72 28 70 2c 20 69 49 6e 64 65 78  Cursor(p, iIndex
16240 2c 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30 2c 20  , iLevel, 0, 0, 
16250 31 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20 20 69  1, 0, &csr);.  i
16260 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16270 20 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74   || csr.nSegment
16280 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  ==0 ) goto finis
16290 68 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76  hed;..  if( iLev
162a0 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
162b0 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a  OR_ALL ){.    /*
162c0 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   This call is to
162d0 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65   merge all segme
162e0 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  nts in the datab
162f0 61 73 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a  ase to a single.
16300 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 2e 20      ** segment. 
16310 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  The level of the
16320 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20   new segment is 
16330 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 68 65  equal to the the
16340 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
16350 20 20 2a 2a 20 67 72 65 61 74 65 73 74 20 73 65    ** greatest se
16360 67 6d 65 6e 74 20 6c 65 76 65 6c 20 63 75 72 72  gment level curr
16370 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e  ently present in
16380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
16390 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e  r this.    ** in
163a0 64 65 78 2e 20 54 68 65 20 69 64 78 20 6f 66 20  dex. The idx of 
163b0 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  the new segment 
163c0 69 73 20 61 6c 77 61 79 73 20 30 2e 20 20 2a 2f  is always 0.  */
163d0 0a 20 20 20 20 69 66 28 20 63 73 72 2e 6e 53 65  .    if( csr.nSe
163e0 67 6d 65 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  gment==1 ){.    
163f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
16400 4e 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  NE;.      goto f
16410 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
16420 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d     rc = fts3Segm
16430 65 6e 74 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69  entMaxLevel(p, i
16440 49 6e 64 65 78 2c 20 26 69 4e 65 77 4c 65 76 65  Index, &iNewLeve
16450 6c 29 3b 0a 20 20 20 20 62 49 67 6e 6f 72 65 45  l);.    bIgnoreE
16460 6d 70 74 79 20 3d 20 31 3b 0a 0a 20 20 7d 65 6c  mpty = 1;..  }el
16470 73 65 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46  se if( iLevel==F
16480 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45  TS3_SEGCURSOR_PE
16490 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20 69 4e 65  NDING ){.    iNe
164a0 77 4c 65 76 65 6c 20 3d 20 69 49 6e 64 65 78 20  wLevel = iIndex 
164b0 2a 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  * FTS3_SEGDIR_MA
164c0 58 4c 45 56 45 4c 3b 20 0a 20 20 20 20 72 63 20  XLEVEL; .    rc 
164d0 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  = fts3AllocateSe
164e0 67 64 69 72 49 64 78 28 70 2c 20 69 49 6e 64 65  gdirIdx(p, iInde
164f0 78 2c 20 30 2c 20 26 69 49 64 78 29 3b 0a 20 20  x, 0, &iIdx);.  
16500 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
16510 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65  is call is to me
16520 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rge all segments
16530 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c   at level iLevel
16540 2e 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 0a  . find the next.
16550 20 20 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65      ** available
16560 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 20 61   segment index a
16570 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31  t level iLevel+1
16580 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20  . The call to.  
16590 20 20 2a 2a 20 66 74 73 33 41 6c 6c 6f 63 61 74    ** fts3Allocat
165a0 65 53 65 67 64 69 72 49 64 78 28 29 20 77 69 6c  eSegdirIdx() wil
165b0 6c 20 6d 65 72 67 65 20 74 68 65 20 73 65 67 6d  l merge the segm
165c0 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20 69 4c  ents at level iL
165d0 65 76 65 6c 2b 31 20 74 6f 20 0a 20 20 20 20 2a  evel+1 to .    *
165e0 2a 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 65  * a single iLeve
165f0 6c 2b 32 20 73 65 67 6d 65 6e 74 20 69 66 20 6e  l+2 segment if n
16600 65 63 65 73 73 61 72 79 2e 20 20 2a 2f 0a 20 20  ecessary.  */.  
16610 20 20 72 63 20 3d 20 66 74 73 33 41 6c 6c 6f 63    rc = fts3Alloc
16620 61 74 65 53 65 67 64 69 72 49 64 78 28 70 2c 20  ateSegdirIdx(p, 
16630 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2b 31  iIndex, iLevel+1
16640 2c 20 26 69 49 64 78 29 3b 0a 20 20 20 20 69 4e  , &iIdx);.    iN
16650 65 77 4c 65 76 65 6c 20 3d 20 69 49 6e 64 65 78  ewLevel = iIndex
16660 20 2a 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d   * FTS3_SEGDIR_M
16670 41 58 4c 45 56 45 4c 20 2b 20 69 4c 65 76 65 6c  AXLEVEL + iLevel
16680 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  +1;.  }.  if( rc
16690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
166a0 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 61  to finished;.  a
166b0 73 73 65 72 74 28 20 63 73 72 2e 6e 53 65 67 6d  ssert( csr.nSegm
166c0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
166d0 74 28 20 69 4e 65 77 4c 65 76 65 6c 3e 3d 28 69  t( iNewLevel>=(i
166e0 49 6e 64 65 78 2a 46 54 53 33 5f 53 45 47 44 49  Index*FTS3_SEGDI
166f0 52 5f 4d 41 58 4c 45 56 45 4c 29 20 29 3b 0a 20  R_MAXLEVEL) );. 
16700 20 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65 76   assert( iNewLev
16710 65 6c 3c 28 28 69 49 6e 64 65 78 2b 31 29 2a 46  el<((iIndex+1)*F
16720 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
16730 56 45 4c 29 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  VEL) );..  memse
16740 74 28 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69  t(&filter, 0, si
16750 7a 65 6f 66 28 46 74 73 33 53 65 67 46 69 6c 74  zeof(Fts3SegFilt
16760 65 72 29 29 3b 0a 20 20 66 69 6c 74 65 72 2e 66  er));.  filter.f
16770 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47 4d  lags = FTS3_SEGM
16780 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 3b  ENT_REQUIRE_POS;
16790 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20  .  filter.flags 
167a0 7c 3d 20 28 62 49 67 6e 6f 72 65 45 6d 70 74 79  |= (bIgnoreEmpty
167b0 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   ? FTS3_SEGMENT_
167c0 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 3a 20 30  IGNORE_EMPTY : 0
167d0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
167e0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
167f0 74 61 72 74 28 70 2c 20 26 63 73 72 2c 20 26 66  tart(p, &csr, &f
16800 69 6c 74 65 72 29 3b 0a 20 20 77 68 69 6c 65 28  ilter);.  while(
16810 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 29   SQLITE_OK==rc )
16820 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16830 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
16840 74 65 70 28 70 2c 20 26 63 73 72 29 3b 0a 20 20  tep(p, &csr);.  
16850 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16860 5f 52 4f 57 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ROW ) break;.  
16870 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 57 72    rc = fts3SegWr
16880 69 74 65 72 41 64 64 28 70 2c 20 26 70 57 72 69  iterAdd(p, &pWri
16890 74 65 72 2c 20 31 2c 20 0a 20 20 20 20 20 20 20  ter, 1, .       
168a0 20 63 73 72 2e 7a 54 65 72 6d 2c 20 63 73 72 2e   csr.zTerm, csr.
168b0 6e 54 65 72 6d 2c 20 63 73 72 2e 61 44 6f 63 6c  nTerm, csr.aDocl
168c0 69 73 74 2c 20 63 73 72 2e 6e 44 6f 63 6c 69 73  ist, csr.nDoclis
168d0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
168e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
168f0 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 61  to finished;.  a
16900 73 73 65 72 74 28 20 70 57 72 69 74 65 72 20 29  ssert( pWriter )
16910 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 21  ;..  if( iLevel!
16920 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
16930 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20 72  PENDING ){.    r
16940 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 53 65  c = fts3DeleteSe
16950 67 64 69 72 28 70 2c 20 69 49 6e 64 65 78 2c 20  gdir(p, iIndex, 
16960 69 4c 65 76 65 6c 2c 20 63 73 72 2e 61 70 53 65  iLevel, csr.apSe
16970 67 6d 65 6e 74 2c 20 63 73 72 2e 6e 53 65 67 6d  gment, csr.nSegm
16980 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
16990 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
169a0 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d  to finished;.  }
169b0 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 57  .  rc = fts3SegW
169c0 72 69 74 65 72 46 6c 75 73 68 28 70 2c 20 70 57  riterFlush(p, pW
169d0 72 69 74 65 72 2c 20 69 4e 65 77 4c 65 76 65 6c  riter, iNewLevel
169e0 2c 20 69 49 64 78 29 3b 0a 0a 20 66 69 6e 69 73  , iIdx);.. finis
169f0 68 65 64 3a 0a 20 20 66 74 73 33 53 65 67 57 72  hed:.  fts3SegWr
16a00 69 74 65 72 46 72 65 65 28 70 57 72 69 74 65 72  iterFree(pWriter
16a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
16a20 53 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28  SegReaderFinish(
16a30 26 63 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  &csr);.  return 
16a40 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46  rc;.}.../* .** F
16a50 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
16a60 73 20 6f 66 20 70 65 6e 64 69 6e 67 54 65 72 6d  s of pendingTerm
16a70 73 20 74 6f 20 6c 65 76 65 6c 20 30 20 73 65 67  s to level 0 seg
16a80 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
16a90 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
16aa0 54 65 72 6d 73 46 6c 75 73 68 28 46 74 73 33 54  TermsFlush(Fts3T
16ab0 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
16ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16ad0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
16ae0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
16af0 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78  K && i<p->nIndex
16b00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
16b10 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67   fts3SegmentMerg
16b20 65 28 70 2c 20 69 2c 20 46 54 53 33 5f 53 45 47  e(p, i, FTS3_SEG
16b30 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 29 3b  CURSOR_PENDING);
16b40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16b50 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
16b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16b70 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
16b80 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29  ingTermsClear(p)
16b90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16ba0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63 6f 64 65 20 4e  ../*.** Encode N
16bb0 20 69 6e 74 65 67 65 72 73 20 61 73 20 76 61 72   integers as var
16bc0 69 6e 74 73 20 69 6e 74 6f 20 61 20 62 6c 6f 62  ints into a blob
16bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16be0 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72   fts3EncodeIntAr
16bf0 72 61 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20  ray(.  int N,   
16c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16c10 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67   number of integ
16c20 65 72 73 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ers to encode */
16c30 0a 20 20 75 33 32 20 2a 61 2c 20 20 20 20 20 20  .  u32 *a,      
16c40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
16c50 65 67 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20  eger values */. 
16c60 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 20 20 20   char *zBuf,    
16c70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
16c80 20 42 4c 4f 42 20 68 65 72 65 20 2a 2f 0a 20 20   BLOB here */.  
16c90 69 6e 74 20 2a 70 4e 42 75 66 20 20 20 20 20 20  int *pNBuf      
16ca0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62     /* Write numb
16cb0 65 72 20 6f 66 20 62 79 74 65 73 20 69 66 20 7a  er of bytes if z
16cc0 42 75 66 5b 5d 20 75 73 65 64 20 68 65 72 65 20  Buf[] used here 
16cd0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
16ce0 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
16cf0 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 20  <N; i++){.    j 
16d00 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
16d10 74 56 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d  tVarint(&zBuf[j]
16d20 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  , (sqlite3_int64
16d30 29 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70  )a[i]);.  }.  *p
16d40 4e 42 75 66 20 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a  NBuf = j;.}../*.
16d50 2a 2a 20 44 65 63 6f 64 65 20 61 20 62 6c 6f 62  ** Decode a blob
16d60 20 6f 66 20 76 61 72 69 6e 74 73 20 69 6e 74 6f   of varints into
16d70 20 4e 20 69 6e 74 65 67 65 72 73 0a 2a 2f 0a 73   N integers.*/.s
16d80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 44  tatic void fts3D
16d90 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 0a 20  ecodeIntArray(. 
16da0 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
16db0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
16dc0 72 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 6f  r of integers to
16dd0 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32   decode */.  u32
16de0 20 2a 61 2c 20 20 20 20 20 20 20 20 20 20 20 20   *a,            
16df0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 74  /* Write the int
16e00 65 67 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20  eger values */. 
16e10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75   const char *zBu
16e20 66 2c 20 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20  f,  /* The BLOB 
16e30 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
16e40 61 72 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  arints */.  int 
16e50 6e 42 75 66 20 20 20 20 20 20 20 20 20 20 20 2f  nBuf           /
16e60 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 42 4c  * size of the BL
16e70 4f 42 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  OB */.){.  int i
16e80 2c 20 6a 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  , j;.  UNUSED_PA
16e90 52 41 4d 45 54 45 52 28 6e 42 75 66 29 3b 0a 20  RAMETER(nBuf);. 
16ea0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b   for(i=j=0; i<N;
16eb0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
16ec0 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 20 20  e3_int64 x;.    
16ed0 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  j += sqlite3Fts3
16ee0 47 65 74 56 61 72 69 6e 74 28 26 7a 42 75 66 5b  GetVarint(&zBuf[
16ef0 6a 5d 2c 20 26 78 29 3b 0a 20 20 20 20 61 73 73  j], &x);.    ass
16f00 65 72 74 28 6a 3c 3d 6e 42 75 66 29 3b 0a 20 20  ert(j<=nBuf);.  
16f10 20 20 61 5b 69 5d 20 3d 20 28 75 33 32 29 28 78    a[i] = (u32)(x
16f20 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
16f30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
16f40 65 72 74 20 74 68 65 20 73 69 7a 65 73 20 28 69  ert the sizes (i
16f50 6e 20 74 6f 6b 65 6e 73 29 20 66 6f 72 20 65 61  n tokens) for ea
16f60 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
16f70 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 77 69 74   document.** wit
16f80 68 20 64 6f 63 69 64 20 65 71 75 61 6c 20 74 6f  h docid equal to
16f90 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2e 20   p->iPrevDocid. 
16fa0 20 54 68 65 20 73 69 7a 65 73 20 61 72 65 20 65   The sizes are e
16fb0 6e 63 6f 64 65 64 20 61 73 0a 2a 2a 20 61 20 62  ncoded as.** a b
16fc0 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73 2e 0a  lob of varints..
16fd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
16fe0 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69 7a 65  ts3InsertDocsize
16ff0 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20  (.  int *pRC,   
17000 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
17010 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61  code */.  Fts3Ta
17020 62 6c 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54  ble *p,     /* T
17030 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
17040 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 75  to insert */.  u
17050 33 32 20 2a 61 53 7a 20 20 20 20 20 20 20 20 20  32 *aSz         
17060 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 65 61 63   /* Sizes of eac
17070 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  h column */.){. 
17080 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20   char *pBlob;   
17090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
170a0 20 42 4c 4f 42 20 65 6e 63 6f 64 69 6e 67 20 6f   BLOB encoding o
170b0 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73  f the document s
170c0 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c  ize */.  int nBl
170d0 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
170e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
170f0 79 74 65 73 20 69 6e 20 74 68 65 20 42 4c 4f 42  ytes in the BLOB
17100 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
17110 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
17120 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64  * Statement used
17130 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 65   to insert the e
17140 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
17150 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
17160 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
17170 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
17180 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28  ctions */..  if(
17190 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
171a0 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    pBlob = sqlite
171b0 33 5f 6d 61 6c 6c 6f 63 28 20 31 30 2a 70 2d 3e  3_malloc( 10*p->
171c0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28  nColumn );.  if(
171d0 20 70 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20   pBlob==0 ){.   
171e0 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRC = SQLITE_N
171f0 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e  OMEM;.    return
17200 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f  ;.  }.  fts3Enco
17210 64 65 49 6e 74 41 72 72 61 79 28 70 2d 3e 6e 43  deIntArray(p->nC
17220 6f 6c 75 6d 6e 2c 20 61 53 7a 2c 20 70 42 6c 6f  olumn, aSz, pBlo
17230 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63  b, &nBlob);.  rc
17240 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
17250 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f  , SQL_REPLACE_DO
17260 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30  CSIZE, &pStmt, 0
17270 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
17280 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17290 70 42 6c 6f 62 29 3b 0a 20 20 20 20 2a 70 52 43  pBlob);.    *pRC
172a0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
172b0 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
172c0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
172d0 74 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76 44 6f  t, 1, p->iPrevDo
172e0 63 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  cid);.  sqlite3_
172f0 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
17300 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62   2, pBlob, nBlob
17310 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
17320 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
17330 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d  pStmt);.  *pRC =
17340 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
17350 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
17360 52 65 63 6f 72 64 20 30 20 6f 66 20 74 68 65 20  Record 0 of the 
17370 25 5f 73 74 61 74 20 74 61 62 6c 65 20 63 6f 6e  %_stat table con
17380 74 61 69 6e 73 20 61 20 62 6c 6f 62 20 63 6f 6e  tains a blob con
17390 73 69 73 74 69 6e 67 20 6f 66 20 4e 20 76 61 72  sisting of N var
173a0 69 6e 74 73 2c 0a 2a 2a 20 77 68 65 72 65 20 4e  ints,.** where N
173b0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
173c0 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  f user defined c
173d0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 66 74  olumns in the ft
173e0 73 33 20 74 61 62 6c 65 20 70 6c 75 73 0a 2a 2a  s3 table plus.**
173f0 20 74 77 6f 2e 20 49 66 20 6e 43 6f 6c 20 69 73   two. If nCol is
17400 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
17410 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75  ser defined colu
17420 6d 6e 73 2c 20 74 68 65 6e 20 76 61 6c 75 65 73  mns, then values
17430 20 6f 66 20 74 68 65 20 0a 2a 2a 20 76 61 72 69   of the .** vari
17440 6e 74 73 20 61 72 65 20 73 65 74 20 61 73 20 66  nts are set as f
17450 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
17460 56 61 72 69 6e 74 20 30 3a 20 20 20 20 20 20 20  Varint 0:       
17470 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
17480 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
17490 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e  e..**.**   Varin
174a0 74 20 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72 20 65  t 1..nCol: For e
174b0 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  ach column, the 
174c0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
174d0 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20 69 6e  tokens stored in
174e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
174f0 20 20 20 20 20 20 74 68 65 20 63 6f 6c 75 6d 6e        the column
17500 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66   for all rows of
17510 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
17520 2a 20 20 20 56 61 72 69 6e 74 20 31 2b 6e 43 6f  *   Varint 1+nCo
17530 6c 3a 20 20 54 68 65 20 74 6f 74 61 6c 20 73 69  l:  The total si
17540 7a 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 6f 66  ze, in bytes, of
17550 20 61 6c 6c 20 74 65 78 74 20 76 61 6c 75 65 73   all text values
17560 20 69 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20 20 20   in all.**      
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
17580 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72 6f 77 73  umns of all rows
17590 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
175a0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
175b0 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f   fts3UpdateDocTo
175c0 74 61 6c 73 28 0a 20 20 69 6e 74 20 2a 70 52 43  tals(.  int *pRC
175d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
175e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
175f0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
17600 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17620 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 75  /* Table being u
17630 70 64 61 74 65 64 20 2a 2f 0a 20 20 75 33 32 20  pdated */.  u32 
17640 2a 61 53 7a 49 6e 73 2c 20 20 20 20 20 20 20 20  *aSzIns,        
17650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17660 69 7a 65 20 69 6e 63 72 65 61 73 65 73 20 2a 2f  ize increases */
17670 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 2c 20  .  u32 *aSzDel, 
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17690 20 20 20 2f 2a 20 53 69 7a 65 20 64 65 63 72 65     /* Size decre
176a0 61 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ases */.  int nC
176b0 68 6e 67 20 20 20 20 20 20 20 20 20 20 20 20 20  hng             
176c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
176d0 6e 67 65 20 69 6e 20 74 68 65 20 6e 75 6d 62 65  nge in the numbe
176e0 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a  r of documents *
176f0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 42 6c  /.){.  char *pBl
17700 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
17710 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f 72 20 42  /* Storage for B
17720 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  LOB written into
17730 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 69 6e 74   %_stat */.  int
17740 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
17750 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
17760 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e   BLOB written in
17770 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 75  to %_stat */.  u
17780 33 32 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  32 *a;          
17790 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
177a0 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
177b0 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 42 4c  t becomes the BL
177c0 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  OB */.  sqlite3_
177d0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
177e0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f   /* Statement fo
177f0 72 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72  r reading and wr
17800 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  iting */.  int i
17810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17820 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17830 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
17860 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
17870 6e 73 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 69  ns */..  const i
17880 6e 74 20 6e 53 74 61 74 20 3d 20 70 2d 3e 6e 43  nt nStat = p->nC
17890 6f 6c 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66 28 20  olumn+2;..  if( 
178a0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
178b0 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   a = sqlite3_mal
178c0 6c 6f 63 28 20 28 73 69 7a 65 6f 66 28 75 33 32  loc( (sizeof(u32
178d0 29 2b 31 30 29 2a 6e 53 74 61 74 20 29 3b 0a 20  )+10)*nStat );. 
178e0 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
178f0 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRC = SQLITE_N
17900 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e  OMEM;.    return
17910 3b 0a 20 20 7d 0a 20 20 70 42 6c 6f 62 20 3d 20  ;.  }.  pBlob = 
17920 28 63 68 61 72 2a 29 26 61 5b 6e 53 74 61 74 5d  (char*)&a[nStat]
17930 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ;.  rc = fts3Sql
17940 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
17950 43 54 5f 44 4f 43 54 4f 54 41 4c 2c 20 26 70 53  CT_DOCTOTAL, &pS
17960 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
17970 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
17980 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70  _free(a);.    *p
17990 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
179a0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  urn;.  }.  if( s
179b0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
179c0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
179d0 7b 0a 20 20 20 20 66 74 73 33 44 65 63 6f 64 65  {.    fts3Decode
179e0 49 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c 20  IntArray(nStat, 
179f0 61 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  a,.         sqli
17a00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
17a10 70 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20  pStmt, 0),.     
17a20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
17a30 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
17a40 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0));.  }else{.  
17a50 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73    memset(a, 0, s
17a60 69 7a 65 6f 66 28 75 33 32 29 2a 28 6e 53 74 61  izeof(u32)*(nSta
17a70 74 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  t) );.  }.  sqli
17a80 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
17a90 3b 0a 20 20 69 66 28 20 6e 43 68 6e 67 3c 30 20  ;.  if( nChng<0 
17aa0 26 26 20 61 5b 30 5d 3c 28 75 33 32 29 28 2d 6e  && a[0]<(u32)(-n
17ab0 43 68 6e 67 29 20 29 7b 0a 20 20 20 20 61 5b 30  Chng) ){.    a[0
17ac0 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ] = 0;.  }else{.
17ad0 20 20 20 20 61 5b 30 5d 20 2b 3d 20 6e 43 68 6e      a[0] += nChn
17ae0 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  g;.  }.  for(i=0
17af0 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ; i<p->nColumn+1
17b00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20  ; i++){.    u32 
17b10 78 20 3d 20 61 5b 69 2b 31 5d 3b 0a 20 20 20 20  x = a[i+1];.    
17b20 69 66 28 20 78 2b 61 53 7a 49 6e 73 5b 69 5d 20  if( x+aSzIns[i] 
17b30 3c 20 61 53 7a 44 65 6c 5b 69 5d 20 29 7b 0a 20  < aSzDel[i] ){. 
17b40 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20       x = 0;.    
17b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 20 3d  }else{.      x =
17b60 20 78 20 2b 20 61 53 7a 49 6e 73 5b 69 5d 20 2d   x + aSzIns[i] -
17b70 20 61 53 7a 44 65 6c 5b 69 5d 3b 0a 20 20 20 20   aSzDel[i];.    
17b80 7d 0a 20 20 20 20 61 5b 69 2b 31 5d 20 3d 20 78  }.    a[i+1] = x
17b90 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f  ;.  }.  fts3Enco
17ba0 64 65 49 6e 74 41 72 72 61 79 28 6e 53 74 61 74  deIntArray(nStat
17bb0 2c 20 61 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c  , a, pBlob, &nBl
17bc0 6f 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  ob);.  rc = fts3
17bd0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52  SqlStmt(p, SQL_R
17be0 45 50 4c 41 43 45 5f 44 4f 43 54 4f 54 41 4c 2c  EPLACE_DOCTOTAL,
17bf0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
17c00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
17c10 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
17c20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
17c30 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
17c40 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
17c50 28 70 53 74 6d 74 2c 20 31 2c 20 70 42 6c 6f 62  (pStmt, 1, pBlob
17c60 2c 20 6e 42 6c 6f 62 2c 20 53 51 4c 49 54 45 5f  , nBlob, SQLITE_
17c70 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
17c80 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
17c90 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74 65 33    *pRC = sqlite3
17ca0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
17cb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
17cc0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
17cd0 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 46  fts3DoOptimize(F
17ce0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74  ts3Table *p, int
17cf0 20 62 52 65 74 75 72 6e 44 6f 6e 65 29 7b 0a 20   bReturnDone){. 
17d00 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
17d10 65 65 6e 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 69  eenDone = 0;.  i
17d20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17d30 4b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  K;.  for(i=0; rc
17d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
17d50 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29  <p->nIndex; i++)
17d60 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
17d70 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 69  egmentMerge(p, i
17d80 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  , FTS3_SEGCURSOR
17d90 5f 41 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 72  _ALL);.    if( r
17da0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
17db0 7b 0a 20 20 20 20 20 20 62 53 65 65 6e 44 6f 6e  {.      bSeenDon
17dc0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  e = 1;.      rc 
17dd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
17de0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
17df0 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73  Fts3SegmentsClos
17e00 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  e(p);.  sqlite3F
17e10 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43  ts3PendingTermsC
17e20 6c 65 61 72 28 70 29 3b 0a 0a 20 20 72 65 74 75  lear(p);..  retu
17e30 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
17e40 4b 20 26 26 20 62 52 65 74 75 72 6e 44 6f 6e 65  K && bReturnDone
17e50 20 26 26 20 62 53 65 65 6e 44 6f 6e 65 29 20 3f   && bSeenDone) ?
17e60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3a 20 72   SQLITE_DONE : r
17e70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  c;.}../*.** Hand
17e80 6c 65 20 61 20 27 73 70 65 63 69 61 6c 27 20 49  le a 'special' I
17e90 4e 53 45 52 54 20 6f 66 20 74 68 65 20 66 6f 72  NSERT of the for
17ea0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45  m:.**.**   "INSE
17eb0 52 54 20 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29  RT INTO tbl(tbl)
17ec0 20 56 41 4c 55 45 53 28 3c 65 78 70 72 3e 29 22   VALUES(<expr>)"
17ed0 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
17ee0 70 56 61 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68  pVal contains th
17ef0 65 20 72 65 73 75 6c 74 20 6f 66 20 3c 65 78 70  e result of <exp
17f00 72 3e 2e 20 43 75 72 72 65 6e 74 6c 79 20 74 68  r>. Currently th
17f10 65 20 6f 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69  e only .** meani
17f20 6e 67 66 75 6c 20 76 61 6c 75 65 20 74 6f 20 69  ngful value to i
17f30 6e 73 65 72 74 20 69 73 20 74 68 65 20 74 65 78  nsert is the tex
17f40 74 20 27 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f  t 'optimize'..*/
17f50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
17f60 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28 46 74  SpecialInsert(Ft
17f70 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69  s3Table *p, sqli
17f80 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29  te3_value *pVal)
17f90 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
17fc0 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
17fd0 61 72 20 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73  ar *zVal = (cons
17fe0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
17ff0 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
18000 29 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  );.  int nVal = 
18010 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
18020 74 65 73 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66  tes(pVal);..  if
18030 28 20 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72  ( !zVal ){.    r
18040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
18050 45 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EM;.  }else if( 
18060 6e 56 61 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71  nVal==8 && 0==sq
18070 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
18080 56 61 6c 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c  Val, "optimize",
18090 20 38 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   8) ){.    rc = 
180a0 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70  fts3DoOptimize(p
180b0 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
180c0 49 54 45 5f 54 45 53 54 0a 20 20 7d 65 6c 73 65  ITE_TEST.  }else
180d0 20 69 66 28 20 6e 56 61 6c 3e 39 20 26 26 20 30   if( nVal>9 && 0
180e0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
180f0 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64 65 73 69  mp(zVal, "nodesi
18100 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20  ze=", 9) ){.    
18110 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 3d 20 61  p->nNodeSize = a
18120 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29 3b 0a 20  toi(&zVal[9]);. 
18130 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
18140 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  K;.  }else if( n
18150 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d 73 71 6c  Val>11 && 0==sql
18160 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
18170 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69 6e 67 3d  al, "maxpending=
18180 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e  ", 9) ){.    p->
18190 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20  nMaxPendingData 
181a0 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 31 31 5d  = atoi(&zVal[11]
181b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
181c0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  TE_OK;.#endif.  
181d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
181e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
181f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
18200 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18210 74 68 65 20 64 65 66 65 72 72 65 64 20 64 6f 63  the deferred doc
18220 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 20  list associated 
18230 77 69 74 68 20 64 65 66 65 72 72 65 64 20 74 6f  with deferred to
18240 6b 65 6e 20 70 44 65 66 65 72 72 65 64 2e 0a 2a  ken pDeferred..*
18250 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18260 61 73 73 75 6d 65 73 20 74 68 61 74 20 73 71 6c  assumes that sql
18270 69 74 65 33 46 74 73 33 43 61 63 68 65 44 65 66  ite3Fts3CacheDef
18280 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 29 20  erredDoclists() 
18290 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
182a0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 61 6c  een called to al
182b0 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
182c0 61 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2e  ate the doclist.
182d0 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
182e0 33 46 74 73 33 44 65 66 65 72 72 65 64 44 6f 63  3Fts3DeferredDoc
182f0 6c 69 73 74 28 46 74 73 33 44 65 66 65 72 72 65  list(Fts3Deferre
18300 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65 72 72 65  dToken *pDeferre
18310 64 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b  d, int *pnByte){
18320 0a 20 20 69 66 28 20 70 44 65 66 65 72 72 65 64  .  if( pDeferred
18330 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 2a  ->pList ){.    *
18340 70 6e 42 79 74 65 20 3d 20 70 44 65 66 65 72 72  pnByte = pDeferr
18350 65 64 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61  ed->pList->nData
18360 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 44 65  ;.    return pDe
18370 66 65 72 72 65 64 2d 3e 70 4c 69 73 74 2d 3e 61  ferred->pList->a
18380 44 61 74 61 3b 0a 20 20 7d 0a 20 20 2a 70 6e 42  Data;.  }.  *pnB
18390 79 74 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  yte = 0;.  retur
183a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
183b0 6c 65 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20  lete all cached 
183c0 64 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73 74  deferred doclist
183d0 73 2e 20 44 65 66 65 72 72 65 64 20 64 6f 63 6c  s. Deferred docl
183e0 69 73 74 73 20 61 72 65 20 63 61 63 68 65 64 0a  ists are cached.
183f0 2a 2a 20 28 61 6c 6c 6f 63 61 74 65 64 29 20 62  ** (allocated) b
18400 79 20 74 68 65 20 73 71 6c 69 74 65 33 46 74 73  y the sqlite3Fts
18410 33 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f  3CacheDeferredDo
18420 63 6c 69 73 74 73 28 29 20 66 75 6e 63 74 69 6f  clists() functio
18430 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
18440 65 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72  e3Fts3FreeDeferr
18450 65 64 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43  edDoclists(Fts3C
18460 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
18470 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
18480 6e 20 2a 70 44 65 66 3b 0a 20 20 66 6f 72 28 70  n *pDef;.  for(p
18490 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72  Def=pCsr->pDefer
184a0 72 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d  red; pDef; pDef=
184b0 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pDef->pNext){.  
184c0 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73    fts3PendingLis
184d0 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c  tDelete(pDef->pL
184e0 69 73 74 29 3b 0a 20 20 20 20 70 44 65 66 2d 3e  ist);.    pDef->
184f0 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  pList = 0;.  }.}
18500 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
18510 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
18520 70 43 73 72 2d 3e 70 44 65 66 66 65 72 65 64 20  pCsr->pDeffered 
18530 6c 69 73 74 2e 20 45 6e 74 72 69 65 73 20 61 72  list. Entries ar
18540 65 20 61 64 64 65 64 20 74 6f 20 0a 2a 2a 20 74  e added to .** t
18550 68 69 73 20 6c 69 73 74 20 75 73 69 6e 67 20 73  his list using s
18560 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 54  qlite3Fts3DeferT
18570 6f 6b 65 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  oken()..*/.void 
18580 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65 44  sqlite3Fts3FreeD
18590 65 66 65 72 72 65 64 54 6f 6b 65 6e 73 28 46 74  eferredTokens(Ft
185a0 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  s3Cursor *pCsr){
185b0 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54  .  Fts3DeferredT
185c0 6f 6b 65 6e 20 2a 70 44 65 66 3b 0a 20 20 46 74  oken *pDef;.  Ft
185d0 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20  s3DeferredToken 
185e0 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 44  *pNext;.  for(pD
185f0 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72  ef=pCsr->pDeferr
18600 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70  ed; pDef; pDef=p
18610 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
18620 20 3d 20 70 44 65 66 2d 3e 70 4e 65 78 74 3b 0a   = pDef->pNext;.
18630 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c      fts3PendingL
18640 69 73 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e  istDelete(pDef->
18650 70 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  pList);.    sqli
18660 74 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a  te3_free(pDef);.
18670 20 20 7d 0a 20 20 70 43 73 72 2d 3e 70 44 65 66    }.  pCsr->pDef
18680 65 72 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  erred = 0;.}../*
18690 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 64 65 66  .** Generate def
186a0 65 72 72 65 64 2d 64 6f 63 6c 69 73 74 73 20 66  erred-doclists f
186b0 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e  or all tokens in
186c0 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65 66 65   the pCsr->pDefe
186d0 72 72 65 64 20 6c 69 73 74 0a 2a 2a 20 62 61 73  rred list.** bas
186e0 65 64 20 6f 6e 20 74 68 65 20 72 6f 77 20 74 68  ed on the row th
186f0 61 74 20 70 43 73 72 20 63 75 72 72 65 6e 74 6c  at pCsr currentl
18700 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
18710 2a 2a 20 41 20 64 65 66 65 72 72 65 64 2d 64 6f  ** A deferred-do
18720 63 6c 69 73 74 20 69 73 20 6c 69 6b 65 20 61 6e  clist is like an
18730 79 20 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 20  y other doclist 
18740 77 69 74 68 20 70 6f 73 69 74 69 6f 6e 20 69 6e  with position in
18750 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63  formation.** inc
18760 6c 75 64 65 64 2c 20 65 78 63 65 70 74 20 74 68  luded, except th
18770 61 74 20 69 74 20 6f 6e 6c 79 20 63 6f 6e 74 61  at it only conta
18780 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
18790 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
187a0 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e 6f  the.** table, no
187b0 74 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 2e 0a  t for all rows..
187c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
187d0 73 33 43 61 63 68 65 44 65 66 65 72 72 65 64 44  s3CacheDeferredD
187e0 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75 72 73  oclists(Fts3Curs
187f0 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  or *pCsr){.  int
18800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18820 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
18830 20 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65   if( pCsr->pDefe
18840 72 72 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  rred ){.    int 
18850 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
18870 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
18880 6f 75 67 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d  ough table colum
18890 6e 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ns */.    sqlite
188a0 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20  3_int64 iDocid; 
188b0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64          /* Docid
188c0 20 6f 66 20 74 68 65 20 72 6f 77 20 70 43 73 72   of the row pCsr
188d0 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20   points to */.  
188e0 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f    Fts3DeferredTo
188f0 6b 65 6e 20 2a 70 44 65 66 3b 20 20 20 20 20 20  ken *pDef;      
18900 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
18910 74 65 20 74 68 72 6f 75 67 68 20 64 65 66 65 72  te through defer
18920 72 65 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20  red tokens */.  
18930 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a  .    Fts3Table *
18940 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a  p = (Fts3Table *
18950 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  )pCsr->base.pVta
18960 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  b;.    sqlite3_t
18970 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 20 3d 20 70  okenizer *pT = p
18980 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20  ->pTokenizer;.  
18990 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
189a0 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74  zer_module const
189b0 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 2d 3e   *pModule = pT->
189c0 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 0a 20 20 20  pModule;.   .   
189d0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 69   assert( pCsr->i
189e0 73 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20  sRequireSeek==0 
189f0 29 3b 0a 20 20 20 20 69 44 6f 63 69 64 20 3d 20  );.    iDocid = 
18a00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
18a10 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74  nt64(pCsr->pStmt
18a20 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72  , 0);.  .    for
18a30 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75  (i=0; i<p->nColu
18a40 6d 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  mn && rc==SQLITE
18a50 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _OK; i++){.     
18a60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
18a70 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  xt = (const char
18a80 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
18a90 6e 5f 74 65 78 74 28 70 43 73 72 2d 3e 70 53 74  n_text(pCsr->pSt
18aa0 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  mt, i+1);.      
18ab0 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
18ac0 72 5f 63 75 72 73 6f 72 20 2a 70 54 43 20 3d 20  r_cursor *pTC = 
18ad0 30 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d  0;.  .      rc =
18ae0 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28   pModule->xOpen(
18af0 70 54 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26  pT, zText, -1, &
18b00 70 54 43 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  pTC);.      whil
18b10 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
18b20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
18b30 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20   const *zToken; 
18b40 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
18b50 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e  containing token
18b60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
18b70 6e 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20  nToken;         
18b80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18b90 6f 66 20 62 79 74 65 73 20 69 6e 20 74 6f 6b 65  of bytes in toke
18ba0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
18bb0 20 69 44 75 6d 31 2c 20 69 44 75 6d 32 3b 20 20   iDum1, iDum2;  
18bc0 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20         /* Dummy 
18bd0 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 20  variables */.   
18be0 20 20 20 20 20 69 6e 74 20 69 50 6f 73 3b 20 20       int iPos;  
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c00 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
18c10 6b 65 6e 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a  ken in zText */.
18c20 20 20 0a 20 20 20 20 20 20 20 20 70 54 43 2d 3e    .        pTC->
18c30 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 54 3b  pTokenizer = pT;
18c40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 4d  .        rc = pM
18c50 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70 54 43  odule->xNext(pTC
18c60 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b  , &zToken, &nTok
18c70 65 6e 2c 20 26 69 44 75 6d 31 2c 20 26 69 44 75  en, &iDum1, &iDu
18c80 6d 32 2c 20 26 69 50 6f 73 29 3b 0a 20 20 20 20  m2, &iPos);.    
18c90 20 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73      for(pDef=pCs
18ca0 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44  r->pDeferred; pD
18cb0 65 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ef && rc==SQLITE
18cc0 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e  _OK; pDef=pDef->
18cd0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
18ce0 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65    Fts3PhraseToke
18cf0 6e 20 2a 70 50 54 20 3d 20 70 44 65 66 2d 3e 70  n *pPT = pDef->p
18d00 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  Token;.         
18d10 20 69 66 28 20 28 70 44 65 66 2d 3e 69 43 6f 6c   if( (pDef->iCol
18d20 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 7c 7c 20  >=p->nColumn || 
18d30 70 44 65 66 2d 3e 69 43 6f 6c 3d 3d 69 29 0a 20  pDef->iCol==i). 
18d40 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
18d50 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20  T->n==nToken || 
18d60 28 70 50 54 2d 3e 69 73 50 72 65 66 69 78 20 26  (pPT->isPrefix &
18d70 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e 29  & pPT->n<nToken)
18d80 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
18d90 28 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54 6f 6b 65  (0==memcmp(zToke
18da0 6e 2c 20 70 50 54 2d 3e 7a 2c 20 70 50 54 2d 3e  n, pPT->z, pPT->
18db0 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  n)).          ){
18dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
18dd0 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
18de0 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69 73 74 2c  nd(&pDef->pList,
18df0 20 69 44 6f 63 69 64 2c 20 69 2c 20 69 50 6f 73   iDocid, i, iPos
18e00 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
18e10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
18e20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18e30 70 54 43 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78  pTC ) pModule->x
18e40 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20 20 20 20  Close(pTC);.    
18e50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18e60 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
18e70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18e80 0a 20 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43  .    for(pDef=pC
18e90 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70  sr->pDeferred; p
18ea0 44 65 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Def && rc==SQLIT
18eb0 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d  E_OK; pDef=pDef-
18ec0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
18ed0 66 28 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 29  f( pDef->pList )
18ee0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
18ef0 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
18f00 70 65 6e 64 56 61 72 69 6e 74 28 26 70 44 65 66  pendVarint(&pDef
18f10 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  ->pList, 0);.   
18f20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
18f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18f40 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 44  int sqlite3Fts3D
18f50 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69 73 74  eferredTokenList
18f60 28 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64  (.  Fts3Deferred
18f70 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63 68 61  Token *p, .  cha
18f80 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20 20 69  r **ppData, .  i
18f90 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a 20 20  nt *pnData.){.  
18fa0 63 68 61 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e  char *pRet;.  in
18fb0 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c 69 74  t nSkip;.  sqlit
18fc0 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79 3b 0a  e3_int64 dummy;.
18fd0 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 30 3b 0a  .  *ppData = 0;.
18fe0 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a 0a    *pnData = 0;..
18ff0 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d 3d    if( p->pList==
19000 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
19010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
19020 20 20 70 52 65 74 20 3d 20 28 63 68 61 72 20 2a    pRet = (char *
19030 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
19040 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61 29  p->pList->nData)
19050 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20 29 20  ;.  if( !pRet ) 
19060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
19070 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20 3d 20  MEM;..  nSkip = 
19080 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
19090 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61  rint(p->pList->a
190a0 44 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  Data, &dummy);. 
190b0 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e 70 4c   *pnData = p->pL
190c0 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 6b  ist->nData - nSk
190d0 69 70 3b 0a 20 20 2a 70 70 44 61 74 61 20 3d 20  ip;.  *ppData = 
190e0 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d 63 70  pRet;.  .  memcp
190f0 79 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c 69 73  y(pRet, &p->pLis
19100 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70 5d 2c  t->aData[nSkip],
19110 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72 65 74   *pnData);.  ret
19120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19130 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  ../*.** Add an e
19140 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e 20 70  ntry for token p
19150 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70 43 73  Token to the pCs
19160 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69 73  r->pDeferred lis
19170 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
19180 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28  3Fts3DeferToken(
19190 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
191a0 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
191b0 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65     /* Fts3 table
191c0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74 73   cursor */.  Fts
191d0 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54  3PhraseToken *pT
191e0 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
191f0 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 20 2a  Token to defer *
19200 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68      /* Column th
19230 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20 61 70  at token must ap
19240 70 65 61 72 20 69 6e 20 28 6f 72 20 2d 31 29 20  pear in (or -1) 
19250 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65 66 65  */.){.  Fts3Defe
19260 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65  rredToken *pDefe
19270 72 72 65 64 3b 0a 20 20 70 44 65 66 65 72 72 65  rred;.  pDeferre
19280 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
19290 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44 65 66 65  oc(sizeof(*pDefe
192a0 72 72 65 64 29 29 3b 0a 20 20 69 66 28 20 21 70  rred));.  if( !p
192b0 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20  Deferred ){.    
192c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
192d0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
192e0 74 28 70 44 65 66 65 72 72 65 64 2c 20 30 2c 20  t(pDeferred, 0, 
192f0 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72 72 65  sizeof(*pDeferre
19300 64 29 29 3b 0a 20 20 70 44 65 66 65 72 72 65 64  d));.  pDeferred
19310 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f 6b 65  ->pToken = pToke
19320 6e 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e  n;.  pDeferred->
19330 70 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e 70 44  pNext = pCsr->pD
19340 65 66 65 72 72 65 64 3b 20 0a 20 20 70 44 65 66  eferred; .  pDef
19350 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20 69 43  erred->iCol = iC
19360 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44 65 66  ol;.  pCsr->pDef
19370 65 72 72 65 64 20 3d 20 70 44 65 66 65 72 72 65  erred = pDeferre
19380 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  d;..  assert( pT
19390 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3d  oken->pDeferred=
193a0 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e  =0 );.  pToken->
193b0 70 44 65 66 65 72 72 65 64 20 3d 20 70 44 65 66  pDeferred = pDef
193c0 65 72 72 65 64 3b 0a 0a 20 20 72 65 74 75 72 6e  erred;..  return
193d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
193e0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61 6c 75  *.** SQLite valu
193f0 65 20 70 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e  e pRowid contain
19400 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61  s the rowid of a
19410 20 72 6f 77 20 74 68 61 74 20 6d 61 79 20 6f 72   row that may or
19420 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 70   may not be.** p
19430 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 46 54  resent in the FT
19440 53 33 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20  S3 table. If it 
19450 69 73 2c 20 64 65 6c 65 74 65 20 69 74 20 61 6e  is, delete it an
19460 64 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 6e  d adjust the con
19470 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75 62 73  tents.** of subs
19480 69 64 75 61 72 79 20 64 61 74 61 20 73 74 72 75  iduary data stru
19490 63 74 75 72 65 73 20 61 63 63 6f 72 64 69 6e 67  ctures according
194a0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
194b0 74 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f  t fts3DeleteByRo
194c0 77 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65  wid(.  Fts3Table
194d0 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f   *p, .  sqlite3_
194e0 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 0a  value *pRowid, .
194f0 20 20 69 6e 74 20 2a 70 6e 44 6f 63 2c 0a 20 20    int *pnDoc,.  
19500 75 33 32 20 2a 61 53 7a 44 65 6c 0a 29 7b 0a 20  u32 *aSzDel.){. 
19510 20 69 6e 74 20 69 73 45 6d 70 74 79 20 3d 20 30   int isEmpty = 0
19520 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
19530 33 49 73 45 6d 70 74 79 28 70 2c 20 70 52 6f 77  3IsEmpty(p, pRow
19540 69 64 2c 20 26 69 73 45 6d 70 74 79 29 3b 0a 20  id, &isEmpty);. 
19550 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19560 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  OK ){.    if( is
19570 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 2f  Empty ){.      /
19580 2a 20 44 65 6c 65 74 69 6e 67 20 74 68 69 73 20  * Deleting this 
19590 72 6f 77 20 6d 65 61 6e 73 20 74 68 65 20 77 68  row means the wh
195a0 6f 6c 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  ole table is emp
195b0 74 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ty. In this case
195c0 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  .      ** delete
195d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
195e0 20 61 6c 6c 20 74 68 72 65 65 20 74 61 62 6c 65   all three table
195f0 73 20 61 6e 64 20 74 68 72 6f 77 20 61 77 61 79  s and throw away
19600 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 64 61   any.      ** da
19610 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64 69 6e  ta in the pendin
19620 67 54 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c  gTerms hash tabl
19630 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  e.  */.      rc 
19640 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28  = fts3DeleteAll(
19650 70 29 3b 0a 20 20 20 20 20 20 2a 70 6e 44 6f 63  p);.      *pnDoc
19660 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31 3b 0a 20   = *pnDoc - 1;. 
19670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19680 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
19690 65 6d 6f 76 65 20 3d 20 73 71 6c 69 74 65 33 5f  emove = sqlite3_
196a0 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 52 6f 77  value_int64(pRow
196b0 69 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  id);.      rc = 
196c0 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
196d0 44 6f 63 69 64 28 70 2c 20 69 52 65 6d 6f 76 65  Docid(p, iRemove
196e0 29 3b 0a 20 20 20 20 20 20 66 74 73 33 44 65 6c  );.      fts3Del
196f0 65 74 65 54 65 72 6d 73 28 26 72 63 2c 20 70 2c  eteTerms(&rc, p,
19700 20 70 52 6f 77 69 64 2c 20 61 53 7a 44 65 6c 29   pRowid, aSzDel)
19710 3b 0a 20 20 20 20 20 20 66 74 73 33 53 71 6c 45  ;.      fts3SqlE
19720 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
19730 44 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 2c 20  DELETE_CONTENT, 
19740 26 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  &pRowid);.      
19750 69 66 28 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  if( sqlite3_chan
19760 67 65 73 28 70 2d 3e 64 62 29 20 29 20 2a 70 6e  ges(p->db) ) *pn
19770 44 6f 63 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31  Doc = *pnDoc - 1
19780 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62  ;.      if( p->b
19790 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20  HasDocsize ){.  
197a0 20 20 20 20 20 20 66 74 73 33 53 71 6c 45 78 65        fts3SqlExe
197b0 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
197c0 4c 45 54 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70  LETE_DOCSIZE, &p
197d0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Rowid);.      }.
197e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
197f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19800 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
19810 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72  oes the work for
19820 20 74 68 65 20 78 55 70 64 61 74 65 20 6d 65 74   the xUpdate met
19830 68 6f 64 20 6f 66 20 46 54 53 33 20 76 69 72 74  hod of FTS3 virt
19840 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 0a 2a  ual.** tables..*
19850 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
19860 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28 0a 20  3UpdateMethod(. 
19870 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
19880 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  Vtab,           
19890 20 2f 2a 20 46 54 53 33 20 76 74 61 62 20 6f 62   /* FTS3 vtab ob
198a0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ject */.  int nA
198b0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
198c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
198d0 65 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 61 72  e of argument ar
198e0 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ray */.  sqlite3
198f0 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20  _value **apVal, 
19900 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
19910 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  y of arguments *
19920 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
19930 20 2a 70 52 6f 77 69 64 20 20 20 20 20 20 20 20   *pRowid        
19940 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20      /* OUT: The 
19950 61 66 66 65 63 74 65 64 20 28 6f 72 20 65 66 66  affected (or eff
19960 65 63 74 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a  ected) rowid */.
19970 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  ){.  Fts3Table *
19980 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a  p = (Fts3Table *
19990 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVtab;.  int rc
199a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
199b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
199c0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
199d0 74 20 69 73 52 65 6d 6f 76 65 20 3d 20 30 3b 20  t isRemove = 0; 
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
199f0 20 54 72 75 65 20 66 6f 72 20 61 6e 20 55 50 44   True for an UPD
19a00 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f  ATE or DELETE */
19a10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
19a20 20 69 52 65 6d 6f 76 65 20 3d 20 30 3b 20 20 20   iRemove = 0;   
19a30 20 20 20 2f 2a 20 52 6f 77 69 64 20 72 65 6d 6f     /* Rowid remo
19a40 76 65 64 20 62 79 20 55 50 44 41 54 45 20 6f 72  ved by UPDATE or
19a50 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 75 33 32   DELETE */.  u32
19a60 20 2a 61 53 7a 49 6e 73 20 3d 20 30 3b 20 20 20   *aSzIns = 0;   
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a80 53 69 7a 65 73 20 6f 66 20 69 6e 73 65 72 74 65  Sizes of inserte
19a90 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20  d documents */. 
19aa0 20 75 33 32 20 2a 61 53 7a 44 65 6c 3b 20 20 20   u32 *aSzDel;   
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ac0 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 64 65 6c   /* Sizes of del
19ad0 65 74 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a  eted documents *
19ae0 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20  /.  int nChng = 
19af0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19b00 20 20 20 20 2f 2a 20 4e 65 74 20 63 68 61 6e 67      /* Net chang
19b10 65 20 69 6e 20 6e 75 6d 62 65 72 20 6f 66 20 64  e in number of d
19b20 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  ocuments */.  in
19b30 74 20 62 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20  t bInsertDone = 
19b40 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
19b50 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
19b60 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
19b70 20 61 20 22 73 70 65 63 69 61 6c 22 20 49 4e 53   a "special" INS
19b80 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f  ERT operation. O
19b90 6e 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ne of the form:.
19ba0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45    **.  **   INSE
19bb0 52 54 20 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29  RT INTO xyz(xyz)
19bc0 20 56 41 4c 55 45 53 28 27 63 6f 6d 6d 61 6e 64   VALUES('command
19bd0 27 29 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ');.  */.  if( n
19be0 41 72 67 3e 31 20 0a 20 20 20 26 26 20 73 71 6c  Arg>1 .   && sql
19bf0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
19c00 61 70 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54  apVal[0])==SQLIT
19c10 45 5f 4e 55 4c 4c 20 0a 20 20 20 26 26 20 73 71  E_NULL .   && sq
19c20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
19c30 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d  (apVal[p->nColum
19c40 6e 2b 32 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55  n+2])!=SQLITE_NU
19c50 4c 4c 20 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  LL .  ){.    rc 
19c60 3d 20 66 74 73 33 53 70 65 63 69 61 6c 49 6e 73  = fts3SpecialIns
19c70 65 72 74 28 70 2c 20 61 70 56 61 6c 5b 70 2d 3e  ert(p, apVal[p->
19c80 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 3b 0a 20 20 20  nColumn+2]);.   
19c90 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75 74   goto update_out
19ca0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.  }..  /* Allo
19cb0 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 68 6f  cate space to ho
19cc0 6c 64 20 74 68 65 20 63 68 61 6e 67 65 20 69 6e  ld the change in
19cd0 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65 73 20   document sizes 
19ce0 2a 2f 0a 20 20 61 53 7a 49 6e 73 20 3d 20 73 71  */.  aSzIns = sq
19cf0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
19d00 7a 65 6f 66 28 61 53 7a 49 6e 73 5b 30 5d 29 2a  zeof(aSzIns[0])*
19d10 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a 32  (p->nColumn+1)*2
19d20 20 29 3b 0a 20 20 69 66 28 20 61 53 7a 49 6e 73   );.  if( aSzIns
19d30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
19d40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
19d50 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75    goto update_ou
19d60 74 3b 0a 20 20 7d 0a 20 20 61 53 7a 44 65 6c 20  t;.  }.  aSzDel 
19d70 3d 20 26 61 53 7a 49 6e 73 5b 70 2d 3e 6e 43 6f  = &aSzIns[p->nCo
19d80 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d 65 6d 73 65  lumn+1];.  memse
19d90 74 28 61 53 7a 49 6e 73 2c 20 30 2c 20 73 69 7a  t(aSzIns, 0, siz
19da0 65 6f 66 28 61 53 7a 49 6e 73 5b 30 5d 29 2a 28  eof(aSzIns[0])*(
19db0 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a 32 29  p->nColumn+1)*2)
19dc0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
19dd0 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65  is an INSERT ope
19de0 72 61 74 69 6f 6e 2c 20 6f 72 20 61 6e 20 55 50  ration, or an UP
19df0 44 41 54 45 20 74 68 61 74 20 6d 6f 64 69 66 69  DATE that modifi
19e00 65 73 20 74 68 65 20 72 6f 77 69 64 0a 20 20 2a  es the rowid.  *
19e10 2a 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  * value, then th
19e20 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71  is operation req
19e30 75 69 72 65 73 20 63 6f 6e 73 74 72 61 69 6e 74  uires constraint
19e40 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 2a 2a 0a   handling..  **.
19e50 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 6e 2d 63    ** If the on-c
19e60 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20  onflict mode is 
19e70 52 45 50 4c 41 43 45 2c 20 74 68 69 73 20 6d 65  REPLACE, this me
19e80 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 69  ans that the exi
19e90 73 74 69 6e 67 20 72 6f 77 0a 20 20 2a 2a 20 73  sting row.  ** s
19ea0 68 6f 75 6c 64 20 62 65 20 64 65 6c 65 74 65 64  hould be deleted
19eb0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
19ec0 73 65 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74  se before insert
19ed0 69 6e 67 20 74 68 65 20 6e 65 77 20 72 6f 77 2e  ing the new row.
19ee0 20 4f 72 2c 0a 20 20 2a 2a 20 69 66 20 74 68 65   Or,.  ** if the
19ef0 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64   on-conflict mod
19f00 65 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20  e is other than 
19f10 52 45 50 4c 41 43 45 2c 20 74 68 65 6e 20 74 68  REPLACE, then th
19f20 69 73 20 6d 65 74 68 6f 64 20 6d 75 73 74 0a 20  is method must. 
19f30 20 2a 2a 20 64 65 74 65 63 74 20 74 68 65 20 63   ** detect the c
19f40 6f 6e 66 6c 69 63 74 20 61 6e 64 20 72 65 74 75  onflict and retu
19f50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
19f60 41 49 4e 54 20 62 65 66 6f 72 65 20 62 65 67 69  AINT before begi
19f70 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 6d 6f  nning to.  ** mo
19f80 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
19f90 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
19fa0 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20  f( nArg>1 ){.   
19fb0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 76 61 6c   /* Find the val
19fc0 75 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  ue object that h
19fd0 6f 6c 64 73 20 74 68 65 20 6e 65 77 20 72 6f 77  olds the new row
19fe0 69 64 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  id value. */.   
19ff0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1a000 70 4e 65 77 52 6f 77 69 64 20 3d 20 61 70 56 61  pNewRowid = apVa
1a010 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 3b  l[3+p->nColumn];
1a020 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a030 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e 65 77  _value_type(pNew
1a040 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 4e  Rowid)==SQLITE_N
1a050 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ULL ){.      pNe
1a060 77 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 31  wRowid = apVal[1
1a070 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ];.    }..    if
1a080 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
1a090 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29 21  type(pNewRowid)!
1a0a0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 26 26 20  =SQLITE_NULL && 
1a0b0 28 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ( .        sqlit
1a0c0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
1a0d0 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  Val[0])==SQLITE_
1a0e0 4e 55 4c 4c 0a 20 20 20 20 20 7c 7c 20 73 71 6c  NULL.     || sql
1a0f0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
1a100 28 61 70 56 61 6c 5b 30 5d 29 21 3d 73 71 6c 69  (apVal[0])!=sqli
1a110 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
1a120 70 4e 65 77 52 6f 77 69 64 29 0a 20 20 20 20 29  pNewRowid).    )
1a130 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1a140 6e 65 77 20 72 6f 77 69 64 20 69 73 20 6e 6f 74  new rowid is not
1a150 20 4e 55 4c 4c 20 28 69 6e 20 74 68 69 73 20 63   NULL (in this c
1a160 61 73 65 20 74 68 65 20 72 6f 77 69 64 20 77 69  ase the rowid wi
1a170 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  ll be.      ** a
1a180 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 73  utomatically ass
1a190 69 67 6e 65 64 20 61 6e 64 20 74 68 65 72 65 20  igned and there 
1a1a0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 6f 66 20  is no chance of 
1a1b0 61 20 63 6f 6e 66 6c 69 63 74 29 2c 20 61 6e 64  a conflict), and
1a1c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73   .      ** the s
1a1d0 74 61 74 65 6d 65 6e 74 20 69 73 20 65 69 74 68  tatement is eith
1a1e0 65 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  er an INSERT or 
1a1f0 61 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 6d  an UPDATE that m
1a200 6f 64 69 66 69 65 73 20 74 68 65 0a 20 20 20 20  odifies the.    
1a210 20 20 2a 2a 20 72 6f 77 69 64 20 63 6f 6c 75 6d    ** rowid colum
1a220 6e 2e 20 53 6f 20 69 66 20 74 68 65 20 63 6f 6e  n. So if the con
1a230 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20 52 45  flict mode is RE
1a240 50 4c 41 43 45 2c 20 74 68 65 6e 20 64 65 6c 65  PLACE, then dele
1a250 74 65 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  te any.      ** 
1a260 65 78 69 73 74 69 6e 67 20 72 6f 77 20 77 69 74  existing row wit
1a270 68 20 72 6f 77 69 64 3d 70 4e 65 77 52 6f 77 69  h rowid=pNewRowi
1a280 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d. .      **.   
1a290 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65     ** Or, if the
1a2a0 20 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69   conflict mode i
1a2b0 73 20 6e 6f 74 20 52 45 50 4c 41 43 45 2c 20 69  s not REPLACE, i
1a2c0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 65  nsert the new re
1a2d0 63 6f 72 64 20 69 6e 74 6f 20 0a 20 20 20 20 20  cord into .     
1a2e0 20 2a 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e   ** the %_conten
1a2f0 74 20 74 61 62 6c 65 2e 20 49 66 20 77 65 20 68  t table. If we h
1a300 69 74 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  it the duplicate
1a310 20 72 6f 77 69 64 20 63 6f 6e 73 74 72 61 69 6e   rowid constrain
1a320 74 20 28 6f 72 20 61 6e 79 0a 20 20 20 20 20 20  t (or any.      
1a330 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 29 20  ** other error) 
1a340 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20  while doing so, 
1a350 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
1a360 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ly..      **.   
1a370 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
1a380 68 20 6d 61 79 20 61 6c 73 6f 20 72 75 6e 20 69  h may also run i
1a390 66 20 70 4e 65 77 52 6f 77 69 64 20 63 6f 6e 74  f pNewRowid cont
1a3a0 61 69 6e 73 20 61 20 76 61 6c 75 65 20 74 68 61  ains a value tha
1a3b0 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a  t cannot.      *
1a3c0 2a 20 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20  * be losslessly 
1a3d0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 6e 20  converted to an 
1a3e0 69 6e 74 65 67 65 72 2e 20 49 6e 20 74 68 69 73  integer. In this
1a3f0 20 63 61 73 65 2c 20 74 68 65 20 65 76 65 6e 74   case, the event
1a400 75 61 6c 20 0a 20 20 20 20 20 20 2a 2a 20 63 61  ual .      ** ca
1a410 6c 6c 20 74 6f 20 66 74 73 33 49 6e 73 65 72 74  ll to fts3Insert
1a420 44 61 74 61 28 29 20 28 65 69 74 68 65 72 20 6a  Data() (either j
1a430 75 73 74 20 62 65 6c 6f 77 20 6f 72 20 66 75 72  ust below or fur
1a440 74 68 65 72 20 6f 6e 20 69 6e 20 74 68 69 73 0a  ther on in this.
1a450 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
1a460 6e 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 53  n) will return S
1a470 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 2e 20  QLITE_MISMATCH. 
1a480 49 66 20 66 74 73 33 44 65 6c 65 74 65 42 79 52  If fts3DeleteByR
1a490 6f 77 69 64 20 69 73 20 0a 20 20 20 20 20 20 2a  owid is .      *
1a4a0 2a 20 69 6e 76 6f 6b 65 64 2c 20 69 74 20 77 69  * invoked, it wi
1a4b0 6c 6c 20 64 65 6c 65 74 65 20 7a 65 72 6f 20 72  ll delete zero r
1a4c0 6f 77 73 20 28 73 69 6e 63 65 20 6e 6f 20 72 6f  ows (since no ro
1a4d0 77 20 77 69 6c 6c 20 68 61 76 65 0a 20 20 20 20  w will have.    
1a4e0 20 20 2a 2a 20 64 6f 63 69 64 3d 24 70 4e 65 77    ** docid=$pNew
1a4f0 52 6f 77 69 64 20 69 66 20 24 70 4e 65 77 52 6f  Rowid if $pNewRo
1a500 77 69 64 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  wid is not an in
1a510 74 65 67 65 72 20 76 61 6c 75 65 29 2e 0a 20 20  teger value)..  
1a520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1a530 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e   sqlite3_vtab_on
1a540 5f 63 6f 6e 66 6c 69 63 74 28 70 2d 3e 64 62 29  _conflict(p->db)
1a550 3d 3d 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  ==SQLITE_REPLACE
1a560 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a570 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77   fts3DeleteByRow
1a580 69 64 28 70 2c 20 70 4e 65 77 52 6f 77 69 64 2c  id(p, pNewRowid,
1a590 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c 29   &nChng, aSzDel)
1a5a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a5b0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
1a5c0 49 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61 70  InsertData(p, ap
1a5d0 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20  Val, pRowid);.  
1a5e0 20 20 20 20 20 20 62 49 6e 73 65 72 74 44 6f 6e        bInsertDon
1a5f0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
1a600 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1a610 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a620 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
1a630 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  out;.  }..  /* I
1a640 66 20 74 68 69 73 20 69 73 20 61 20 44 45 4c 45  f this is a DELE
1a650 54 45 20 6f 72 20 55 50 44 41 54 45 20 6f 70 65  TE or UPDATE ope
1a660 72 61 74 69 6f 6e 2c 20 72 65 6d 6f 76 65 20 74  ration, remove t
1a670 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e 20 2a  he old record. *
1a680 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
1a690 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
1a6a0 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])!=SQLITE_NUL
1a6b0 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  L ){.    assert(
1a6c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1a6d0 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d 3d 53  ype(apVal[0])==S
1a6e0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 3b  QLITE_INTEGER );
1a6f0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65  .    rc = fts3De
1a700 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20 61  leteByRowid(p, a
1a710 70 56 61 6c 5b 30 5d 2c 20 26 6e 43 68 6e 67 2c  pVal[0], &nChng,
1a720 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 69 73   aSzDel);.    is
1a730 52 65 6d 6f 76 65 20 3d 20 31 3b 0a 20 20 20 20  Remove = 1;.    
1a740 69 52 65 6d 6f 76 65 20 3d 20 73 71 6c 69 74 65  iRemove = sqlite
1a750 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
1a760 56 61 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 0a  Val[0]);.  }.  .
1a770 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a780 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44  an INSERT or UPD
1a790 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ATE operation, i
1a7a0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 65  nsert the new re
1a7b0 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  cord. */.  if( n
1a7c0 41 72 67 3e 31 20 26 26 20 72 63 3d 3d 53 51 4c  Arg>1 && rc==SQL
1a7d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1a7e0 28 20 62 49 6e 73 65 72 74 44 6f 6e 65 3d 3d 30  ( bInsertDone==0
1a7f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
1a800 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 70 2c  ts3InsertData(p,
1a810 20 61 70 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b   apVal, pRowid);
1a820 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1a830 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1a840 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
1a850 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20  ORRUPT_VTAB;.   
1a860 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1a870 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 21 69 73  QLITE_OK && (!is
1a880 52 65 6d 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69  Remove || *pRowi
1a890 64 21 3d 69 52 65 6d 6f 76 65 29 20 29 7b 0a 20  d!=iRemove) ){. 
1a8a0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65       rc = fts3Pe
1a8b0 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28  ndingTermsDocid(
1a8c0 70 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20 20 20  p, *pRowid);.   
1a8d0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1a8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a8f0 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72    rc = fts3Inser
1a900 74 54 65 72 6d 73 28 70 2c 20 61 70 56 61 6c 2c  tTerms(p, apVal,
1a910 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d 0a   aSzIns);.    }.
1a920 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44      if( p->bHasD
1a930 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ocsize ){.      
1a940 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69 7a  fts3InsertDocsiz
1a950 65 28 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73  e(&rc, p, aSzIns
1a960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68  );.    }.    nCh
1a970 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ng++;.  }..  if(
1a980 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a   p->bHasStat ){.
1a990 20 20 20 20 66 74 73 33 55 70 64 61 74 65 44 6f      fts3UpdateDo
1a9a0 63 54 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20  cTotals(&rc, p, 
1a9b0 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20  aSzIns, aSzDel, 
1a9c0 6e 43 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20 75 70  nChng);.  }.. up
1a9d0 64 61 74 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  date_out:.  sqli
1a9e0 74 65 33 5f 66 72 65 65 28 61 53 7a 49 6e 73 29  te3_free(aSzIns)
1a9f0 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  ;.  sqlite3Fts3S
1aa00 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b  egmentsClose(p);
1aa10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1aa20 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ./* .** Flush an
1aa30 79 20 64 61 74 61 20 69 6e 20 74 68 65 20 70 65  y data in the pe
1aa40 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
1aa50 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20   table to disk. 
1aa60 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
1aa70 2a 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  * merge all segm
1aa80 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
1aa90 62 61 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20  base (including 
1aaa0 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c  the new segment,
1aab0 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61   if .** there wa
1aac0 73 20 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c  s any data to fl
1aad0 75 73 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67  ush) into a sing
1aae0 6c 65 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a  le segment. .*/.
1aaf0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f  int sqlite3Fts3O
1ab00 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c  ptimize(Fts3Tabl
1ab10 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1ab20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1ab30 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56  exec(p->db, "SAV
1ab40 45 50 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c  EPOINT fts3", 0,
1ab50 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
1ab60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ab70 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70     rc = fts3DoOp
1ab80 74 69 6d 69 7a 65 28 70 2c 20 31 29 3b 0a 20 20  timize(p, 1);.  
1ab90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aba0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
1abb0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1abc0 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65  int rc2 = sqlite
1abd0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52  3_exec(p->db, "R
1abe0 45 4c 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c  ELEASE fts3", 0,
1abf0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1ac00 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
1ac10 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20   ) rc = rc2;.   
1ac20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1ac30 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1ac40 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66  , "ROLLBACK TO f
1ac50 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ts3", 0, 0, 0);.
1ac60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1ac70 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41  ec(p->db, "RELEA
1ac80 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20  SE fts3", 0, 0, 
1ac90 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
1aca0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
1acb0 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72  ntsClose(p);.  r
1acc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
1acd0 64 69 66 0a                                      dif.