/ Hex Artifact Content
Login

Artifact 4bec8a1b3905978b22a67bca5f4a3cfdb94af234cf51efb36f4f2d733d278634:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** 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 2f 0a 0a 0a 0a 23  *****.**.*/....#
0180: 69 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74  include "fts5Int
0190: 2e 68 22 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .h"..struct Fts5
01a0: 53 74 6f 72 61 67 65 20 7b 0a 20 20 46 74 73 35  Storage {.  Fts5
01b0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b  Config *pConfig;
01c0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
01d0: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 62 54 6f 74  ndex;.  int bTot
01e0: 61 6c 73 56 61 6c 69 64 3b 20 20 20 20 20 20 20  alsValid;       
01f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0200: 69 66 20 6e 54 6f 74 61 6c 52 6f 77 2f 61 54 6f  if nTotalRow/aTo
0210: 74 61 6c 53 69 7a 65 5b 5d 20 61 72 65 20 76 61  talSize[] are va
0220: 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 6e 54 6f  lid */.  i64 nTo
0230: 74 61 6c 52 6f 77 3b 20 20 20 20 20 20 20 20 20  talRow;         
0240: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
0250: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  l number of rows
0260: 20 69 6e 20 46 54 53 20 74 61 62 6c 65 20 2a 2f   in FTS table */
0270: 0a 20 20 69 36 34 20 2a 61 54 6f 74 61 6c 53 69  .  i64 *aTotalSi
0280: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
0290: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
02a0: 73 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  s of each column
02b0: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 73   */ .  sqlite3_s
02c0: 74 6d 74 20 2a 61 53 74 6d 74 5b 31 31 5d 3b 0a  tmt *aStmt[11];.
02d0: 7d 3b 0a 0a 0a 23 69 66 20 46 54 53 35 5f 53 54  };...#if FTS5_ST
02e0: 4d 54 5f 53 43 41 4e 5f 41 53 43 21 3d 30 20 0a  MT_SCAN_ASC!=0 .
02f0: 23 20 65 72 72 6f 72 20 22 46 54 53 35 5f 53 54  # error "FTS5_ST
0300: 4d 54 5f 53 43 41 4e 5f 41 53 43 20 6d 69 73 6d  MT_SCAN_ASC mism
0310: 61 74 63 68 22 20 0a 23 65 6e 64 69 66 0a 23 69  atch" .#endif.#i
0320: 66 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e  f FTS5_STMT_SCAN
0330: 5f 44 45 53 43 21 3d 31 20 0a 23 20 65 72 72 6f  _DESC!=1 .# erro
0340: 72 20 22 46 54 53 35 5f 53 54 4d 54 5f 53 43 41  r "FTS5_STMT_SCA
0350: 4e 5f 44 45 53 43 20 6d 69 73 6d 61 74 63 68 22  N_DESC mismatch"
0360: 20 0a 23 65 6e 64 69 66 0a 23 69 66 20 46 54 53   .#endif.#if FTS
0370: 35 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 21 3d 32  5_STMT_LOOKUP!=2
0380: 0a 23 20 65 72 72 6f 72 20 22 46 54 53 35 5f 53  .# error "FTS5_S
0390: 54 4d 54 5f 4c 4f 4f 4b 55 50 20 6d 69 73 6d 61  TMT_LOOKUP misma
03a0: 74 63 68 22 20 0a 23 65 6e 64 69 66 0a 0a 23 64  tch" .#endif..#d
03b0: 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54 5f  efine FTS5_STMT_
03c0: 49 4e 53 45 52 54 5f 43 4f 4e 54 45 4e 54 20 20  INSERT_CONTENT  
03d0: 33 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  3.#define FTS5_S
03e0: 54 4d 54 5f 52 45 50 4c 41 43 45 5f 43 4f 4e 54  TMT_REPLACE_CONT
03f0: 45 4e 54 20 34 0a 23 64 65 66 69 6e 65 20 46 54  ENT 4.#define FT
0400: 53 35 5f 53 54 4d 54 5f 44 45 4c 45 54 45 5f 43  S5_STMT_DELETE_C
0410: 4f 4e 54 45 4e 54 20 20 35 0a 23 64 65 66 69 6e  ONTENT  5.#defin
0420: 65 20 46 54 53 35 5f 53 54 4d 54 5f 52 45 50 4c  e FTS5_STMT_REPL
0430: 41 43 45 5f 44 4f 43 53 49 5a 45 20 20 36 0a 23  ACE_DOCSIZE  6.#
0440: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54  define FTS5_STMT
0450: 5f 44 45 4c 45 54 45 5f 44 4f 43 53 49 5a 45 20  _DELETE_DOCSIZE 
0460: 20 37 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f   7.#define FTS5_
0470: 53 54 4d 54 5f 4c 4f 4f 4b 55 50 5f 44 4f 43 53  STMT_LOOKUP_DOCS
0480: 49 5a 45 20 20 38 0a 23 64 65 66 69 6e 65 20 46  IZE  8.#define F
0490: 54 53 35 5f 53 54 4d 54 5f 52 45 50 4c 41 43 45  TS5_STMT_REPLACE
04a0: 5f 43 4f 4e 46 49 47 20 39 0a 23 64 65 66 69 6e  _CONFIG 9.#defin
04b0: 65 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e  e FTS5_STMT_SCAN
04c0: 20 31 30 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61   10../*.** Prepa
04d0: 72 65 20 74 68 65 20 74 77 6f 20 69 6e 73 65 72  re the two inser
04e0: 74 20 73 74 61 74 65 6d 65 6e 74 73 20 2d 20 46  t statements - F
04f0: 74 73 35 53 74 6f 72 61 67 65 2e 70 49 6e 73 65  ts5Storage.pInse
0500: 72 74 43 6f 6e 74 65 6e 74 20 61 6e 64 0a 2a 2a  rtContent and.**
0510: 20 46 74 73 35 53 74 6f 72 61 67 65 2e 70 49 6e   Fts5Storage.pIn
0520: 73 65 72 74 44 6f 63 73 69 7a 65 20 2d 20 69 66  sertDocsize - if
0530: 20 74 68 65 79 20 68 61 76 65 20 6e 6f 74 20 61   they have not a
0540: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
0550: 61 72 65 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ared..** Return 
0560: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
0570: 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
0580: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
0590: 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   if an error.** 
05a0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
05b0: 63 20 69 6e 74 20 66 74 73 35 53 74 6f 72 61 67  c int fts5Storag
05c0: 65 47 65 74 53 74 6d 74 28 0a 20 20 46 74 73 35  eGetStmt(.  Fts5
05d0: 53 74 6f 72 61 67 65 20 2a 70 2c 20 20 20 20 20  Storage *p,     
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
05f0: 74 6f 72 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f  torage handle */
0600: 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c 20 20 20  .  int eStmt,   
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0620: 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 4d 54 5f     /* FTS5_STMT_
0630: 58 58 58 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  XXX constant */.
0640: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
0650: 2a 70 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20  *ppStmt,        
0660: 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65 70 61 72    /* OUT: Prepar
0670: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e  ed statement han
0680: 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  dle */.  char **
0690: 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
06a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
06b0: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
06c0: 69 66 20 61 6e 79 29 20 2a 2f 0a 29 7b 0a 20 20  if any) */.){.  
06d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
06e0: 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  OK;..  /* If the
06f0: 72 65 20 69 73 20 6e 6f 20 25 5f 64 6f 63 73 69  re is no %_docsi
0700: 7a 65 20 74 61 62 6c 65 2c 20 74 68 65 72 65 20  ze table, there 
0710: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 20 72 65 71  should be no req
0720: 75 65 73 74 73 20 66 6f 72 20 0a 20 20 2a 2a 20  uests for .  ** 
0730: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 70  statements to op
0740: 65 72 61 74 65 20 6f 6e 20 69 74 2e 20 20 2a 2f  erate on it.  */
0750: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
0760: 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75 6d 6e 73 69  onfig->bColumnsi
0770: 7a 65 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20  ze || (.        
0780: 65 53 74 6d 74 21 3d 46 54 53 35 5f 53 54 4d 54  eStmt!=FTS5_STMT
0790: 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45  _REPLACE_DOCSIZE
07a0: 20 0a 20 20 20 20 20 26 26 20 65 53 74 6d 74 21   .     && eStmt!
07b0: 3d 46 54 53 35 5f 53 54 4d 54 5f 44 45 4c 45 54  =FTS5_STMT_DELET
07c0: 45 5f 44 4f 43 53 49 5a 45 20 0a 20 20 20 20 20  E_DOCSIZE .     
07d0: 26 26 20 65 53 74 6d 74 21 3d 46 54 53 35 5f 53  && eStmt!=FTS5_S
07e0: 54 4d 54 5f 4c 4f 4f 4b 55 50 5f 44 4f 43 53 49  TMT_LOOKUP_DOCSI
07f0: 5a 45 20 0a 20 20 29 29 3b 0a 0a 20 20 61 73 73  ZE .  ));..  ass
0800: 65 72 74 28 20 65 53 74 6d 74 3e 3d 30 20 26 26  ert( eStmt>=0 &&
0810: 20 65 53 74 6d 74 3c 41 72 72 61 79 53 69 7a 65   eStmt<ArraySize
0820: 28 70 2d 3e 61 53 74 6d 74 29 20 29 3b 0a 20 20  (p->aStmt) );.  
0830: 69 66 28 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74  if( p->aStmt[eSt
0840: 6d 74 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  mt]==0 ){.    co
0850: 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 74 6d 74  nst char *azStmt
0860: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 53 45  [] = {.      "SE
0870: 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20  LECT %s FROM %s 
0880: 54 20 57 48 45 52 45 20 54 2e 25 51 20 3e 3d 20  T WHERE T.%Q >= 
0890: 3f 20 41 4e 44 20 54 2e 25 51 20 3c 3d 20 3f 20  ? AND T.%Q <= ? 
08a0: 4f 52 44 45 52 20 42 59 20 54 2e 25 51 20 41 53  ORDER BY T.%Q AS
08b0: 43 22 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  C",.      "SELEC
08c0: 54 20 25 73 20 46 52 4f 4d 20 25 73 20 54 20 57  T %s FROM %s T W
08d0: 48 45 52 45 20 54 2e 25 51 20 3c 3d 20 3f 20 41  HERE T.%Q <= ? A
08e0: 4e 44 20 54 2e 25 51 20 3e 3d 20 3f 20 4f 52 44  ND T.%Q >= ? ORD
08f0: 45 52 20 42 59 20 54 2e 25 51 20 44 45 53 43 22  ER BY T.%Q DESC"
0900: 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  ,.      "SELECT 
0910: 25 73 20 46 52 4f 4d 20 25 73 20 54 20 57 48 45  %s FROM %s T WHE
0920: 52 45 20 54 2e 25 51 3d 3f 22 2c 20 20 20 20 20  RE T.%Q=?",     
0930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 4f            /* LOO
0940: 4b 55 50 20 20 2a 2f 0a 0a 20 20 20 20 20 20 22  KUP  */..      "
0950: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 27  INSERT INTO %Q.'
0960: 25 71 5f 63 6f 6e 74 65 6e 74 27 20 56 41 4c 55  %q_content' VALU
0970: 45 53 28 25 73 29 22 2c 20 20 20 20 20 20 20 20  ES(%s)",        
0980: 20 2f 2a 20 49 4e 53 45 52 54 5f 43 4f 4e 54 45   /* INSERT_CONTE
0990: 4e 54 20 20 2a 2f 0a 20 20 20 20 20 20 22 52 45  NT  */.      "RE
09a0: 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25  PLACE INTO %Q.'%
09b0: 71 5f 63 6f 6e 74 65 6e 74 27 20 56 41 4c 55 45  q_content' VALUE
09c0: 53 28 25 73 29 22 2c 20 20 20 20 20 20 20 20 2f  S(%s)",        /
09d0: 2a 20 52 45 50 4c 41 43 45 5f 43 4f 4e 54 45 4e  * REPLACE_CONTEN
09e0: 54 20 2a 2f 0a 20 20 20 20 20 20 22 44 45 4c 45  T */.      "DELE
09f0: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63  TE FROM %Q.'%q_c
0a00: 6f 6e 74 65 6e 74 27 20 57 48 45 52 45 20 69 64  ontent' WHERE id
0a10: 3d 3f 22 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  =?",         /* 
0a20: 44 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 20 20  DELETE_CONTENT  
0a30: 2a 2f 0a 20 20 20 20 20 20 22 52 45 50 4c 41 43  */.      "REPLAC
0a40: 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 64 6f  E INTO %Q.'%q_do
0a50: 63 73 69 7a 65 27 20 56 41 4c 55 45 53 28 3f 2c  csize' VALUES(?,
0a60: 3f 29 22 2c 20 20 20 20 20 20 20 2f 2a 20 52 45  ?)",       /* RE
0a70: 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 20 20 2a  PLACE_DOCSIZE  *
0a80: 2f 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  /.      "DELETE 
0a90: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73  FROM %Q.'%q_docs
0aa0: 69 7a 65 27 20 57 48 45 52 45 20 69 64 3d 3f 22  ize' WHERE id=?"
0ab0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c  ,         /* DEL
0ac0: 45 54 45 5f 44 4f 43 53 49 5a 45 20 20 2a 2f 0a  ETE_DOCSIZE  */.
0ad0: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73  .      "SELECT s
0ae0: 7a 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64 6f  z FROM %Q.'%q_do
0af0: 63 73 69 7a 65 27 20 57 48 45 52 45 20 69 64 3d  csize' WHERE id=
0b00: 3f 22 2c 20 20 20 20 20 20 2f 2a 20 4c 4f 4f 4b  ?",      /* LOOK
0b10: 55 50 5f 44 4f 43 53 49 5a 45 20 20 2a 2f 0a 0a  UP_DOCSIZE  */..
0b20: 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49        "REPLACE I
0b30: 4e 54 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 66 69  NTO %Q.'%q_confi
0b40: 67 27 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c  g' VALUES(?,?)",
0b50: 20 20 20 20 20 20 20 20 2f 2a 20 52 45 50 4c 41          /* REPLA
0b60: 43 45 5f 43 4f 4e 46 49 47 20 2a 2f 0a 20 20 20  CE_CONFIG */.   
0b70: 20 20 20 22 53 45 4c 45 43 54 20 25 73 20 46 52     "SELECT %s FR
0b80: 4f 4d 20 25 73 20 41 53 20 54 22 2c 20 20 20 20  OM %s AS T",    
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 20 20 20 2f 2a 20 53 43 41 4e 20 2a 2f 0a       /* SCAN */.
0bb0: 20 20 20 20 7d 3b 0a 20 20 20 20 46 74 73 35 43      };.    Fts5C
0bc0: 6f 6e 66 69 67 20 2a 70 43 20 3d 20 70 2d 3e 70  onfig *pC = p->p
0bd0: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72  Config;.    char
0be0: 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 0a 20 20 20   *zSql = 0;..   
0bf0: 20 73 77 69 74 63 68 28 20 65 53 74 6d 74 20 29   switch( eStmt )
0c00: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53  {.      case FTS
0c10: 35 5f 53 54 4d 54 5f 53 43 41 4e 3a 0a 20 20 20  5_STMT_SCAN:.   
0c20: 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
0c30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 74  te3_mprintf(azSt
0c40: 6d 74 5b 65 53 74 6d 74 5d 2c 20 0a 20 20 20 20  mt[eStmt], .    
0c50: 20 20 20 20 20 20 20 20 70 43 2d 3e 7a 43 6f 6e          pC->zCon
0c60: 74 65 6e 74 45 78 70 72 6c 69 73 74 2c 20 70 43  tentExprlist, pC
0c70: 2d 3e 7a 43 6f 6e 74 65 6e 74 0a 20 20 20 20 20  ->zContent.     
0c80: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72     );.        br
0c90: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
0ca0: 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e 5f   FTS5_STMT_SCAN_
0cb0: 41 53 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ASC:.      case 
0cc0: 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e 5f 44  FTS5_STMT_SCAN_D
0cd0: 45 53 43 3a 0a 20 20 20 20 20 20 20 20 7a 53 71  ESC:.        zSq
0ce0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
0cf0: 6e 74 66 28 61 7a 53 74 6d 74 5b 65 53 74 6d 74  ntf(azStmt[eStmt
0d00: 5d 2c 20 70 43 2d 3e 7a 43 6f 6e 74 65 6e 74 45  ], pC->zContentE
0d10: 78 70 72 6c 69 73 74 2c 20 0a 20 20 20 20 20 20  xprlist, .      
0d20: 20 20 20 20 20 20 70 43 2d 3e 7a 43 6f 6e 74 65        pC->zConte
0d30: 6e 74 2c 20 70 43 2d 3e 7a 43 6f 6e 74 65 6e 74  nt, pC->zContent
0d40: 52 6f 77 69 64 2c 20 70 43 2d 3e 7a 43 6f 6e 74  Rowid, pC->zCont
0d50: 65 6e 74 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  entRowid,.      
0d60: 20 20 20 20 20 20 70 43 2d 3e 7a 43 6f 6e 74 65        pC->zConte
0d70: 6e 74 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20  ntRowid.        
0d80: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
0d90: 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 46 54  ;..      case FT
0da0: 53 35 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 3a 0a  S5_STMT_LOOKUP:.
0db0: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
0dc0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
0dd0: 7a 53 74 6d 74 5b 65 53 74 6d 74 5d 2c 20 0a 20  zStmt[eStmt], . 
0de0: 20 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 7a             pC->z
0df0: 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 2c  ContentExprlist,
0e00: 20 70 43 2d 3e 7a 43 6f 6e 74 65 6e 74 2c 20 70   pC->zContent, p
0e10: 43 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64  C->zContentRowid
0e20: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
0e30: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
0e40: 20 20 63 61 73 65 20 46 54 53 35 5f 53 54 4d 54    case FTS5_STMT
0e50: 5f 49 4e 53 45 52 54 5f 43 4f 4e 54 45 4e 54 3a  _INSERT_CONTENT:
0e60: 20 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53   .      case FTS
0e70: 35 5f 53 54 4d 54 5f 52 45 50 4c 41 43 45 5f 43  5_STMT_REPLACE_C
0e80: 4f 4e 54 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20  ONTENT: {.      
0e90: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 43 2d    int nCol = pC-
0ea0: 3e 6e 43 6f 6c 20 2b 20 31 3b 0a 20 20 20 20 20  >nCol + 1;.     
0eb0: 20 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 3b 0a     char *zBind;.
0ec0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a          int i;..
0ed0: 20 20 20 20 20 20 20 20 7a 42 69 6e 64 20 3d 20          zBind = 
0ee0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 31  sqlite3_malloc(1
0ef0: 20 2b 20 6e 43 6f 6c 2a 32 29 3b 0a 20 20 20 20   + nCol*2);.    
0f00: 20 20 20 20 69 66 28 20 7a 42 69 6e 64 20 29 7b      if( zBind ){
0f10: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
0f20: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
0f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 42  {.            zB
0f40: 69 6e 64 5b 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a  ind[i*2] = '?';.
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 69 6e              zBin
0f60: 64 5b 69 2a 32 20 2b 20 31 5d 20 3d 20 27 2c 27  d[i*2 + 1] = ','
0f70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
0f80: 20 20 20 20 20 20 20 20 7a 42 69 6e 64 5b 69 2a          zBind[i*
0f90: 32 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  2-1] = '\0';.   
0fa0: 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
0fb0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a  lite3_mprintf(az
0fc0: 53 74 6d 74 5b 65 53 74 6d 74 5d 2c 20 70 43 2d  Stmt[eStmt], pC-
0fd0: 3e 7a 44 62 2c 20 70 43 2d 3e 7a 4e 61 6d 65 2c  >zDb, pC->zName,
0fe0: 20 7a 42 69 6e 64 29 3b 0a 20 20 20 20 20 20 20   zBind);.       
0ff0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1000: 7a 42 69 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  zBind);.        
1010: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1020: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1030: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
1040: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1050: 6d 70 72 69 6e 74 66 28 61 7a 53 74 6d 74 5b 65  mprintf(azStmt[e
1060: 53 74 6d 74 5d 2c 20 70 43 2d 3e 7a 44 62 2c 20  Stmt], pC->zDb, 
1070: 70 43 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  pC->zName);.    
1080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1090: 0a 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ..    if( zSql==
10a0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
10b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
10d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
10e0: 61 72 65 5f 76 33 28 70 43 2d 3e 64 62 2c 20 7a  are_v3(pC->db, z
10f0: 53 71 6c 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20  Sql, -1,.       
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52         SQLITE_PR
1120: 45 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54  EPARE_PERSISTENT
1130: 2c 20 26 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d  , &p->aStmt[eStm
1140: 74 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  t], 0);.      sq
1150: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
1160: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1170: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 7a 45  SQLITE_OK && pzE
1180: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
1190: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
11a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
11b0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
11c0: 67 28 70 43 2d 3e 64 62 29 29 3b 0a 20 20 20 20  g(pC->db));.    
11d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
11e0: 20 2a 70 70 53 74 6d 74 20 3d 20 70 2d 3e 61 53   *ppStmt = p->aS
11f0: 74 6d 74 5b 65 53 74 6d 74 5d 3b 0a 20 20 73 71  tmt[eStmt];.  sq
1200: 6c 69 74 65 33 5f 72 65 73 65 74 28 2a 70 70 53  lite3_reset(*ppS
1210: 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tmt);.  return r
1220: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  c;.}...static in
1230: 74 20 66 74 73 35 45 78 65 63 50 72 69 6e 74 66  t fts5ExecPrintf
1240: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1250: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 2c  .  char **pzErr,
1260: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1270: 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b  Format,.  ....){
1280: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
1290: 6c 69 73 74 20 61 70 3b 20 20 20 20 20 20 20 20  list ap;        
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b0: 2e 2e 2e 20 70 72 69 6e 74 66 20 61 72 67 75 6d  ... printf argum
12c0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
12d0: 7a 53 71 6c 3b 0a 0a 20 20 76 61 5f 73 74 61 72  zSql;..  va_star
12e0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
12f0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1300: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
1310: 74 2c 20 61 70 29 3b 0a 0a 20 20 69 66 28 20 7a  t, ap);..  if( z
1320: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Sql==0 ){.    rc
1330: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1340: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1350: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1360: 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
1370: 70 7a 45 72 72 29 3b 0a 20 20 20 20 73 71 6c 69  pzErr);.    sqli
1380: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
1390: 20 20 7d 0a 0a 20 20 76 61 5f 65 6e 64 28 61 70    }..  va_end(ap
13a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 6c  }../*.** Drop al
13c0: 6c 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 2e  l shadow tables.
13d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
13e0: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  K if successful 
13f0: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1400: 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
1410: 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
1420: 69 74 65 33 46 74 73 35 44 72 6f 70 41 6c 6c 28  ite3Fts5DropAll(
1430: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1440: 66 69 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  fig){.  int rc =
1450: 20 66 74 73 35 45 78 65 63 50 72 69 6e 74 66 28   fts5ExecPrintf(
1460: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 30 2c 20  pConfig->db, 0, 
1470: 0a 20 20 20 20 20 20 22 44 52 4f 50 20 54 41 42  .      "DROP TAB
1480: 4c 45 20 49 46 20 45 58 49 53 54 53 20 25 51 2e  LE IF EXISTS %Q.
1490: 27 25 71 5f 64 61 74 61 27 3b 22 0a 20 20 20 20  '%q_data';".    
14a0: 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46    "DROP TABLE IF
14b0: 20 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f 69   EXISTS %Q.'%q_i
14c0: 64 78 27 3b 22 0a 20 20 20 20 20 20 22 44 52 4f  dx';".      "DRO
14d0: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
14e0: 53 20 25 51 2e 27 25 71 5f 63 6f 6e 66 69 67 27  S %Q.'%q_config'
14f0: 3b 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  ;",.      pConfi
1500: 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
1510: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 43  >zName,.      pC
1520: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e  onfig->zDb, pCon
1530: 66 69 67 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  fig->zName,.    
1540: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
1550: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
1560: 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1570: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66  LITE_OK && pConf
1580: 69 67 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20  ig->bColumnsize 
1590: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  ){.    rc = fts5
15a0: 45 78 65 63 50 72 69 6e 74 66 28 70 43 6f 6e 66  ExecPrintf(pConf
15b0: 69 67 2d 3e 64 62 2c 20 30 2c 20 0a 20 20 20 20  ig->db, 0, .    
15c0: 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20      "DROP TABLE 
15d0: 49 46 20 45 58 49 53 54 53 20 25 51 2e 27 25 71  IF EXISTS %Q.'%q
15e0: 5f 64 6f 63 73 69 7a 65 27 3b 22 2c 0a 20 20 20  _docsize';",.   
15f0: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
1600: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
1610: 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69  e.    );.  }.  i
1620: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1630: 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f   && pConfig->eCo
1640: 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54  ntent==FTS5_CONT
1650: 45 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0a 20 20  ENT_NORMAL ){.  
1660: 20 20 72 63 20 3d 20 66 74 73 35 45 78 65 63 50    rc = fts5ExecP
1670: 72 69 6e 74 66 28 70 43 6f 6e 66 69 67 2d 3e 64  rintf(pConfig->d
1680: 62 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 22  b, 0, .        "
1690: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
16a0: 49 53 54 53 20 25 51 2e 27 25 71 5f 63 6f 6e 74  ISTS %Q.'%q_cont
16b0: 65 6e 74 27 3b 22 2c 0a 20 20 20 20 20 20 20 20  ent';",.        
16c0: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
16d0: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
16e0: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
16f0: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76   rc;.}..static v
1700: 6f 69 64 20 66 74 73 35 53 74 6f 72 61 67 65 52  oid fts5StorageR
1710: 65 6e 61 6d 65 4f 6e 65 28 0a 20 20 46 74 73 35  enameOne(.  Fts5
1720: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
1730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1740: 75 72 72 65 6e 74 20 46 54 53 35 20 63 6f 6e 66  urrent FTS5 conf
1750: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  iguration */.  i
1760: 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1780: 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
1790: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
17a0: 63 68 61 72 20 2a 7a 54 61 69 6c 2c 20 20 20 20  char *zTail,    
17b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69            /* Tai
17c0: 6c 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 20  l of table name 
17d0: 65 2e 67 2e 20 22 64 61 74 61 22 2c 20 22 63 6f  e.g. "data", "co
17e0: 6e 66 69 67 22 20 2a 2f 0a 20 20 63 6f 6e 73 74  nfig" */.  const
17f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
1800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1810: 77 20 6e 61 6d 65 20 6f 66 20 46 54 53 35 20 74  w name of FTS5 t
1820: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  able */.){.  if(
1830: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
1840: 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 66   ){.    *pRc = f
1850: 74 73 35 45 78 65 63 50 72 69 6e 74 66 28 70 43  ts5ExecPrintf(pC
1860: 6f 6e 66 69 67 2d 3e 64 62 2c 20 30 2c 20 0a 20  onfig->db, 0, . 
1870: 20 20 20 20 20 20 20 22 41 4c 54 45 52 20 54 41         "ALTER TA
1880: 42 4c 45 20 25 51 2e 27 25 71 5f 25 73 27 20 52  BLE %Q.'%q_%s' R
1890: 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 25 73 27  ENAME TO '%q_%s'
18a0: 3b 22 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 6e  ;",.        pCon
18b0: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
18c0: 67 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61 69 6c 2c  g->zName, zTail,
18d0: 20 7a 4e 61 6d 65 2c 20 7a 54 61 69 6c 0a 20 20   zName, zTail.  
18e0: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20    );.  }.}..int 
18f0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
1900: 67 65 52 65 6e 61 6d 65 28 46 74 73 35 53 74 6f  geRename(Fts5Sto
1910: 72 61 67 65 20 2a 70 53 74 6f 72 61 67 65 2c 20  rage *pStorage, 
1920: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1930: 65 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  e){.  Fts5Config
1940: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 53 74 6f   *pConfig = pSto
1950: 72 61 67 65 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20  rage->pConfig;. 
1960: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1970: 33 46 74 73 35 53 74 6f 72 61 67 65 53 79 6e 63  3Fts5StorageSync
1980: 28 70 53 74 6f 72 61 67 65 29 3b 0a 0a 20 20 66  (pStorage);..  f
1990: 74 73 35 53 74 6f 72 61 67 65 52 65 6e 61 6d 65  ts5StorageRename
19a0: 4f 6e 65 28 70 43 6f 6e 66 69 67 2c 20 26 72 63  One(pConfig, &rc
19b0: 2c 20 22 64 61 74 61 22 2c 20 7a 4e 61 6d 65 29  , "data", zName)
19c0: 3b 0a 20 20 66 74 73 35 53 74 6f 72 61 67 65 52  ;.  fts5StorageR
19d0: 65 6e 61 6d 65 4f 6e 65 28 70 43 6f 6e 66 69 67  enameOne(pConfig
19e0: 2c 20 26 72 63 2c 20 22 69 64 78 22 2c 20 7a 4e  , &rc, "idx", zN
19f0: 61 6d 65 29 3b 0a 20 20 66 74 73 35 53 74 6f 72  ame);.  fts5Stor
1a00: 61 67 65 52 65 6e 61 6d 65 4f 6e 65 28 70 43 6f  ageRenameOne(pCo
1a10: 6e 66 69 67 2c 20 26 72 63 2c 20 22 63 6f 6e 66  nfig, &rc, "conf
1a20: 69 67 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  ig", zName);.  i
1a30: 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62 43 6f 6c  f( pConfig->bCol
1a40: 75 6d 6e 73 69 7a 65 20 29 7b 0a 20 20 20 20 66  umnsize ){.    f
1a50: 74 73 35 53 74 6f 72 61 67 65 52 65 6e 61 6d 65  ts5StorageRename
1a60: 4f 6e 65 28 70 43 6f 6e 66 69 67 2c 20 26 72 63  One(pConfig, &rc
1a70: 2c 20 22 64 6f 63 73 69 7a 65 22 2c 20 7a 4e 61  , "docsize", zNa
1a80: 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  me);.  }.  if( p
1a90: 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74  Config->eContent
1aa0: 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e  ==FTS5_CONTENT_N
1ab0: 4f 52 4d 41 4c 20 29 7b 0a 20 20 20 20 66 74 73  ORMAL ){.    fts
1ac0: 35 53 74 6f 72 61 67 65 52 65 6e 61 6d 65 4f 6e  5StorageRenameOn
1ad0: 65 28 70 43 6f 6e 66 69 67 2c 20 26 72 63 2c 20  e(pConfig, &rc, 
1ae0: 22 63 6f 6e 74 65 6e 74 22 2c 20 7a 4e 61 6d 65  "content", zName
1af0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b00: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
1b10: 61 74 65 20 74 68 65 20 73 68 61 64 6f 77 20 74  ate the shadow t
1b20: 61 62 6c 65 20 6e 61 6d 65 64 20 7a 50 6f 73 74  able named zPost
1b30: 2c 20 77 69 74 68 20 64 65 66 69 6e 69 74 69 6f  , with definitio
1b40: 6e 20 7a 44 65 66 6e 2e 20 52 65 74 75 72 6e 0a  n zDefn. Return.
1b50: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
1b60: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1b70: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1b80: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1b90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1ba0: 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20 20  5CreateTable(.  
1bb0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1bc0: 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  fig,            
1bd0: 2f 2a 20 46 54 53 35 20 63 6f 6e 66 69 67 75 72  /* FTS5 configur
1be0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ation */.  const
1bf0: 20 63 68 61 72 20 2a 7a 50 6f 73 74 2c 20 20 20   char *zPost,   
1c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1c10: 61 64 6f 77 20 74 61 62 6c 65 20 74 6f 20 63 72  adow table to cr
1c20: 65 61 74 65 20 28 65 2e 67 2e 20 22 63 6f 6e 74  eate (e.g. "cont
1c30: 65 6e 74 22 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  ent") */.  const
1c40: 20 63 68 61 72 20 2a 7a 44 65 66 6e 2c 20 20 20   char *zDefn,   
1c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1c60: 6c 75 6d 6e 73 20 65 74 63 2e 20 66 6f 72 20 73  lumns etc. for s
1c70: 68 61 64 6f 77 20 74 61 62 6c 65 20 2a 2f 0a 20  hadow table */. 
1c80: 20 69 6e 74 20 62 57 69 74 68 6f 75 74 2c 20 20   int bWithout,  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77 69 74   /* True for wit
1cb0: 68 6f 75 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20  hout rowid */.  
1cc0: 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20  char **pzErr    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65  /* OUT: Error me
1cf0: 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ssage */.){.  in
1d00: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
1d10: 72 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  rr = 0;..  rc = 
1d20: 66 74 73 35 45 78 65 63 50 72 69 6e 74 66 28 70  fts5ExecPrintf(p
1d30: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 26 7a 45 72  Config->db, &zEr
1d40: 72 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  r, "CREATE TABLE
1d50: 20 25 51 2e 27 25 71 5f 25 71 27 28 25 73 29 25   %Q.'%q_%q'(%s)%
1d60: 73 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  s",.      pConfi
1d70: 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
1d80: 3e 7a 4e 61 6d 65 2c 20 7a 50 6f 73 74 2c 20 7a  >zName, zPost, z
1d90: 44 65 66 6e 2c 20 0a 23 69 66 6e 64 65 66 20 53  Defn, .#ifndef S
1da0: 51 4c 49 54 45 5f 46 54 53 35 5f 4e 4f 5f 57 49  QLITE_FTS5_NO_WI
1db0: 54 48 4f 55 54 5f 52 4f 57 49 44 0a 20 20 20 20  THOUT_ROWID.    
1dc0: 20 20 62 57 69 74 68 6f 75 74 3f 22 20 57 49 54    bWithout?" WIT
1dd0: 48 4f 55 54 20 52 4f 57 49 44 22 3a 0a 23 65 6e  HOUT ROWID":.#en
1de0: 64 69 66 0a 20 20 20 20 20 20 22 22 0a 20 20 29  dif.      "".  )
1df0: 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
1e00: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
1e10: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
1e20: 20 20 20 20 20 20 22 66 74 73 35 3a 20 65 72 72        "fts5: err
1e30: 6f 72 20 63 72 65 61 74 69 6e 67 20 73 68 61 64  or creating shad
1e40: 6f 77 20 74 61 62 6c 65 20 25 71 5f 25 73 3a 20  ow table %q_%s: 
1e50: 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 70 43  %s", .        pC
1e60: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 7a 50  onfig->zName, zP
1e70: 6f 73 74 2c 20 7a 45 72 72 0a 20 20 20 20 29 3b  ost, zErr.    );
1e80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1e90: 65 28 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a 20 20  e(zErr);.  }..  
1ea0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1eb0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46  .** Open a new F
1ec0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
1ed0: 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20   If the bCreate 
1ee0: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
1ef0: 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20  , create.** and 
1f00: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75  initialize the u
1f10: 6e 64 65 72 6c 79 69 6e 67 20 74 61 62 6c 65 73  nderlying tables
1f20: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
1f30: 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74  ssful, set *pp t
1f40: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
1f50: 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ew object and re
1f60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1f70: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
1f80: 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e  t *pp to NULL an
1f90: 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  d return an SQLi
1fa0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
1fb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1fc0: 35 53 74 6f 72 61 67 65 4f 70 65 6e 28 0a 20 20  5StorageOpen(.  
1fd0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1fe0: 66 69 67 2c 20 0a 20 20 46 74 73 35 49 6e 64 65  fig, .  Fts5Inde
1ff0: 78 20 2a 70 49 6e 64 65 78 2c 20 0a 20 20 69 6e  x *pIndex, .  in
2000: 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74  t bCreate, .  Ft
2010: 73 35 53 74 6f 72 61 67 65 20 2a 2a 70 70 2c 0a  s5Storage **pp,.
2020: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20    char **pzErr  
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
2050: 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  message */.){.  
2060: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2070: 4f 4b 3b 0a 20 20 46 74 73 35 53 74 6f 72 61 67  OK;.  Fts5Storag
2080: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
2090: 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
20a0: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ect */.  int nBy
20b0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
20c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
20d0: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
20e0: 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 6e 42 79  locate */..  nBy
20f0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
2100: 53 74 6f 72 61 67 65 29 20 20 20 20 20 20 20 20  Storage)        
2110: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 53 74         /* Fts5St
2120: 6f 72 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  orage object */.
2130: 20 20 20 20 20 20 20 20 2b 20 70 43 6f 6e 66 69          + pConfi
2140: 67 2d 3e 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f 66  g->nCol * sizeof
2150: 28 69 36 34 29 3b 20 20 20 20 20 20 2f 2a 20 46  (i64);      /* F
2160: 74 73 35 53 74 6f 72 61 67 65 2e 61 54 6f 74 61  ts5Storage.aTota
2170: 6c 53 69 7a 65 5b 5d 20 2a 2f 0a 20 20 2a 70 70  lSize[] */.  *pp
2180: 20 3d 20 70 20 3d 20 28 46 74 73 35 53 74 6f 72   = p = (Fts5Stor
2190: 61 67 65 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  age*)sqlite3_mal
21a0: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  loc(nByte);.  if
21b0: 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 53 51  ( !p ) return SQ
21c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 6d  LITE_NOMEM;..  m
21d0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 42 79 74  emset(p, 0, nByt
21e0: 65 29 3b 0a 20 20 70 2d 3e 61 54 6f 74 61 6c 53  e);.  p->aTotalS
21f0: 69 7a 65 20 3d 20 28 69 36 34 2a 29 26 70 5b 31  ize = (i64*)&p[1
2200: 5d 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20  ];.  p->pConfig 
2210: 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 70 2d 3e  = pConfig;.  p->
2220: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
2230: 0a 0a 20 20 69 66 28 20 62 43 72 65 61 74 65 20  ..  if( bCreate 
2240: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66  ){.    if( pConf
2250: 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54  ig->eContent==FT
2260: 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41  S5_CONTENT_NORMA
2270: 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  L ){.      int n
2280: 44 65 66 6e 20 3d 20 33 32 20 2b 20 70 43 6f 6e  Defn = 32 + pCon
2290: 66 69 67 2d 3e 6e 43 6f 6c 2a 31 30 3b 0a 20 20  fig->nCol*10;.  
22a0: 20 20 20 20 63 68 61 72 20 2a 7a 44 65 66 6e 20      char *zDefn 
22b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
22c0: 28 33 32 20 2b 20 70 43 6f 6e 66 69 67 2d 3e 6e  (32 + pConfig->n
22d0: 43 6f 6c 20 2a 20 31 30 29 3b 0a 20 20 20 20 20  Col * 10);.     
22e0: 20 69 66 28 20 7a 44 65 66 6e 3d 3d 30 20 29 7b   if( zDefn==0 ){
22f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2300: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2320: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
2330: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
2340: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2350: 74 66 28 6e 44 65 66 6e 2c 20 7a 44 65 66 6e 2c  tf(nDefn, zDefn,
2360: 20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   "id INTEGER PRI
2370: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 20 20 20 20  MARY KEY");.    
2380: 20 20 20 20 69 4f 66 66 20 3d 20 28 69 6e 74 29      iOff = (int)
2390: 73 74 72 6c 65 6e 28 7a 44 65 66 6e 29 3b 0a 20  strlen(zDefn);. 
23a0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
23b0: 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b  i<pConfig->nCol;
23c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
23d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
23e0: 66 28 6e 44 65 66 6e 2d 69 4f 66 66 2c 20 26 7a  f(nDefn-iOff, &z
23f0: 44 65 66 6e 5b 69 4f 66 66 5d 2c 20 22 2c 20 63  Defn[iOff], ", c
2400: 25 64 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  %d", i);.       
2410: 20 20 20 69 4f 66 66 20 2b 3d 20 28 69 6e 74 29     iOff += (int)
2420: 73 74 72 6c 65 6e 28 26 7a 44 65 66 6e 5b 69 4f  strlen(&zDefn[iO
2430: 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ff]);.        }.
2440: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2450: 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
2460: 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 63 6f  ble(pConfig, "co
2470: 6e 74 65 6e 74 22 2c 20 7a 44 65 66 6e 2c 20 30  ntent", zDefn, 0
2480: 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  , pzErr);.      
2490: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
24a0: 66 72 65 65 28 7a 44 65 66 6e 29 3b 0a 20 20 20  free(zDefn);.   
24b0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
24c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f  SQLITE_OK && pCo
24d0: 6e 66 69 67 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a  nfig->bColumnsiz
24e0: 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
24f0: 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
2500: 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20  eTable(.        
2510: 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 6f 63 73    pConfig, "docs
2520: 69 7a 65 22 2c 20 22 69 64 20 49 4e 54 45 47 45  ize", "id INTEGE
2530: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 73  R PRIMARY KEY, s
2540: 7a 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72  z BLOB", 0, pzEr
2550: 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  r.      );.    }
2560: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2580: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
2590: 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20 20 20  CreateTable(.   
25a0: 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2c 20         pConfig, 
25b0: 22 63 6f 6e 66 69 67 22 2c 20 22 6b 20 50 52 49  "config", "k PRI
25c0: 4d 41 52 59 20 4b 45 59 2c 20 76 22 2c 20 31 2c  MARY KEY, v", 1,
25d0: 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29 3b 0a   pzErr.      );.
25e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
25f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2600: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2610: 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 66  3Fts5StorageConf
2620: 69 67 56 61 6c 75 65 28 70 2c 20 22 76 65 72 73  igValue(p, "vers
2630: 69 6f 6e 22 2c 20 30 2c 20 46 54 53 35 5f 43 55  ion", 0, FTS5_CU
2640: 52 52 45 4e 54 5f 56 45 52 53 49 4f 4e 29 3b 0a  RRENT_VERSION);.
2650: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2660: 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
2670: 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6c 6f  e3Fts5StorageClo
2680: 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d  se(p);.    *pp =
2690: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
26a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
26b0: 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65  ose a handle ope
26c0: 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
26d0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
26e0: 33 46 74 73 35 53 74 6f 72 61 67 65 4f 70 65 6e  3Fts5StorageOpen
26f0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
2700: 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6c 6f  e3Fts5StorageClo
2710: 73 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  se(Fts5Storage *
2720: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
2730: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2740: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
2750: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
2760: 20 61 6c 6c 20 53 51 4c 20 73 74 61 74 65 6d 65   all SQL stateme
2770: 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  nts */.    for(i
2780: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
2790: 70 2d 3e 61 53 74 6d 74 29 3b 20 69 2b 2b 29 7b  p->aStmt); i++){
27a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
27b0: 69 6e 61 6c 69 7a 65 28 70 2d 3e 61 53 74 6d 74  inalize(p->aStmt
27c0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  [i]);.    }..   
27d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
27e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27f0: 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  c;.}..typedef st
2800: 72 75 63 74 20 46 74 73 35 49 6e 73 65 72 74 43  ruct Fts5InsertC
2810: 74 78 20 46 74 73 35 49 6e 73 65 72 74 43 74 78  tx Fts5InsertCtx
2820: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e 73  ;.struct Fts5Ins
2830: 65 72 74 43 74 78 20 7b 0a 20 20 46 74 73 35 53  ertCtx {.  Fts5S
2840: 74 6f 72 61 67 65 20 2a 70 53 74 6f 72 61 67 65  torage *pStorage
2850: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20  ;.  int iCol;.  
2860: 69 6e 74 20 73 7a 43 6f 6c 3b 20 20 20 20 20 20  int szCol;      
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 2f 2a 20 53 69 7a 65 20 6f 66 20 63 6f 6c 75 6d  /* Size of colum
2890: 6e 20 76 61 6c 75 65 20 69 6e 20 74 6f 6b 65 6e  n value in token
28a0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s */.};../*.** T
28b0: 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  okenization call
28c0: 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 20 69  back used when i
28d0: 6e 73 65 72 74 69 6e 67 20 74 6f 6b 65 6e 73 20  nserting tokens 
28e0: 69 6e 74 6f 20 74 68 65 20 46 54 53 20 69 6e 64  into the FTS ind
28f0: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ex..*/.static in
2900: 74 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e 73  t fts5StorageIns
2910: 65 72 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20 76  ertCallback(.  v
2920: 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20  oid *pContext,  
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2940: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 46 74 73  * Pointer to Fts
2950: 35 49 6e 73 65 72 74 43 74 78 20 6f 62 6a 65 63  5InsertCtx objec
2960: 74 20 2a 2f 0a 20 20 69 6e 74 20 74 66 6c 61 67  t */.  int tflag
2970: 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s,.  const char 
2980: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20  *pToken,        
2990: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
29a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20  ontaining token 
29b0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  */.  int nToken,
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
29e0: 74 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a  token in bytes *
29f0: 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64 31  /.  int iUnused1
2a00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a10: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 66      /* Start off
2a20: 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0a  set of token */.
2a30: 20 20 69 6e 74 20 69 55 6e 75 73 65 64 32 20 20    int iUnused2  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 2f 2a 20 45 6e 64 20 6f 66 66 73 65 74 20    /* End offset 
2a60: 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20  of token */.){. 
2a70: 20 46 74 73 35 49 6e 73 65 72 74 43 74 78 20 2a   Fts5InsertCtx *
2a80: 70 43 74 78 20 3d 20 28 46 74 73 35 49 6e 73 65  pCtx = (Fts5Inse
2a90: 72 74 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b  rtCtx*)pContext;
2aa0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
2ab0: 64 78 20 3d 20 70 43 74 78 2d 3e 70 53 74 6f 72  dx = pCtx->pStor
2ac0: 61 67 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 55  age->pIndex;.  U
2ad0: 4e 55 53 45 44 5f 50 41 52 41 4d 32 28 69 55 6e  NUSED_PARAM2(iUn
2ae0: 75 73 65 64 31 2c 20 69 55 6e 75 73 65 64 32 29  used1, iUnused2)
2af0: 3b 0a 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3e 46  ;.  if( nToken>F
2b00: 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53 49  TS5_MAX_TOKEN_SI
2b10: 5a 45 20 29 20 6e 54 6f 6b 65 6e 20 3d 20 46 54  ZE ) nToken = FT
2b20: 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53 49 5a  S5_MAX_TOKEN_SIZ
2b30: 45 3b 0a 20 20 69 66 28 20 28 74 66 6c 61 67 73  E;.  if( (tflags
2b40: 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f   & FTS5_TOKEN_CO
2b50: 4c 4f 43 41 54 45 44 29 3d 3d 30 20 7c 7c 20 70  LOCATED)==0 || p
2b60: 43 74 78 2d 3e 73 7a 43 6f 6c 3d 3d 30 20 29 7b  Ctx->szCol==0 ){
2b70: 0a 20 20 20 20 70 43 74 78 2d 3e 73 7a 43 6f 6c  .    pCtx->szCol
2b80: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
2b90: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2ba0: 78 57 72 69 74 65 28 70 49 64 78 2c 20 70 43 74  xWrite(pIdx, pCt
2bb0: 78 2d 3e 69 43 6f 6c 2c 20 70 43 74 78 2d 3e 73  x->iCol, pCtx->s
2bc0: 7a 43 6f 6c 2d 31 2c 20 70 54 6f 6b 65 6e 2c 20  zCol-1, pToken, 
2bd0: 6e 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nToken);.}../*.*
2be0: 2a 20 49 66 20 61 20 72 6f 77 20 77 69 74 68 20  * If a row with 
2bf0: 72 6f 77 69 64 20 69 44 65 6c 20 69 73 20 70 72  rowid iDel is pr
2c00: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 25 5f 63  esent in the %_c
2c10: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2c 20 61 64  ontent table, ad
2c20: 64 20 74 68 65 0a 2a 2a 20 64 65 6c 65 74 65 2d  d the.** delete-
2c30: 6d 61 72 6b 65 72 73 20 74 6f 20 74 68 65 20 46  markers to the F
2c40: 54 53 20 69 6e 64 65 78 20 6e 65 63 65 73 73 61  TS index necessa
2c50: 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e  ry to delete it.
2c60: 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   Do not actually
2c70: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 25  .** remove the %
2c80: 5f 63 6f 6e 74 65 6e 74 20 72 6f 77 20 61 74 20  _content row at 
2c90: 74 68 69 73 20 74 69 6d 65 20 74 68 6f 75 67 68  this time though
2ca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cb0: 66 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74  fts5StorageDelet
2cc0: 65 46 72 6f 6d 49 6e 64 65 78 28 0a 20 20 46 74  eFromIndex(.  Ft
2cd0: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 0a 20  s5Storage *p, . 
2ce0: 20 69 36 34 20 69 44 65 6c 2c 20 0a 20 20 73 71   i64 iDel, .  sq
2cf0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2d00: 56 61 6c 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e  Val.){.  Fts5Con
2d10: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
2d20: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c  ->pConfig;.  sql
2d30: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 65 6b  ite3_stmt *pSeek
2d40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2d50: 53 45 4c 45 43 54 20 74 6f 20 72 65 61 64 20 72  SELECT to read r
2d60: 6f 77 20 69 44 65 6c 20 66 72 6f 6d 20 25 5f 64  ow iDel from %_d
2d70: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ata */.  int rc;
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2da0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2db0: 20 72 63 32 3b 20 20 20 20 20 20 20 20 20 20 20   rc2;           
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dd0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20  sqlite3_reset() 
2de0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
2df0: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 46 74 73   int iCol;.  Fts
2e00: 35 49 6e 73 65 72 74 43 74 78 20 63 74 78 3b 0a  5InsertCtx ctx;.
2e10: 0a 20 20 69 66 28 20 61 70 56 61 6c 3d 3d 30 20  .  if( apVal==0 
2e20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  ){.    rc = fts5
2e30: 53 74 6f 72 61 67 65 47 65 74 53 74 6d 74 28 70  StorageGetStmt(p
2e40: 2c 20 46 54 53 35 5f 53 54 4d 54 5f 4c 4f 4f 4b  , FTS5_STMT_LOOK
2e50: 55 50 2c 20 26 70 53 65 65 6b 2c 20 30 29 3b 0a  UP, &pSeek, 0);.
2e60: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e70: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2e80: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  c;.    sqlite3_b
2e90: 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 65 6b 2c  ind_int64(pSeek,
2ea0: 20 31 2c 20 69 44 65 6c 29 3b 0a 20 20 20 20 69   1, iDel);.    i
2eb0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
2ec0: 70 53 65 65 6b 29 21 3d 53 51 4c 49 54 45 5f 52  pSeek)!=SQLITE_R
2ed0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OW ){.      retu
2ee0: 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  rn sqlite3_reset
2ef0: 28 70 53 65 65 6b 29 3b 0a 20 20 20 20 7d 0a 20  (pSeek);.    }. 
2f00: 20 7d 0a 0a 20 20 63 74 78 2e 70 53 74 6f 72 61   }..  ctx.pStora
2f10: 67 65 20 3d 20 70 3b 0a 20 20 63 74 78 2e 69 43  ge = p;.  ctx.iC
2f20: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 72 63 20 3d 20  ol = -1;.  rc = 
2f30: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2f40: 42 65 67 69 6e 57 72 69 74 65 28 70 2d 3e 70 49  BeginWrite(p->pI
2f50: 6e 64 65 78 2c 20 31 2c 20 69 44 65 6c 29 3b 0a  ndex, 1, iDel);.
2f60: 20 20 66 6f 72 28 69 43 6f 6c 3d 31 3b 20 72 63    for(iCol=1; rc
2f70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
2f80: 43 6f 6c 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 43  Col<=pConfig->nC
2f90: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
2fa0: 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 62   if( pConfig->ab
2fb0: 55 6e 69 6e 64 65 78 65 64 5b 69 43 6f 6c 2d 31  Unindexed[iCol-1
2fc0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  ]==0 ){.      co
2fd0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 3b  nst char *zText;
2fe0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 78 74  .      int nText
2ff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 65  ;.      if( pSee
3000: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  k ){.        zTe
3010: 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  xt = (const char
3020: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
3030: 5f 74 65 78 74 28 70 53 65 65 6b 2c 20 69 43 6f  _text(pSeek, iCo
3040: 6c 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 65 78  l);.        nTex
3050: 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
3060: 6d 6e 5f 62 79 74 65 73 28 70 53 65 65 6b 2c 20  mn_bytes(pSeek, 
3070: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iCol);.      }el
3080: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 78  se{.        zTex
3090: 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
30a0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
30b0: 65 78 74 28 61 70 56 61 6c 5b 69 43 6f 6c 2d 31  ext(apVal[iCol-1
30c0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 65 78  ]);.        nTex
30d0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
30e0: 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 69 43  e_bytes(apVal[iC
30f0: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ol-1]);.      }.
3100: 20 20 20 20 20 20 63 74 78 2e 73 7a 43 6f 6c 20        ctx.szCol 
3110: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
3120: 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e  sqlite3Fts5Token
3130: 69 7a 65 28 70 43 6f 6e 66 69 67 2c 20 46 54 53  ize(pConfig, FTS
3140: 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d  5_TOKENIZE_DOCUM
3150: 45 4e 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ENT, .          
3160: 7a 54 65 78 74 2c 20 6e 54 65 78 74 2c 20 28 76  zText, nText, (v
3170: 6f 69 64 2a 29 26 63 74 78 2c 20 66 74 73 35 53  oid*)&ctx, fts5S
3180: 74 6f 72 61 67 65 49 6e 73 65 72 74 43 61 6c 6c  torageInsertCall
3190: 62 61 63 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  back.      );.  
31a0: 20 20 20 20 70 2d 3e 61 54 6f 74 61 6c 53 69 7a      p->aTotalSiz
31b0: 65 5b 69 43 6f 6c 2d 31 5d 20 2d 3d 20 28 69 36  e[iCol-1] -= (i6
31c0: 34 29 63 74 78 2e 73 7a 43 6f 6c 3b 0a 20 20 20  4)ctx.szCol;.   
31d0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 54 6f 74   }.  }.  p->nTot
31e0: 61 6c 52 6f 77 2d 2d 3b 0a 0a 20 20 72 63 32 20  alRow--;..  rc2 
31f0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
3200: 70 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63  pSeek);.  if( rc
3210: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
3220: 20 3d 20 72 63 32 3b 0a 20 20 72 65 74 75 72 6e   = rc2;.  return
3230: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
3240: 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64 20 69  nsert a record i
3250: 6e 74 6f 20 74 68 65 20 25 5f 64 6f 63 73 69 7a  nto the %_docsiz
3260: 65 20 74 61 62 6c 65 2e 20 53 70 65 63 69 66 69  e table. Specifi
3270: 63 61 6c 6c 79 2c 20 64 6f 3a 0a 2a 2a 0a 2a 2a  cally, do:.**.**
3280: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50     INSERT OR REP
3290: 4c 41 43 45 20 49 4e 54 4f 20 25 5f 64 6f 63 73  LACE INTO %_docs
32a0: 69 7a 65 28 69 64 2c 20 73 7a 29 20 56 41 4c 55  ize(id, sz) VALU
32b0: 45 53 28 69 52 6f 77 69 64 2c 20 70 42 75 66 29  ES(iRowid, pBuf)
32c0: 3b 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ;.**.** If there
32d0: 20 69 73 20 6e 6f 20 25 5f 64 6f 63 73 69 7a 65   is no %_docsize
32e0: 20 74 61 62 6c 65 20 28 61 73 20 68 61 70 70 65   table (as happe
32f0: 6e 73 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ns if the column
3300: 73 69 7a 65 3d 30 20 6f 70 74 69 6f 6e 0a 2a 2a  size=0 option.**
3310: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 77 68   is specified wh
3320: 65 6e 20 74 68 65 20 46 54 53 35 20 74 61 62 6c  en the FTS5 tabl
3330: 65 20 69 73 20 63 72 65 61 74 65 64 29 2c 20 74  e is created), t
3340: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3350: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
3360: 69 63 20 69 6e 74 20 66 74 73 35 53 74 6f 72 61  ic int fts5Stora
3370: 67 65 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28  geInsertDocsize(
3380: 0a 20 20 46 74 73 35 53 74 6f 72 61 67 65 20 2a  .  Fts5Storage *
3390: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
33a0: 20 20 20 2f 2a 20 53 74 6f 72 61 67 65 20 6d 6f     /* Storage mo
33b0: 64 75 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f  dule to write to
33c0: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64   */.  i64 iRowid
33d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33e0: 20 20 20 20 20 20 2f 2a 20 69 64 20 76 61 6c 75        /* id valu
33f0: 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
3400: 72 20 2a 70 42 75 66 20 20 20 20 20 20 20 20 20  r *pBuf         
3410: 20 20 20 20 20 20 20 2f 2a 20 73 7a 20 76 61 6c         /* sz val
3420: 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
3430: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
3440: 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
3450: 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b 0a  >bColumnsize ){.
3460: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
3470: 20 2a 70 52 65 70 6c 61 63 65 20 3d 20 30 3b 0a   *pReplace = 0;.
3480: 20 20 20 20 72 63 20 3d 20 66 74 73 35 53 74 6f      rc = fts5Sto
3490: 72 61 67 65 47 65 74 53 74 6d 74 28 70 2c 20 46  rageGetStmt(p, F
34a0: 54 53 35 5f 53 54 4d 54 5f 52 45 50 4c 41 43 45  TS5_STMT_REPLACE
34b0: 5f 44 4f 43 53 49 5a 45 2c 20 26 70 52 65 70 6c  _DOCSIZE, &pRepl
34c0: 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ace, 0);.    if(
34d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
34f0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 65 70 6c  bind_int64(pRepl
3500: 61 63 65 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b  ace, 1, iRowid);
3510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
3520: 69 6e 64 5f 62 6c 6f 62 28 70 52 65 70 6c 61 63  ind_blob(pReplac
3530: 65 2c 20 32 2c 20 70 42 75 66 2d 3e 70 2c 20 70  e, 2, pBuf->p, p
3540: 42 75 66 2d 3e 6e 2c 20 53 51 4c 49 54 45 5f 53  Buf->n, SQLITE_S
3550: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
3560: 6c 69 74 65 33 5f 73 74 65 70 28 70 52 65 70 6c  lite3_step(pRepl
3570: 61 63 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ace);.      rc =
3580: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
3590: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  Replace);.      
35a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
35b0: 6c 28 70 52 65 70 6c 61 63 65 2c 20 32 29 3b 0a  l(pReplace, 2);.
35c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
35d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35e0: 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Load the content
35f0: 73 20 6f 66 20 74 68 65 20 22 61 76 65 72 61 67  s of the "averag
3600: 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  es" record from 
3610: 64 69 73 6b 20 69 6e 74 6f 20 74 68 65 20 0a 2a  disk into the .*
3620: 2a 20 70 2d 3e 6e 54 6f 74 61 6c 52 6f 77 20 61  * p->nTotalRow a
3630: 6e 64 20 70 2d 3e 61 54 6f 74 61 6c 53 69 7a 65  nd p->aTotalSize
3640: 5b 5d 20 76 61 72 69 61 62 6c 65 73 2e 20 49 66  [] variables. If
3650: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 64   successful, and
3660: 20 69 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20   if.** argument 
3670: 62 43 61 63 68 65 20 69 73 20 74 72 75 65 2c 20  bCache is true, 
3680: 73 65 74 20 74 68 65 20 70 2d 3e 62 54 6f 74 61  set the p->bTota
3690: 6c 73 56 61 6c 69 64 20 66 6c 61 67 20 74 6f 20  lsValid flag to 
36a0: 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74  indicate.** that
36b0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
36c0: 20 61 54 6f 74 61 6c 53 69 7a 65 5b 5d 20 61 6e   aTotalSize[] an
36d0: 64 20 6e 54 6f 74 61 6c 52 6f 77 20 61 72 65 20  d nTotalRow are 
36e0: 76 61 6c 69 64 20 75 6e 74 69 6c 0a 2a 2a 20 66  valid until.** f
36f0: 75 72 74 68 65 72 20 6e 6f 74 69 63 65 2e 0a 2a  urther notice..*
3700: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
3710: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
3720: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
3730: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
3740: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
3750: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
3760: 74 20 66 74 73 35 53 74 6f 72 61 67 65 4c 6f 61  t fts5StorageLoa
3770: 64 54 6f 74 61 6c 73 28 46 74 73 35 53 74 6f 72  dTotals(Fts5Stor
3780: 61 67 65 20 2a 70 2c 20 69 6e 74 20 62 43 61 63  age *p, int bCac
3790: 68 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  he){.  int rc = 
37a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
37b0: 20 70 2d 3e 62 54 6f 74 61 6c 73 56 61 6c 69 64   p->bTotalsValid
37c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
37d0: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
37e0: 47 65 74 41 76 65 72 61 67 65 73 28 70 2d 3e 70  GetAverages(p->p
37f0: 49 6e 64 65 78 2c 20 26 70 2d 3e 6e 54 6f 74 61  Index, &p->nTota
3800: 6c 52 6f 77 2c 20 70 2d 3e 61 54 6f 74 61 6c 53  lRow, p->aTotalS
3810: 69 7a 65 29 3b 0a 20 20 20 20 70 2d 3e 62 54 6f  ize);.    p->bTo
3820: 74 61 6c 73 56 61 6c 69 64 20 3d 20 62 43 61 63  talsValid = bCac
3830: 68 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  he;.  }.  return
3840: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
3850: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
3860: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3870: 70 2d 3e 6e 54 6f 74 61 6c 52 6f 77 20 61 6e 64  p->nTotalRow and
3880: 20 70 2d 3e 61 54 6f 74 61 6c 53 69 7a 65 5b 5d   p->aTotalSize[]
3890: 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69   .** variables i
38a0: 6e 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  n the "averages"
38b0: 20 72 65 63 6f 72 64 20 6f 6e 20 64 69 73 6b 2e   record on disk.
38c0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
38d0: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
38e0: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
38f0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
3900: 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
3910: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
3920: 69 6e 74 20 66 74 73 35 53 74 6f 72 61 67 65 53  int fts5StorageS
3930: 61 76 65 54 6f 74 61 6c 73 28 46 74 73 35 53 74  aveTotals(Fts5St
3940: 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20 69 6e 74  orage *p){.  int
3950: 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66   nCol = p->pConf
3960: 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20  ig->nCol;.  int 
3970: 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i;.  Fts5Buffer 
3980: 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  buf;.  int rc = 
3990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
39a0: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
39b0: 65 6f 66 28 62 75 66 29 29 3b 0a 0a 20 20 73 71  eof(buf));..  sq
39c0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
39d0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 72 63 2c  ppendVarint(&rc,
39e0: 20 26 62 75 66 2c 20 70 2d 3e 6e 54 6f 74 61 6c   &buf, p->nTotal
39f0: 52 6f 77 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Row);.  for(i=0;
3a00: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
3a10: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
3a20: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
3a30: 28 26 72 63 2c 20 26 62 75 66 2c 20 70 2d 3e 61  (&rc, &buf, p->a
3a40: 54 6f 74 61 6c 53 69 7a 65 5b 69 5d 29 3b 0a 20  TotalSize[i]);. 
3a50: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
3a60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
3a70: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
3a80: 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28 70  dexSetAverages(p
3a90: 2d 3e 70 49 6e 64 65 78 2c 20 62 75 66 2e 70 2c  ->pIndex, buf.p,
3aa0: 20 62 75 66 2e 6e 29 3b 0a 20 20 7d 0a 20 20 73   buf.n);.  }.  s
3ab0: 71 6c 69 74 65 33 5f 66 72 65 65 28 62 75 66 2e  qlite3_free(buf.
3ac0: 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  p);..  return rc
3ad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
3ae0: 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 74 68 65  e a row from the
3af0: 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   FTS table..*/.i
3b00: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
3b10: 6f 72 61 67 65 44 65 6c 65 74 65 28 46 74 73 35  orageDelete(Fts5
3b20: 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 20  Storage *p, i64 
3b30: 69 44 65 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61  iDel, sqlite3_va
3b40: 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20 20  lue **apVal){.  
3b50: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
3b60: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
3b70: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
3b80: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
3b90: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
3ba0: 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65   pConfig->eConte
3bb0: 6e 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54  nt!=FTS5_CONTENT
3bc0: 5f 4e 4f 52 4d 41 4c 20 7c 7c 20 61 70 56 61 6c  _NORMAL || apVal
3bd0: 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 66 74  ==0 );.  rc = ft
3be0: 73 35 53 74 6f 72 61 67 65 4c 6f 61 64 54 6f 74  s5StorageLoadTot
3bf0: 61 6c 73 28 70 2c 20 31 29 3b 0a 0a 20 20 2f 2a  als(p, 1);..  /*
3c00: 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 64 65   Delete the inde
3c10: 78 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  x records */.  i
3c20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3c30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
3c40: 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 46 72  5StorageDeleteFr
3c50: 6f 6d 49 6e 64 65 78 28 70 2c 20 69 44 65 6c 2c  omIndex(p, iDel,
3c60: 20 61 70 56 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20   apVal);.  }..  
3c70: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 25 5f  /* Delete the %_
3c80: 64 6f 63 73 69 7a 65 20 72 65 63 6f 72 64 20 2a  docsize record *
3c90: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
3ca0: 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67  TE_OK && pConfig
3cb0: 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b  ->bColumnsize ){
3cc0: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 53 74  .    rc = fts5St
3cd0: 6f 72 61 67 65 47 65 74 53 74 6d 74 28 70 2c 20  orageGetStmt(p, 
3ce0: 46 54 53 35 5f 53 54 4d 54 5f 44 45 4c 45 54 45  FTS5_STMT_DELETE
3cf0: 5f 44 4f 43 53 49 5a 45 2c 20 26 70 44 65 6c 2c  _DOCSIZE, &pDel,
3d00: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
3d10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3d20: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
3d30: 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20 31 2c 20  _int64(pDel, 1, 
3d40: 69 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  iDel);.      sql
3d50: 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c 29 3b  ite3_step(pDel);
3d60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
3d70: 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 29 3b  te3_reset(pDel);
3d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3d90: 20 44 65 6c 65 74 65 20 74 68 65 20 25 5f 63 6f   Delete the %_co
3da0: 6e 74 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  ntent record */.
3db0: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65    if( pConfig->e
3dc0: 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f  Content==FTS5_CO
3dd0: 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0a  NTENT_NORMAL ){.
3de0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
3df0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
3e00: 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67 65 47  c = fts5StorageG
3e10: 65 74 53 74 6d 74 28 70 2c 20 46 54 53 35 5f 53  etStmt(p, FTS5_S
3e20: 54 4d 54 5f 44 45 4c 45 54 45 5f 43 4f 4e 54 45  TMT_DELETE_CONTE
3e30: 4e 54 2c 20 26 70 44 65 6c 2c 20 30 29 3b 0a 20  NT, &pDel, 0);. 
3e40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
3e50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3e60: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
3e70: 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20 31 2c 20  _int64(pDel, 1, 
3e80: 69 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  iDel);.      sql
3e90: 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c 29 3b  ite3_step(pDel);
3ea0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
3eb0: 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 29 3b  te3_reset(pDel);
3ec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3ed0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3ee0: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 65 6e 74  * Delete all ent
3ef0: 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53 35  ries in the FTS5
3f00: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 69 6e 74 20 73   index..*/.int s
3f10: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
3f20: 65 44 65 6c 65 74 65 41 6c 6c 28 46 74 73 35 53  eDeleteAll(Fts5S
3f30: 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20 46 74  torage *p){.  Ft
3f40: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
3f50: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
3f60: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
3f70: 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65  Delete the conte
3f80: 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
3f90: 61 20 61 6e 64 20 25 5f 64 6f 63 73 69 7a 65 20  a and %_docsize 
3fa0: 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 72 63 20  tables. */.  rc 
3fb0: 3d 20 66 74 73 35 45 78 65 63 50 72 69 6e 74 66  = fts5ExecPrintf
3fc0: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 30 2c  (pConfig->db, 0,
3fd0: 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
3fe0: 52 4f 4d 20 25 51 2e 27 25 71 5f 64 61 74 61 27  ROM %Q.'%q_data'
3ff0: 3b 22 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54  ;" .      "DELET
4000: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64  E FROM %Q.'%q_id
4010: 78 27 3b 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e  x';",.      pCon
4020: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
4030: 67 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  g->zName,.      
4040: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
4050: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 29  onfig->zName.  )
4060: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4070: 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67  TE_OK && pConfig
4080: 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b  ->bColumnsize ){
4090: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78  .    rc = fts5Ex
40a0: 65 63 50 72 69 6e 74 66 28 70 43 6f 6e 66 69 67  ecPrintf(pConfig
40b0: 2d 3e 64 62 2c 20 30 2c 0a 20 20 20 20 20 20 20  ->db, 0,.       
40c0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
40d0: 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 3b 22 2c  .'%q_docsize';",
40e0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67  .        pConfig
40f0: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
4100: 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
4110: 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c  ..  /* Reinitial
4120: 69 7a 65 20 74 68 65 20 25 5f 64 61 74 61 20 74  ize the %_data t
4130: 61 62 6c 65 2e 20 54 68 69 73 20 63 61 6c 6c 20  able. This call 
4140: 63 72 65 61 74 65 73 20 74 68 65 20 69 6e 69 74  creates the init
4150: 69 61 6c 20 73 74 72 75 63 74 75 72 65 0a 20 20  ial structure.  
4160: 2a 2a 20 61 6e 64 20 61 76 65 72 61 67 65 73 20  ** and averages 
4170: 72 65 63 6f 72 64 73 2e 20 20 2a 2f 0a 20 20 69  records.  */.  i
4180: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4190: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
41a0: 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
41b0: 6e 69 74 28 70 2d 3e 70 49 6e 64 65 78 29 3b 0a  nit(p->pIndex);.
41c0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
41d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
41e0: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53  c = sqlite3Fts5S
41f0: 74 6f 72 61 67 65 43 6f 6e 66 69 67 56 61 6c 75  torageConfigValu
4200: 65 28 70 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20  e(p, "version", 
4210: 30 2c 20 46 54 53 35 5f 43 55 52 52 45 4e 54 5f  0, FTS5_CURRENT_
4220: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20 20  VERSION);.  }.  
4230: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
4240: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
4250: 72 61 67 65 52 65 62 75 69 6c 64 28 46 74 73 35  rageRebuild(Fts5
4260: 53 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20 46  Storage *p){.  F
4270: 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
4280: 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 43  {0,0,0};.  Fts5C
4290: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
42a0: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73   p->pConfig;.  s
42b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 63  qlite3_stmt *pSc
42c0: 61 6e 20 3d 20 30 3b 0a 20 20 46 74 73 35 49 6e  an = 0;.  Fts5In
42d0: 73 65 72 74 43 74 78 20 63 74 78 3b 0a 20 20 69  sertCtx ctx;.  i
42e0: 6e 74 20 72 63 3b 0a 0a 20 20 6d 65 6d 73 65 74  nt rc;..  memset
42f0: 28 26 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  (&ctx, 0, sizeof
4300: 28 46 74 73 35 49 6e 73 65 72 74 43 74 78 29 29  (Fts5InsertCtx))
4310: 3b 0a 20 20 63 74 78 2e 70 53 74 6f 72 61 67 65  ;.  ctx.pStorage
4320: 20 3d 20 70 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = p;.  rc = sql
4330: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44  ite3Fts5StorageD
4340: 65 6c 65 74 65 41 6c 6c 28 70 29 3b 0a 20 20 69  eleteAll(p);.  i
4350: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4360: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
4370: 35 53 74 6f 72 61 67 65 4c 6f 61 64 54 6f 74 61  5StorageLoadTota
4380: 6c 73 28 70 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  ls(p, 1);.  }.. 
4390: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
43a0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  OK ){.    rc = f
43b0: 74 73 35 53 74 6f 72 61 67 65 47 65 74 53 74 6d  ts5StorageGetStm
43c0: 74 28 70 2c 20 46 54 53 35 5f 53 54 4d 54 5f 53  t(p, FTS5_STMT_S
43d0: 43 41 4e 2c 20 26 70 53 63 61 6e 2c 20 30 29 3b  CAN, &pScan, 0);
43e0: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
43f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
4400: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
4410: 74 65 33 5f 73 74 65 70 28 70 53 63 61 6e 29 20  te3_step(pScan) 
4420: 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
4430: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
4440: 6d 6e 5f 69 6e 74 36 34 28 70 53 63 61 6e 2c 20  mn_int64(pScan, 
4450: 30 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  0);..    sqlite3
4460: 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
4470: 62 75 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  buf);.    rc = s
4480: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42  qlite3Fts5IndexB
4490: 65 67 69 6e 57 72 69 74 65 28 70 2d 3e 70 49 6e  eginWrite(p->pIn
44a0: 64 65 78 2c 20 30 2c 20 69 52 6f 77 69 64 29 3b  dex, 0, iRowid);
44b0: 0a 20 20 20 20 66 6f 72 28 63 74 78 2e 69 43 6f  .    for(ctx.iCo
44c0: 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l=0; rc==SQLITE_
44d0: 4f 4b 20 26 26 20 63 74 78 2e 69 43 6f 6c 3c 70  OK && ctx.iCol<p
44e0: 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 63 74  Config->nCol; ct
44f0: 78 2e 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  x.iCol++){.     
4500: 20 63 74 78 2e 73 7a 43 6f 6c 20 3d 20 30 3b 0a   ctx.szCol = 0;.
4510: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
4520: 67 2d 3e 61 62 55 6e 69 6e 64 65 78 65 64 5b 63  g->abUnindexed[c
4530: 74 78 2e 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20  tx.iCol]==0 ){. 
4540: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
4550: 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28  te3Fts5Tokenize(
4560: 70 43 6f 6e 66 69 67 2c 20 0a 20 20 20 20 20 20  pConfig, .      
4570: 20 20 20 20 20 20 46 54 53 35 5f 54 4f 4b 45 4e        FTS5_TOKEN
4580: 49 5a 45 5f 44 4f 43 55 4d 45 4e 54 2c 0a 20 20  IZE_DOCUMENT,.  
4590: 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
45a0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
45b0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 63 61 6e  olumn_text(pScan
45c0: 2c 20 63 74 78 2e 69 43 6f 6c 2b 31 29 2c 0a 20  , ctx.iCol+1),. 
45d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
45e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
45f0: 70 53 63 61 6e 2c 20 63 74 78 2e 69 43 6f 6c 2b  pScan, ctx.iCol+
4600: 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1),.            
4610: 28 76 6f 69 64 2a 29 26 63 74 78 2c 0a 20 20 20  (void*)&ctx,.   
4620: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 74 6f           fts5Sto
4630: 72 61 67 65 49 6e 73 65 72 74 43 61 6c 6c 62 61  rageInsertCallba
4640: 63 6b 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ck.        );.  
4650: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4660: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
4670: 65 6e 64 56 61 72 69 6e 74 28 26 72 63 2c 20 26  endVarint(&rc, &
4680: 62 75 66 2c 20 63 74 78 2e 73 7a 43 6f 6c 29 3b  buf, ctx.szCol);
4690: 0a 20 20 20 20 20 20 70 2d 3e 61 54 6f 74 61 6c  .      p->aTotal
46a0: 53 69 7a 65 5b 63 74 78 2e 69 43 6f 6c 5d 20 2b  Size[ctx.iCol] +
46b0: 3d 20 28 69 36 34 29 63 74 78 2e 73 7a 43 6f 6c  = (i64)ctx.szCol
46c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
46d0: 54 6f 74 61 6c 52 6f 77 2b 2b 3b 0a 0a 20 20 20  TotalRow++;..   
46e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
46f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
4700: 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65   fts5StorageInse
4710: 72 74 44 6f 63 73 69 7a 65 28 70 2c 20 69 52 6f  rtDocsize(p, iRo
4720: 77 69 64 2c 20 26 62 75 66 29 3b 0a 20 20 20 20  wid, &buf);.    
4730: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
4740: 66 72 65 65 28 62 75 66 2e 70 29 3b 0a 0a 20 20  free(buf.p);..  
4750: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 61 76 65  /* Write the ave
4760: 72 61 67 65 73 20 72 65 63 6f 72 64 20 2a 2f 0a  rages record */.
4770: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
4790: 66 74 73 35 53 74 6f 72 61 67 65 53 61 76 65 54  fts5StorageSaveT
47a0: 6f 74 61 6c 73 28 70 29 3b 0a 20 20 7d 0a 20 20  otals(p);.  }.  
47b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
47c0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
47d0: 72 61 67 65 4f 70 74 69 6d 69 7a 65 28 46 74 73  rageOptimize(Fts
47e0: 35 53 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20  5Storage *p){.  
47f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
4800: 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28  s5IndexOptimize(
4810: 70 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 69  p->pIndex);.}..i
4820: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4830: 6f 72 61 67 65 4d 65 72 67 65 28 46 74 73 35 53  orageMerge(Fts5S
4840: 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 6e  torage *p, int n
4850: 4d 65 72 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  Merge){.  return
4860: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
4870: 78 4d 65 72 67 65 28 70 2d 3e 70 49 6e 64 65 78  xMerge(p->pIndex
4880: 2c 20 6e 4d 65 72 67 65 29 3b 0a 7d 0a 0a 69 6e  , nMerge);.}..in
4890: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
48a0: 72 61 67 65 52 65 73 65 74 28 46 74 73 35 53 74  rageReset(Fts5St
48b0: 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74  orage *p){.  ret
48c0: 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 49  urn sqlite3Fts5I
48d0: 6e 64 65 78 52 65 73 65 74 28 70 2d 3e 70 49 6e  ndexReset(p->pIn
48e0: 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  dex);.}../*.** A
48f0: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 72 6f  llocate a new ro
4900: 77 69 64 2e 20 54 68 69 73 20 69 73 20 75 73 65  wid. This is use
4910: 64 20 66 6f 72 20 22 65 78 74 65 72 6e 61 6c 20  d for "external 
4920: 63 6f 6e 74 65 6e 74 22 20 74 61 62 6c 65 73 20  content" tables 
4930: 77 68 65 6e 0a 2a 2a 20 61 20 4e 55 4c 4c 20 76  when.** a NULL v
4940: 61 6c 75 65 20 69 73 20 69 6e 73 65 72 74 65 64  alue is inserted
4950: 20 69 6e 74 6f 20 74 68 65 20 72 6f 77 69 64 20   into the rowid 
4960: 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6e 65 77 20  column. The new 
4970: 72 6f 77 69 64 20 69 73 20 61 6c 6c 6f 63 61 74  rowid is allocat
4980: 65 64 0a 2a 2a 20 62 79 20 69 6e 73 65 72 74 69  ed.** by inserti
4990: 6e 67 20 61 20 64 75 6d 6d 79 20 72 6f 77 20 69  ng a dummy row i
49a0: 6e 74 6f 20 74 68 65 20 25 5f 64 6f 63 73 69 7a  nto the %_docsiz
49b0: 65 20 74 61 62 6c 65 2e 20 54 68 65 20 64 75 6d  e table. The dum
49c0: 6d 79 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 6f 76  my will be.** ov
49d0: 65 72 77 72 69 74 74 65 6e 20 6c 61 74 65 72 2e  erwritten later.
49e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 25 5f  .**.** If the %_
49f0: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 64 6f  docsize table do
4a00: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 53 51  es not exist, SQ
4a10: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 69 73  LITE_MISMATCH is
4a20: 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 0a 2a 2a   returned. In.**
4a30: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 75   this case the u
4a40: 73 65 72 20 69 73 20 72 65 71 75 69 72 65 64 20  ser is required 
4a50: 74 6f 20 70 72 6f 76 69 64 65 20 61 20 72 6f 77  to provide a row
4a60: 69 64 20 65 78 70 6c 69 63 69 74 6c 79 2e 0a 2a  id explicitly..*
4a70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
4a80: 35 53 74 6f 72 61 67 65 4e 65 77 52 6f 77 69 64  5StorageNewRowid
4a90: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
4aa0: 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a   i64 *piRowid){.
4ab0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4ac0: 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 69 66  E_MISMATCH;.  if
4ad0: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 62 43  ( p->pConfig->bC
4ae0: 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b 0a 20 20 20  olumnsize ){.   
4af0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
4b00: 52 65 70 6c 61 63 65 20 3d 20 30 3b 0a 20 20 20  Replace = 0;.   
4b10: 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67   rc = fts5Storag
4b20: 65 47 65 74 53 74 6d 74 28 70 2c 20 46 54 53 35  eGetStmt(p, FTS5
4b30: 5f 53 54 4d 54 5f 52 45 50 4c 41 43 45 5f 44 4f  _STMT_REPLACE_DO
4b40: 43 53 49 5a 45 2c 20 26 70 52 65 70 6c 61 63 65  CSIZE, &pReplace
4b50: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
4b60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4b70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
4b80: 64 5f 6e 75 6c 6c 28 70 52 65 70 6c 61 63 65 2c  d_null(pReplace,
4b90: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
4ba0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 52 65  e3_bind_null(pRe
4bb0: 70 6c 61 63 65 2c 20 32 29 3b 0a 20 20 20 20 20  place, 2);.     
4bc0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52   sqlite3_step(pR
4bd0: 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20 72  eplace);.      r
4be0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
4bf0: 74 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 20  t(pReplace);.   
4c00: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
4c10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4c20: 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 73 71 6c    *piRowid = sql
4c30: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
4c40: 5f 72 6f 77 69 64 28 70 2d 3e 70 43 6f 6e 66 69  _rowid(p->pConfi
4c50: 67 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  g->db);.    }.  
4c60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4c70: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
4c80: 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74 68   new row into th
4c90: 65 20 46 54 53 20 63 6f 6e 74 65 6e 74 20 74 61  e FTS content ta
4ca0: 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
4cb0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f  te3Fts5StorageCo
4cc0: 6e 74 65 6e 74 49 6e 73 65 72 74 28 0a 20 20 46  ntentInsert(.  F
4cd0: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 0a  ts5Storage *p, .
4ce0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4cf0: 2a 2a 61 70 56 61 6c 2c 20 0a 20 20 69 36 34 20  **apVal, .  i64 
4d00: 2a 70 69 52 6f 77 69 64 0a 29 7b 0a 20 20 46 74  *piRowid.){.  Ft
4d10: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
4d20: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
4d30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4d40: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65  E_OK;..  /* Inse
4d50: 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20 69  rt the new row i
4d60: 6e 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e  nto the %_conten
4d70: 74 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66  t table. */.  if
4d80: 28 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74  ( pConfig->eCont
4d90: 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45 4e  ent!=FTS5_CONTEN
4da0: 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0a 20 20 20 20  T_NORMAL ){.    
4db0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
4dc0: 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d 29  e_type(apVal[1])
4dd0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
4de0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 69 52 6f 77   ){.      *piRow
4df0: 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
4e00: 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 31  ue_int64(apVal[1
4e10: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
4e20: 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 53 74       rc = fts5St
4e30: 6f 72 61 67 65 4e 65 77 52 6f 77 69 64 28 70 2c  orageNewRowid(p,
4e40: 20 70 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d   piRowid);.    }
4e50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4e60: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73  lite3_stmt *pIns
4e70: 65 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ert = 0;    /* S
4e80: 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74  tatement to writ
4e90: 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c  e %_content tabl
4ea0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  e */.    int i; 
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
4ed0: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
4ee0: 20 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61    rc = fts5Stora
4ef0: 67 65 47 65 74 53 74 6d 74 28 70 2c 20 46 54 53  geGetStmt(p, FTS
4f00: 35 5f 53 54 4d 54 5f 49 4e 53 45 52 54 5f 43 4f  5_STMT_INSERT_CO
4f10: 4e 54 45 4e 54 2c 20 26 70 49 6e 73 65 72 74 2c  NTENT, &pInsert,
4f20: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31   0);.    for(i=1
4f30: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
4f40: 26 26 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  && i<=pConfig->n
4f50: 43 6f 6c 2b 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  Col+1; i++){.   
4f60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4f70: 62 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73 65  bind_value(pInse
4f80: 72 74 2c 20 69 2c 20 61 70 56 61 6c 5b 69 5d 29  rt, i, apVal[i])
4f90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4fa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4fb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4fc0: 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  tep(pInsert);.  
4fd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4fe0: 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b  _reset(pInsert);
4ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 69 52 6f  .    }.    *piRo
5000: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wid = sqlite3_la
5010: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
5020: 70 43 6f 6e 66 69 67 2d 3e 64 62 29 3b 0a 20 20  pConfig->db);.  
5030: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
5040: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
5050: 6e 65 77 20 65 6e 74 72 69 65 73 20 69 6e 74 6f  new entries into
5060: 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 61   the FTS index a
5070: 6e 64 20 25 5f 64 6f 63 73 69 7a 65 20 74 61 62  nd %_docsize tab
5080: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
5090: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 64  e3Fts5StorageInd
50a0: 65 78 49 6e 73 65 72 74 28 0a 20 20 46 74 73 35  exInsert(.  Fts5
50b0: 53 74 6f 72 61 67 65 20 2a 70 2c 20 0a 20 20 73  Storage *p, .  s
50c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
50d0: 70 56 61 6c 2c 20 0a 20 20 69 36 34 20 69 52 6f  pVal, .  i64 iRo
50e0: 77 69 64 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e  wid.){.  Fts5Con
50f0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
5100: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74  ->pConfig;.  int
5110: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5130: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
5140: 20 46 74 73 35 49 6e 73 65 72 74 43 74 78 20 63   Fts5InsertCtx c
5150: 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tx;             
5160: 20 2f 2a 20 54 6f 6b 65 6e 69 7a 61 74 69 6f 6e   /* Tokenization
5170: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 65 78   callback contex
5180: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  t object */.  Ft
5190: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51b0: 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20   Buffer used to 
51c0: 62 75 69 6c 64 20 75 70 20 25 5f 64 6f 63 73 69  build up %_docsi
51d0: 7a 65 20 62 6c 6f 62 20 2a 2f 0a 0a 20 20 6d 65  ze blob */..  me
51e0: 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
51f0: 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
5200: 29 3b 0a 20 20 63 74 78 2e 70 53 74 6f 72 61 67  );.  ctx.pStorag
5210: 65 20 3d 20 70 3b 0a 20 20 72 63 20 3d 20 66 74  e = p;.  rc = ft
5220: 73 35 53 74 6f 72 61 67 65 4c 6f 61 64 54 6f 74  s5StorageLoadTot
5230: 61 6c 73 28 70 2c 20 31 29 3b 0a 0a 20 20 69 66  als(p, 1);..  if
5240: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5250: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
5260: 74 65 33 46 74 73 35 49 6e 64 65 78 42 65 67 69  te3Fts5IndexBegi
5270: 6e 57 72 69 74 65 28 70 2d 3e 70 49 6e 64 65 78  nWrite(p->pIndex
5280: 2c 20 30 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  , 0, iRowid);.  
5290: 7d 0a 20 20 66 6f 72 28 63 74 78 2e 69 43 6f 6c  }.  for(ctx.iCol
52a0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
52b0: 4b 20 26 26 20 63 74 78 2e 69 43 6f 6c 3c 70 43  K && ctx.iCol<pC
52c0: 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 63 74 78  onfig->nCol; ctx
52d0: 2e 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 74  .iCol++){.    ct
52e0: 78 2e 73 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  x.szCol = 0;.   
52f0: 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 62   if( pConfig->ab
5300: 55 6e 69 6e 64 65 78 65 64 5b 63 74 78 2e 69 43  Unindexed[ctx.iC
5310: 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol]==0 ){.      
5320: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
5330: 54 6f 6b 65 6e 69 7a 65 28 70 43 6f 6e 66 69 67  Tokenize(pConfig
5340: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53  , .          FTS
5350: 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d  5_TOKENIZE_DOCUM
5360: 45 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 28  ENT,.          (
5370: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
5380: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5390: 70 56 61 6c 5b 63 74 78 2e 69 43 6f 6c 2b 32 5d  pVal[ctx.iCol+2]
53a0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ),.          sql
53b0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
53c0: 28 61 70 56 61 6c 5b 63 74 78 2e 69 43 6f 6c 2b  (apVal[ctx.iCol+
53d0: 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  2]),.          (
53e0: 76 6f 69 64 2a 29 26 63 74 78 2c 0a 20 20 20 20  void*)&ctx,.    
53f0: 20 20 20 20 20 20 66 74 73 35 53 74 6f 72 61 67        fts5Storag
5400: 65 49 6e 73 65 72 74 43 61 6c 6c 62 61 63 6b 0a  eInsertCallback.
5410: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
5420: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
5430: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
5440: 28 26 72 63 2c 20 26 62 75 66 2c 20 63 74 78 2e  (&rc, &buf, ctx.
5450: 73 7a 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61  szCol);.    p->a
5460: 54 6f 74 61 6c 53 69 7a 65 5b 63 74 78 2e 69 43  TotalSize[ctx.iC
5470: 6f 6c 5d 20 2b 3d 20 28 69 36 34 29 63 74 78 2e  ol] += (i64)ctx.
5480: 73 7a 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 2d 3e  szCol;.  }.  p->
5490: 6e 54 6f 74 61 6c 52 6f 77 2b 2b 3b 0a 0a 20 20  nTotalRow++;..  
54a0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 25 5f 64  /* Write the %_d
54b0: 6f 63 73 69 7a 65 20 72 65 63 6f 72 64 20 2a 2f  ocsize record */
54c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
54d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
54e0: 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65   fts5StorageInse
54f0: 72 74 44 6f 63 73 69 7a 65 28 70 2c 20 69 52 6f  rtDocsize(p, iRo
5500: 77 69 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a  wid, &buf);.  }.
5510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62    sqlite3_free(b
5520: 75 66 2e 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  uf.p);..  return
5530: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
5540: 6e 74 20 66 74 73 35 53 74 6f 72 61 67 65 43 6f  nt fts5StorageCo
5550: 75 6e 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  unt(Fts5Storage 
5560: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5570: 7a 53 75 66 66 69 78 2c 20 69 36 34 20 2a 70 6e  zSuffix, i64 *pn
5580: 52 6f 77 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  Row){.  Fts5Conf
5590: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
55a0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 63 68 61 72  >pConfig;.  char
55b0: 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63   *zSql;.  int rc
55c0: 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  ;..  zSql = sqli
55d0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
55e0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
55f0: 4d 20 25 51 2e 27 25 71 5f 25 73 27 22 2c 20 0a  M %Q.'%q_%s'", .
5600: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
5610: 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
5620: 6d 65 2c 20 7a 53 75 66 66 69 78 0a 20 20 29 3b  me, zSuffix.  );
5630: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
5640: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
5650: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
5660: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
5670: 6d 74 20 2a 70 43 6e 74 20 3d 20 30 3b 0a 20 20  mt *pCnt = 0;.  
5680: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
5690: 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69  repare_v2(pConfi
56a0: 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  g->db, zSql, -1,
56b0: 20 26 70 43 6e 74 2c 20 30 29 3b 0a 20 20 20 20   &pCnt, 0);.    
56c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
56d0: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  K ){.      if( S
56e0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
56f0: 65 33 5f 73 74 65 70 28 70 43 6e 74 29 20 29 7b  e3_step(pCnt) ){
5700: 0a 20 20 20 20 20 20 20 20 2a 70 6e 52 6f 77 20  .        *pnRow 
5710: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
5720: 5f 69 6e 74 36 34 28 70 43 6e 74 2c 20 30 29 3b  _int64(pCnt, 0);
5730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
5740: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
5750: 6c 69 7a 65 28 70 43 6e 74 29 3b 0a 20 20 20 20  lize(pCnt);.    
5760: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5770: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72  _free(zSql);.  r
5780: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5790: 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  ** Context objec
57a0: 74 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  t used by sqlite
57b0: 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74 65  3Fts5StorageInte
57c0: 67 72 69 74 79 28 29 2e 0a 2a 2f 0a 74 79 70 65  grity()..*/.type
57d0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 49  def struct Fts5I
57e0: 6e 74 65 67 72 69 74 79 43 74 78 20 46 74 73 35  ntegrityCtx Fts5
57f0: 49 6e 74 65 67 72 69 74 79 43 74 78 3b 0a 73 74  IntegrityCtx;.st
5800: 72 75 63 74 20 46 74 73 35 49 6e 74 65 67 72 69  ruct Fts5Integri
5810: 74 79 43 74 78 20 7b 0a 20 20 69 36 34 20 69 52  tyCtx {.  i64 iR
5820: 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  owid;.  int iCol
5830: 3b 0a 20 20 69 6e 74 20 73 7a 43 6f 6c 3b 0a 20  ;.  int szCol;. 
5840: 20 75 36 34 20 63 6b 73 75 6d 3b 0a 20 20 46 74   u64 cksum;.  Ft
5850: 73 35 54 65 72 6d 73 65 74 20 2a 70 54 65 72 6d  s5Termset *pTerm
5860: 73 65 74 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69  set;.  Fts5Confi
5870: 67 20 2a 70 43 6f 6e 66 69 67 3b 0a 7d 3b 0a 0a  g *pConfig;.};..
5880: 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 61 74  ./*.** Tokenizat
5890: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  ion callback use
58a0: 64 20 62 79 20 69 6e 74 65 67 72 69 74 79 20 63  d by integrity c
58b0: 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  heck..*/.static 
58c0: 69 6e 74 20 66 74 73 35 53 74 6f 72 61 67 65 49  int fts5StorageI
58d0: 6e 74 65 67 72 69 74 79 43 61 6c 6c 62 61 63 6b  ntegrityCallback
58e0: 28 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65  (.  void *pConte
58f0: 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
5900: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
5910: 6f 20 46 74 73 35 49 6e 74 65 67 72 69 74 79 43  o Fts5IntegrityC
5920: 74 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  tx object */.  i
5930: 6e 74 20 74 66 6c 61 67 73 2c 0a 20 20 63 6f 6e  nt tflags,.  con
5940: 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5960: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
5970: 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74  g token */.  int
5980: 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20   nToken,        
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
59a0: 53 69 7a 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e  Size of token in
59b0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
59c0: 69 55 6e 75 73 65 64 31 2c 20 20 20 20 20 20 20  iUnused1,       
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
59e0: 74 61 72 74 20 6f 66 66 73 65 74 20 6f 66 20 74  tart offset of t
59f0: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 55  oken */.  int iU
5a00: 6e 75 73 65 64 32 20 20 20 20 20 20 20 20 20 20  nused2          
5a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
5a20: 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e   offset of token
5a30: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e 74   */.){.  Fts5Int
5a40: 65 67 72 69 74 79 43 74 78 20 2a 70 43 74 78 20  egrityCtx *pCtx 
5a50: 3d 20 28 46 74 73 35 49 6e 74 65 67 72 69 74 79  = (Fts5Integrity
5a60: 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20  Ctx*)pContext;. 
5a70: 20 46 74 73 35 54 65 72 6d 73 65 74 20 2a 70 54   Fts5Termset *pT
5a80: 65 72 6d 73 65 74 20 3d 20 70 43 74 78 2d 3e 70  ermset = pCtx->p
5a90: 54 65 72 6d 73 65 74 3b 0a 20 20 69 6e 74 20 62  Termset;.  int b
5aa0: 50 72 65 73 65 6e 74 3b 0a 20 20 69 6e 74 20 69  Present;.  int i
5ab0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
5ac0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
5ad0: 50 6f 73 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  Pos;.  int iCol;
5ae0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
5af0: 32 28 69 55 6e 75 73 65 64 31 2c 20 69 55 6e 75  2(iUnused1, iUnu
5b00: 73 65 64 32 29 3b 0a 20 20 69 66 28 20 6e 54 6f  sed2);.  if( nTo
5b10: 6b 65 6e 3e 46 54 53 35 5f 4d 41 58 5f 54 4f 4b  ken>FTS5_MAX_TOK
5b20: 45 4e 5f 53 49 5a 45 20 29 20 6e 54 6f 6b 65 6e  EN_SIZE ) nToken
5b30: 20 3d 20 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45   = FTS5_MAX_TOKE
5b40: 4e 5f 53 49 5a 45 3b 0a 0a 20 20 69 66 28 20 28  N_SIZE;..  if( (
5b50: 74 66 6c 61 67 73 20 26 20 46 54 53 35 5f 54 4f  tflags & FTS5_TO
5b60: 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 29 3d 3d  KEN_COLOCATED)==
5b70: 30 20 7c 7c 20 70 43 74 78 2d 3e 73 7a 43 6f 6c  0 || pCtx->szCol
5b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  ==0 ){.    pCtx-
5b90: 3e 73 7a 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 0a 20  >szCol++;.  }.. 
5ba0: 20 73 77 69 74 63 68 28 20 70 43 74 78 2d 3e 70   switch( pCtx->p
5bb0: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 20  Config->eDetail 
5bc0: 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53 35  ){.    case FTS5
5bd0: 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 3a 0a 20 20  _DETAIL_FULL:.  
5be0: 20 20 20 20 69 50 6f 73 20 3d 20 70 43 74 78 2d      iPos = pCtx-
5bf0: 3e 73 7a 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20  >szCol-1;.      
5c00: 69 43 6f 6c 20 3d 20 70 43 74 78 2d 3e 69 43 6f  iCol = pCtx->iCo
5c10: 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
5c20: 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 44  .    case FTS5_D
5c30: 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 3a 0a 20  ETAIL_COLUMNS:. 
5c40: 20 20 20 20 20 69 50 6f 73 20 3d 20 70 43 74 78       iPos = pCtx
5c50: 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 43  ->iCol;.      iC
5c60: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ol = 0;.      br
5c70: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
5c80: 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
5c90: 20 70 43 74 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e   pCtx->pConfig->
5ca0: 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
5cb0: 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20  TAIL_NONE );.   
5cc0: 20 20 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20     iPos = 0;.   
5cd0: 20 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     iCol = 0;.   
5ce0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5cf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
5d00: 35 54 65 72 6d 73 65 74 41 64 64 28 70 54 65 72  5TermsetAdd(pTer
5d10: 6d 73 65 74 2c 20 30 2c 20 70 54 6f 6b 65 6e 2c  mset, 0, pToken,
5d20: 20 6e 54 6f 6b 65 6e 2c 20 26 62 50 72 65 73 65   nToken, &bPrese
5d30: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nt);.  if( rc==S
5d40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 50 72 65  QLITE_OK && bPre
5d50: 73 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  sent==0 ){.    p
5d60: 43 74 78 2d 3e 63 6b 73 75 6d 20 5e 3d 20 73 71  Ctx->cksum ^= sq
5d70: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
5d80: 74 72 79 43 6b 73 75 6d 28 0a 20 20 20 20 20 20  tryCksum(.      
5d90: 20 20 70 43 74 78 2d 3e 69 52 6f 77 69 64 2c 20    pCtx->iRowid, 
5da0: 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 30 2c 20 70  iCol, iPos, 0, p
5db0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20  Token, nToken.  
5dc0: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28    );.  }..  for(
5dd0: 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
5de0: 5f 4f 4b 20 26 26 20 69 69 3c 70 43 74 78 2d 3e  _OK && ii<pCtx->
5df0: 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
5e00: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  ; ii++){.    con
5e10: 73 74 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 70  st int nChar = p
5e20: 43 74 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 61 50  Ctx->pConfig->aP
5e30: 72 65 66 69 78 5b 69 69 5d 3b 0a 20 20 20 20 69  refix[ii];.    i
5e40: 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74  nt nByte = sqlit
5e50: 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c  e3Fts5IndexCharl
5e60: 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b  enToBytelen(pTok
5e70: 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61  en, nToken, nCha
5e80: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  r);.    if( nByt
5e90: 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
5ea0: 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d 73  sqlite3Fts5Terms
5eb0: 65 74 41 64 64 28 70 54 65 72 6d 73 65 74 2c 20  etAdd(pTermset, 
5ec0: 69 69 2b 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42  ii+1, pToken, nB
5ed0: 79 74 65 2c 20 26 62 50 72 65 73 65 6e 74 29 3b  yte, &bPresent);
5ee0: 0a 20 20 20 20 20 20 69 66 28 20 62 50 72 65 73  .      if( bPres
5ef0: 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent==0 ){.      
5f00: 20 20 70 43 74 78 2d 3e 63 6b 73 75 6d 20 5e 3d    pCtx->cksum ^=
5f10: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
5f20: 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 20  xEntryCksum(.   
5f30: 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69           pCtx->i
5f40: 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
5f50: 73 2c 20 69 69 2b 31 2c 20 70 54 6f 6b 65 6e 2c  s, ii+1, pToken,
5f60: 20 6e 42 79 74 65 0a 20 20 20 20 20 20 20 20 29   nByte.        )
5f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5f80: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
5f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
5fa0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
5fb0: 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e  ts of the FTS in
5fc0: 64 65 78 20 6d 61 74 63 68 20 74 68 61 74 20 6f  dex match that o
5fd0: 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 0a  f the %_content.
5fe0: 2a 2a 20 74 61 62 6c 65 2e 20 52 65 74 75 72 6e  ** table. Return
5ff0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
6000: 65 79 20 64 6f 2c 20 6f 72 20 53 51 4c 49 54 45  ey do, or SQLITE
6010: 5f 43 4f 52 52 55 50 54 20 69 66 20 6e 6f 74 2e  _CORRUPT if not.
6020: 20 52 65 74 75 72 6e 0a 2a 2a 20 73 6f 6d 65 20   Return.** some 
6030: 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72  other SQLite err
6040: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
6050: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
6060: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 0a 2a   attempting to.*
6070: 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73  * determine this
6080: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6090: 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74 65 67  Fts5StorageInteg
60a0: 72 69 74 79 28 46 74 73 35 53 74 6f 72 61 67 65  rity(Fts5Storage
60b0: 20 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66   *p){.  Fts5Conf
60c0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
60d0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20  >pConfig;.  int 
60e0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6100: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
6110: 69 6e 74 20 2a 61 43 6f 6c 53 69 7a 65 3b 20 20  int *aColSize;  
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 69 7a 65  /* Array of size
6140: 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20 2a   pConfig->nCol *
6150: 2f 0a 20 20 69 36 34 20 2a 61 54 6f 74 61 6c 53  /.  i64 *aTotalS
6160: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
6170: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6180: 73 69 7a 65 20 70 43 6f 6e 66 69 67 2d 3e 6e 43  size pConfig->nC
6190: 6f 6c 20 2a 2f 0a 20 20 46 74 73 35 49 6e 74 65  ol */.  Fts5Inte
61a0: 67 72 69 74 79 43 74 78 20 63 74 78 3b 0a 20 20  grityCtx ctx;.  
61b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
61c0: 63 61 6e 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  can;..  memset(&
61d0: 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ctx, 0, sizeof(F
61e0: 74 73 35 49 6e 74 65 67 72 69 74 79 43 74 78 29  ts5IntegrityCtx)
61f0: 29 3b 0a 20 20 63 74 78 2e 70 43 6f 6e 66 69 67  );.  ctx.pConfig
6200: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
6210: 20 61 54 6f 74 61 6c 53 69 7a 65 20 3d 20 28 69   aTotalSize = (i
6220: 36 34 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  64*)sqlite3_mall
6230: 6f 63 28 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  oc(pConfig->nCol
6240: 20 2a 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 2b   * (sizeof(int)+
6250: 73 69 7a 65 6f 66 28 69 36 34 29 29 29 3b 0a 20  sizeof(i64)));. 
6260: 20 69 66 28 20 21 61 54 6f 74 61 6c 53 69 7a 65   if( !aTotalSize
6270: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
6280: 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 43 6f 6c 53 69  _NOMEM;.  aColSi
6290: 7a 65 20 3d 20 28 69 6e 74 2a 29 26 61 54 6f 74  ze = (int*)&aTot
62a0: 61 6c 53 69 7a 65 5b 70 43 6f 6e 66 69 67 2d 3e  alSize[pConfig->
62b0: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
62c0: 61 54 6f 74 61 6c 53 69 7a 65 2c 20 30 2c 20 73  aTotalSize, 0, s
62d0: 69 7a 65 6f 66 28 69 36 34 29 20 2a 20 70 43 6f  izeof(i64) * pCo
62e0: 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a 0a 20 20  nfig->nCol);..  
62f0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
6300: 65 78 70 65 63 74 65 64 20 69 6e 64 65 78 20 63  expected index c
6310: 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
6320: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
6330: 20 74 68 65 0a 20 20 2a 2a 20 25 5f 63 6f 6e 74   the.  ** %_cont
6340: 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ent table. This 
6350: 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
6360: 20 63 68 65 63 6b 73 75 6d 20 69 6e 20 63 74 78   checksum in ctx
6370: 2e 63 6b 73 75 6d 2e 20 2a 2f 0a 20 20 72 63 20  .cksum. */.  rc 
6380: 3d 20 66 74 73 35 53 74 6f 72 61 67 65 47 65 74  = fts5StorageGet
6390: 53 74 6d 74 28 70 2c 20 46 54 53 35 5f 53 54 4d  Stmt(p, FTS5_STM
63a0: 54 5f 53 43 41 4e 2c 20 26 70 53 63 61 6e 2c 20  T_SCAN, &pScan, 
63b0: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
63c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
63d0: 6e 74 20 72 63 32 3b 0a 20 20 20 20 77 68 69 6c  nt rc2;.    whil
63e0: 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
63f0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 63 61  qlite3_step(pSca
6400: 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n) ){.      int 
6410: 69 3b 0a 20 20 20 20 20 20 63 74 78 2e 69 52 6f  i;.      ctx.iRo
6420: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  wid = sqlite3_co
6430: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 63 61 6e  lumn_int64(pScan
6440: 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 74 78 2e  , 0);.      ctx.
6450: 73 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  szCol = 0;.     
6460: 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62 43   if( pConfig->bC
6470: 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b 0a 20 20 20  olumnsize ){.   
6480: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6490: 33 46 74 73 35 53 74 6f 72 61 67 65 44 6f 63 73  3Fts5StorageDocs
64a0: 69 7a 65 28 70 2c 20 63 74 78 2e 69 52 6f 77 69  ize(p, ctx.iRowi
64b0: 64 2c 20 61 43 6f 6c 53 69 7a 65 29 3b 0a 20 20  d, aColSize);.  
64c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
64d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
64e0: 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69   pConfig->eDetai
64f0: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
6500: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
6510: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 54  c = sqlite3Fts5T
6520: 65 72 6d 73 65 74 4e 65 77 28 26 63 74 78 2e 70  ermsetNew(&ctx.p
6530: 54 65 72 6d 73 65 74 29 3b 0a 20 20 20 20 20 20  Termset);.      
6540: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
6550: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6560: 26 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  & i<pConfig->nCo
6570: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
6580: 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 62   if( pConfig->ab
6590: 55 6e 69 6e 64 65 78 65 64 5b 69 5d 20 29 20 63  Unindexed[i] ) c
65a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
65b0: 20 63 74 78 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20   ctx.iCol = i;. 
65c0: 20 20 20 20 20 20 20 63 74 78 2e 73 7a 43 6f 6c         ctx.szCol
65d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
65e0: 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ( pConfig->eDeta
65f0: 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
6600: 43 4f 4c 55 4d 4e 53 20 29 7b 0a 20 20 20 20 20  COLUMNS ){.     
6610: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6620: 33 46 74 73 35 54 65 72 6d 73 65 74 4e 65 77 28  3Fts5TermsetNew(
6630: 26 63 74 78 2e 70 54 65 72 6d 73 65 74 29 3b 0a  &ctx.pTermset);.
6640: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6650: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6660: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
6670: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
6680: 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f 6e 66 69  5Tokenize(pConfi
6690: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
66a0: 20 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f    FTS5_TOKENIZE_
66b0: 44 4f 43 55 4d 45 4e 54 2c 0a 20 20 20 20 20 20  DOCUMENT,.      
66c0: 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
66d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
66e0: 75 6d 6e 5f 74 65 78 74 28 70 53 63 61 6e 2c 20  umn_text(pScan, 
66f0: 69 2b 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20  i+1),.          
6700: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
6710: 6d 6e 5f 62 79 74 65 73 28 70 53 63 61 6e 2c 20  mn_bytes(pScan, 
6720: 69 2b 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20  i+1),.          
6730: 20 20 20 20 28 76 6f 69 64 2a 29 26 63 74 78 2c      (void*)&ctx,
6740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
6750: 74 73 35 53 74 6f 72 61 67 65 49 6e 74 65 67 72  ts5StorageIntegr
6760: 69 74 79 43 61 6c 6c 62 61 63 6b 0a 20 20 20 20  ityCallback.    
6770: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
6780: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
6790: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
67a0: 70 43 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75 6d 6e  pConfig->bColumn
67b0: 73 69 7a 65 20 26 26 20 63 74 78 2e 73 7a 43 6f  size && ctx.szCo
67c0: 6c 21 3d 61 43 6f 6c 53 69 7a 65 5b 69 5d 20 29  l!=aColSize[i] )
67d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
67e0: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
67f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6800: 20 61 54 6f 74 61 6c 53 69 7a 65 5b 69 5d 20 2b   aTotalSize[i] +
6810: 3d 20 63 74 78 2e 73 7a 43 6f 6c 3b 0a 20 20 20  = ctx.szCol;.   
6820: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67       if( pConfig
6830: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
6840: 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29  DETAIL_COLUMNS )
6850: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6860: 74 65 33 46 74 73 35 54 65 72 6d 73 65 74 46 72  te3Fts5TermsetFr
6870: 65 65 28 63 74 78 2e 70 54 65 72 6d 73 65 74 29  ee(ctx.pTermset)
6880: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 74 78 2e  ;.          ctx.
6890: 70 54 65 72 6d 73 65 74 20 3d 20 30 3b 0a 20 20  pTermset = 0;.  
68a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
68b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
68c0: 35 54 65 72 6d 73 65 74 46 72 65 65 28 63 74 78  5TermsetFree(ctx
68d0: 2e 70 54 65 72 6d 73 65 74 29 3b 0a 20 20 20 20  .pTermset);.    
68e0: 20 20 63 74 78 2e 70 54 65 72 6d 73 65 74 20 3d    ctx.pTermset =
68f0: 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72   0;..      if( r
6900: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
6910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6920: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
6930: 73 65 74 28 70 53 63 61 6e 29 3b 0a 20 20 20 20  set(pScan);.    
6940: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6950: 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
6960: 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 74 68 61  }..  /* Test tha
6970: 74 20 74 68 65 20 22 74 6f 74 61 6c 73 22 20 28  t the "totals" (
6980: 73 6f 6d 65 74 69 6d 65 73 20 63 61 6c 6c 65 64  sometimes called
6990: 20 22 61 76 65 72 61 67 65 73 22 29 20 72 65 63   "averages") rec
69a0: 6f 72 64 20 6c 6f 6f 6b 73 20 4f 6b 20 2a 2f 0a  ord looks Ok */.
69b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
69c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
69d0: 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 53  ;.    rc = fts5S
69e0: 74 6f 72 61 67 65 4c 6f 61 64 54 6f 74 61 6c 73  torageLoadTotals
69f0: 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  (p, 0);.    for(
6a00: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6a10: 4f 4b 20 26 26 20 69 3c 70 43 6f 6e 66 69 67 2d  OK && i<pConfig-
6a20: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
6a30: 20 20 20 69 66 28 20 70 2d 3e 61 54 6f 74 61 6c     if( p->aTotal
6a40: 53 69 7a 65 5b 69 5d 21 3d 61 54 6f 74 61 6c 53  Size[i]!=aTotalS
6a50: 69 7a 65 5b 69 5d 20 29 20 72 63 20 3d 20 46 54  ize[i] ) rc = FT
6a60: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
6a70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
6a80: 6b 20 74 68 61 74 20 74 68 65 20 25 5f 64 6f 63  k that the %_doc
6a90: 73 69 7a 65 20 61 6e 64 20 25 5f 63 6f 6e 74 65  size and %_conte
6aa0: 6e 74 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69  nt tables contai
6ab0: 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20  n the expected. 
6ac0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   ** number of ro
6ad0: 77 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  ws.  */.  if( rc
6ae0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
6af0: 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74  Config->eContent
6b00: 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e  ==FTS5_CONTENT_N
6b10: 4f 52 4d 41 4c 20 29 7b 0a 20 20 20 20 69 36 34  ORMAL ){.    i64
6b20: 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 72   nRow = 0;.    r
6b30: 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67 65 43  c = fts5StorageC
6b40: 6f 75 6e 74 28 70 2c 20 22 63 6f 6e 74 65 6e 74  ount(p, "content
6b50: 22 2c 20 26 6e 52 6f 77 29 3b 0a 20 20 20 20 69  ", &nRow);.    i
6b60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6b70: 20 26 26 20 6e 52 6f 77 21 3d 70 2d 3e 6e 54 6f   && nRow!=p->nTo
6b80: 74 61 6c 52 6f 77 20 29 20 72 63 20 3d 20 46 54  talRow ) rc = FT
6b90: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  S5_CORRUPT;.  }.
6ba0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6bb0: 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e  _OK && pConfig->
6bc0: 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b 0a 20  bColumnsize ){. 
6bd0: 20 20 20 69 36 34 20 6e 52 6f 77 20 3d 20 30 3b     i64 nRow = 0;
6be0: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 53 74  .    rc = fts5St
6bf0: 6f 72 61 67 65 43 6f 75 6e 74 28 70 2c 20 22 64  orageCount(p, "d
6c00: 6f 63 73 69 7a 65 22 2c 20 26 6e 52 6f 77 29 3b  ocsize", &nRow);
6c10: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6c20: 49 54 45 5f 4f 4b 20 26 26 20 6e 52 6f 77 21 3d  ITE_OK && nRow!=
6c30: 70 2d 3e 6e 54 6f 74 61 6c 52 6f 77 20 29 20 72  p->nTotalRow ) r
6c40: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
6c50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 73 73  ;.  }..  /* Pass
6c60: 20 74 68 65 20 65 78 70 65 63 74 65 64 20 63 68   the expected ch
6c70: 65 63 6b 73 75 6d 20 64 6f 77 6e 20 74 6f 20 74  ecksum down to t
6c80: 68 65 20 46 54 53 20 69 6e 64 65 78 20 6d 6f 64  he FTS index mod
6c90: 75 6c 65 2e 20 49 74 20 77 69 6c 6c 0a 20 20 2a  ule. It will.  *
6ca0: 2a 20 76 65 72 69 66 79 2c 20 61 6d 6f 6e 67 73  * verify, amongs
6cb0: 74 20 6f 74 68 65 72 20 74 68 69 6e 67 73 2c 20  t other things, 
6cc0: 74 68 61 74 20 69 74 20 6d 61 74 63 68 65 73 20  that it matches 
6cd0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 67 65 6e  the checksum gen
6ce0: 65 72 61 74 65 64 20 62 79 0a 20 20 2a 2a 20 69  erated by.  ** i
6cf0: 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 69 6e  nspecting the in
6d00: 64 65 78 20 69 74 73 65 6c 66 2e 20 20 2a 2f 0a  dex itself.  */.
6d10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6d20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6d30: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
6d40: 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 70  IntegrityCheck(p
6d50: 2d 3e 70 49 6e 64 65 78 2c 20 63 74 78 2e 63 6b  ->pIndex, ctx.ck
6d60: 73 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  sum);.  }..  sql
6d70: 69 74 65 33 5f 66 72 65 65 28 61 54 6f 74 61 6c  ite3_free(aTotal
6d80: 53 69 7a 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Size);.  return 
6d90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  rc;.}../*.** Obt
6da0: 61 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 73 74  ain an SQLite st
6db0: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
6dc0: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20  hat may be used 
6dd0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
6de0: 6d 20 74 68 65 0a 2a 2a 20 25 5f 63 6f 6e 74 65  m the.** %_conte
6df0: 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  nt table..*/.int
6e00: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
6e10: 61 67 65 53 74 6d 74 28 0a 20 20 46 74 73 35 53  ageStmt(.  Fts5S
6e20: 74 6f 72 61 67 65 20 2a 70 2c 20 0a 20 20 69 6e  torage *p, .  in
6e30: 74 20 65 53 74 6d 74 2c 20 0a 20 20 73 71 6c 69  t eStmt, .  sqli
6e40: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 2c 20 0a  te3_stmt **pp, .
6e50: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
6e60: 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  g.){.  int rc;. 
6e70: 20 61 73 73 65 72 74 28 20 65 53 74 6d 74 3d 3d   assert( eStmt==
6e80: 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e 5f 41  FTS5_STMT_SCAN_A
6e90: 53 43 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 53  SC .       || eS
6ea0: 74 6d 74 3d 3d 46 54 53 35 5f 53 54 4d 54 5f 53  tmt==FTS5_STMT_S
6eb0: 43 41 4e 5f 44 45 53 43 0a 20 20 20 20 20 20 20  CAN_DESC.       
6ec0: 7c 7c 20 65 53 74 6d 74 3d 3d 46 54 53 35 5f 53  || eStmt==FTS5_S
6ed0: 54 4d 54 5f 4c 4f 4f 4b 55 50 0a 20 20 29 3b 0a  TMT_LOOKUP.  );.
6ee0: 20 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61    rc = fts5Stora
6ef0: 67 65 47 65 74 53 74 6d 74 28 70 2c 20 65 53 74  geGetStmt(p, eSt
6f00: 6d 74 2c 20 70 70 2c 20 70 7a 45 72 72 4d 73 67  mt, pp, pzErrMsg
6f10: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6f20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
6f30: 73 65 72 74 28 20 70 2d 3e 61 53 74 6d 74 5b 65  sert( p->aStmt[e
6f40: 53 74 6d 74 5d 3d 3d 2a 70 70 20 29 3b 0a 20 20  Stmt]==*pp );.  
6f50: 20 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74    p->aStmt[eStmt
6f60: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  ] = 0;.  }.  ret
6f70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6f80: 20 52 65 6c 65 61 73 65 20 61 6e 20 53 51 4c 69   Release an SQLi
6f90: 74 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e  te statement han
6fa0: 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61  dle obtained via
6fb0: 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
6fc0: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74   to.** sqlite3Ft
6fd0: 73 35 53 74 6f 72 61 67 65 53 74 6d 74 28 29 2e  s5StorageStmt().
6fe0: 20 54 68 65 20 65 53 74 6d 74 20 70 61 72 61 6d   The eStmt param
6ff0: 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74  eter passed to t
7000: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
7010: 6d 75 73 74 20 6d 61 74 63 68 20 74 68 61 74 20  must match that 
7020: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71  passed to the sq
7030: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
7040: 53 74 6d 74 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  Stmt() call..*/.
7050: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
7060: 53 74 6f 72 61 67 65 53 74 6d 74 52 65 6c 65 61  StorageStmtRelea
7070: 73 65 28 0a 20 20 46 74 73 35 53 74 6f 72 61 67  se(.  Fts5Storag
7080: 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 65 53 74  e *p, .  int eSt
7090: 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  mt, .  sqlite3_s
70a0: 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20  tmt *pStmt.){.  
70b0: 61 73 73 65 72 74 28 20 65 53 74 6d 74 3d 3d 46  assert( eStmt==F
70c0: 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e 5f 41 53  TS5_STMT_SCAN_AS
70d0: 43 0a 20 20 20 20 20 20 20 7c 7c 20 65 53 74 6d  C.       || eStm
70e0: 74 3d 3d 46 54 53 35 5f 53 54 4d 54 5f 53 43 41  t==FTS5_STMT_SCA
70f0: 4e 5f 44 45 53 43 0a 20 20 20 20 20 20 20 7c 7c  N_DESC.       ||
7100: 20 65 53 74 6d 74 3d 3d 46 54 53 35 5f 53 54 4d   eStmt==FTS5_STM
7110: 54 5f 4c 4f 4f 4b 55 50 0a 20 20 29 3b 0a 20 20  T_LOOKUP.  );.  
7120: 69 66 28 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74  if( p->aStmt[eSt
7130: 6d 74 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  mt]==0 ){.    sq
7140: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
7150: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 53 74 6d 74  t);.    p->aStmt
7160: 5b 65 53 74 6d 74 5d 20 3d 20 70 53 74 6d 74 3b  [eStmt] = pStmt;
7170: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
7180: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
7190: 53 74 6d 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Stmt);.  }.}..st
71a0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74 6f  atic int fts5Sto
71b0: 72 61 67 65 44 65 63 6f 64 65 53 69 7a 65 41 72  rageDecodeSizeAr
71c0: 72 61 79 28 0a 20 20 69 6e 74 20 2a 61 43 6f 6c  ray(.  int *aCol
71d0: 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20  , int nCol,     
71e0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
71f0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20  to populate */. 
7200: 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62   const u8 *aBlob
7210: 2c 20 69 6e 74 20 6e 42 6c 6f 62 20 20 20 20 20  , int nBlob     
7220: 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 72 65   /* Record to re
7230: 61 64 20 76 61 72 69 6e 74 73 20 66 72 6f 6d 20  ad varints from 
7240: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
7250: 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
7260: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
7270: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7280: 69 4f 66 66 3e 3d 6e 42 6c 6f 62 20 29 20 72 65  iOff>=nBlob ) re
7290: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 4f 66 66  turn 1;.    iOff
72a0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
72b0: 74 33 32 28 26 61 42 6c 6f 62 5b 69 4f 66 66 5d  t32(&aBlob[iOff]
72c0: 2c 20 61 43 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a  , aCol[i]);.  }.
72d0: 20 20 72 65 74 75 72 6e 20 28 69 4f 66 66 21 3d    return (iOff!=
72e0: 6e 42 6c 6f 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nBlob);.}../*.**
72f0: 20 41 72 67 75 6d 65 6e 74 20 61 43 6f 6c 20 70   Argument aCol p
7300: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 72 72 61  oints to an arra
7310: 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 63 6f  y of integers co
7320: 6e 74 61 69 6e 69 6e 67 20 6f 6e 65 20 65 6e 74  ntaining one ent
7330: 72 79 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 74  ry for.** each t
7340: 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69  able column. Thi
7350: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
7360: 20 74 68 65 20 25 5f 64 6f 63 73 69 7a 65 20 72   the %_docsize r
7370: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 0a 2a 2a  ecord for the.**
7380: 20 73 70 65 63 69 66 69 65 64 20 72 6f 77 69 64   specified rowid
7390: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20 61   and populates a
73a0: 43 6f 6c 5b 5d 20 77 69 74 68 20 74 68 65 20 72  Col[] with the r
73b0: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  esults..**.** An
73c0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
73d0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
73e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
73f0: 73 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a  s, or SQLITE_OK.
7400: 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
7410: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
7420: 53 74 6f 72 61 67 65 44 6f 63 73 69 7a 65 28 46  StorageDocsize(F
7430: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
7440: 36 34 20 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a  64 iRowid, int *
7450: 61 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 43 6f  aCol){.  int nCo
7460: 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
7470: 6e 43 6f 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62  nCol;    /* Numb
7480: 65 72 20 6f 66 20 75 73 65 72 20 63 6f 6c 75 6d  er of user colum
7490: 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ns in table */. 
74a0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
74b0: 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20  Lookup = 0;     
74c0: 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f   /* Statement to
74d0: 20 71 75 65 72 79 20 25 5f 64 6f 63 73 69 7a 65   query %_docsize
74e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
7510: 43 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  Code */..  asser
7520: 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 62  t( p->pConfig->b
7530: 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 3b 0a 20 20  Columnsize );.  
7540: 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67 65  rc = fts5Storage
7550: 47 65 74 53 74 6d 74 28 70 2c 20 46 54 53 35 5f  GetStmt(p, FTS5_
7560: 53 54 4d 54 5f 4c 4f 4f 4b 55 50 5f 44 4f 43 53  STMT_LOOKUP_DOCS
7570: 49 5a 45 2c 20 26 70 4c 6f 6f 6b 75 70 2c 20 30  IZE, &pLookup, 0
7580: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
7590: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
75a0: 74 20 62 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a  t bCorrupt = 1;.
75b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
75c0: 5f 69 6e 74 36 34 28 70 4c 6f 6f 6b 75 70 2c 20  _int64(pLookup, 
75d0: 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  1, iRowid);.    
75e0: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
75f0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 6f  sqlite3_step(pLo
7600: 6f 6b 75 70 29 20 29 7b 0a 20 20 20 20 20 20 63  okup) ){.      c
7610: 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 20 3d  onst u8 *aBlob =
7620: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7630: 62 6c 6f 62 28 70 4c 6f 6f 6b 75 70 2c 20 30 29  blob(pLookup, 0)
7640: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f  ;.      int nBlo
7650: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
7660: 6d 6e 5f 62 79 74 65 73 28 70 4c 6f 6f 6b 75 70  mn_bytes(pLookup
7670: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
7680: 30 3d 3d 66 74 73 35 53 74 6f 72 61 67 65 44 65  0==fts5StorageDe
7690: 63 6f 64 65 53 69 7a 65 41 72 72 61 79 28 61 43  codeSizeArray(aC
76a0: 6f 6c 2c 20 6e 43 6f 6c 2c 20 61 42 6c 6f 62 2c  ol, nCol, aBlob,
76b0: 20 6e 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20 20   nBlob) ){.     
76c0: 20 20 20 62 43 6f 72 72 75 70 74 20 3d 20 30 3b     bCorrupt = 0;
76d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
76e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
76f0: 72 65 73 65 74 28 70 4c 6f 6f 6b 75 70 29 3b 0a  reset(pLookup);.
7700: 20 20 20 20 69 66 28 20 62 43 6f 72 72 75 70 74      if( bCorrupt
7710: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
7720: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
7730: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
7740: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
7750: 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  n rc;.}..int sql
7760: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
7770: 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65 20  ize(Fts5Storage 
7780: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 36  *p, int iCol, i6
7790: 34 20 2a 70 6e 54 6f 6b 65 6e 29 7b 0a 20 20 69  4 *pnToken){.  i
77a0: 6e 74 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72  nt rc = fts5Stor
77b0: 61 67 65 4c 6f 61 64 54 6f 74 61 6c 73 28 70 2c  ageLoadTotals(p,
77c0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
77d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
77e0: 2a 70 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20  *pnToken = 0;.  
77f0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
7800: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
7810: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
7820: 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20  >pConfig->nCol; 
7830: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  i++){.        *p
7840: 6e 54 6f 6b 65 6e 20 2b 3d 20 70 2d 3e 61 54 6f  nToken += p->aTo
7850: 74 61 6c 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  talSize[i];.    
7860: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
7870: 28 20 69 43 6f 6c 3c 70 2d 3e 70 43 6f 6e 66 69  ( iCol<p->pConfi
7880: 67 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  g->nCol ){.     
7890: 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 70 2d 3e 61   *pnToken = p->a
78a0: 54 6f 74 61 6c 53 69 7a 65 5b 69 43 6f 6c 5d 3b  TotalSize[iCol];
78b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
78c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 41    rc = SQLITE_RA
78d0: 4e 47 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  NGE;.    }.  }. 
78e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
78f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
7900: 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28 46 74  orageRowCount(Ft
7910: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36  s5Storage *p, i6
7920: 34 20 2a 70 6e 52 6f 77 29 7b 0a 20 20 69 6e 74  4 *pnRow){.  int
7930: 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67   rc = fts5Storag
7940: 65 4c 6f 61 64 54 6f 74 61 6c 73 28 70 2c 20 30  eLoadTotals(p, 0
7950: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
7960: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
7970: 6e 52 6f 77 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c  nRow = p->nTotal
7980: 52 6f 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Row;.  }.  retur
7990: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
79a0: 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 75  lush any data cu
79b0: 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 2d  rrently held in-
79c0: 6d 65 6d 6f 72 79 20 74 6f 20 64 69 73 6b 2e 0a  memory to disk..
79d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
79e0: 73 35 53 74 6f 72 61 67 65 53 79 6e 63 28 46 74  s5StorageSync(Ft
79f0: 73 35 53 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20  s5Storage *p){. 
7a00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7a10: 5f 4f 4b 3b 0a 20 20 69 36 34 20 69 4c 61 73 74  _OK;.  i64 iLast
7a20: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
7a30: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
7a40: 64 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62  d(p->pConfig->db
7a50: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 62 54 6f 74  );.  if( p->bTot
7a60: 61 6c 73 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  alsValid ){.    
7a70: 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67 65  rc = fts5Storage
7a80: 53 61 76 65 54 6f 74 61 6c 73 28 70 29 3b 0a 20  SaveTotals(p);. 
7a90: 20 20 20 70 2d 3e 62 54 6f 74 61 6c 73 56 61 6c     p->bTotalsVal
7aa0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  id = 0;.  }.  if
7ab0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7ac0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
7ad0: 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63  te3Fts5IndexSync
7ae0: 28 70 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20 7d  (p->pIndex);.  }
7af0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c  .  sqlite3_set_l
7b00: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
7b10: 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  (p->pConfig->db,
7b20: 20 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20   iLastRowid);.  
7b30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
7b40: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
7b50: 72 61 67 65 52 6f 6c 6c 62 61 63 6b 28 46 74 73  rageRollback(Fts
7b60: 35 53 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20  5Storage *p){.  
7b70: 70 2d 3e 62 54 6f 74 61 6c 73 56 61 6c 69 64 20  p->bTotalsValid 
7b80: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  = 0;.  return sq
7b90: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f  lite3Fts5IndexRo
7ba0: 6c 6c 62 61 63 6b 28 70 2d 3e 70 49 6e 64 65 78  llback(p->pIndex
7bb0: 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  );.}..int sqlite
7bc0: 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 66  3Fts5StorageConf
7bd0: 69 67 56 61 6c 75 65 28 0a 20 20 46 74 73 35 53  igValue(.  Fts5S
7be0: 74 6f 72 61 67 65 20 2a 70 2c 20 0a 20 20 63 6f  torage *p, .  co
7bf0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 0a 20 20 73  nst char *z,.  s
7c00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
7c10: 61 6c 2c 0a 20 20 69 6e 74 20 69 56 61 6c 0a 29  al,.  int iVal.)
7c20: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
7c30: 20 2a 70 52 65 70 6c 61 63 65 20 3d 20 30 3b 0a   *pReplace = 0;.
7c40: 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 35 53    int rc = fts5S
7c50: 74 6f 72 61 67 65 47 65 74 53 74 6d 74 28 70 2c  torageGetStmt(p,
7c60: 20 46 54 53 35 5f 53 54 4d 54 5f 52 45 50 4c 41   FTS5_STMT_REPLA
7c70: 43 45 5f 43 4f 4e 46 49 47 2c 20 26 70 52 65 70  CE_CONFIG, &pRep
7c80: 6c 61 63 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  lace, 0);.  if( 
7c90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
7cb0: 64 5f 74 65 78 74 28 70 52 65 70 6c 61 63 65 2c  d_text(pReplace,
7cc0: 20 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54   1, z, -1, SQLIT
7cd0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69  E_STATIC);.    i
7ce0: 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20 20  f( pVal ){.     
7cf0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
7d00: 6c 75 65 28 70 52 65 70 6c 61 63 65 2c 20 32 2c  lue(pReplace, 2,
7d10: 20 70 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73   pVal);.    }els
7d20: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
7d30: 5f 62 69 6e 64 5f 69 6e 74 28 70 52 65 70 6c 61  _bind_int(pRepla
7d40: 63 65 2c 20 32 2c 20 69 56 61 6c 29 3b 0a 20 20  ce, 2, iVal);.  
7d50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
7d60: 73 74 65 70 28 70 52 65 70 6c 61 63 65 29 3b 0a  step(pReplace);.
7d70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7d80: 5f 72 65 73 65 74 28 70 52 65 70 6c 61 63 65 29  _reset(pReplace)
7d90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
7da0: 6e 64 5f 6e 75 6c 6c 28 70 52 65 70 6c 61 63 65  nd_null(pReplace
7db0: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
7dc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7dd0: 20 70 56 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74   pVal ){.    int
7de0: 20 69 4e 65 77 20 3d 20 70 2d 3e 70 43 6f 6e 66   iNew = p->pConf
7df0: 69 67 2d 3e 69 43 6f 6f 6b 69 65 20 2b 20 31 3b  ig->iCookie + 1;
7e00: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7e10: 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f  3Fts5IndexSetCoo
7e20: 6b 69 65 28 70 2d 3e 70 49 6e 64 65 78 2c 20 69  kie(p->pIndex, i
7e30: 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 72 63  New);.    if( rc
7e40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7e50: 20 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 2d       p->pConfig-
7e60: 3e 69 43 6f 6f 6b 69 65 20 3d 20 69 4e 65 77 3b  >iCookie = iNew;
7e70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7e80: 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.