/ Hex Artifact Content
Login

Artifact 7750986004f3f0c94619a85ecb5dd6cbef53e5e3853488e8a906c269d4d11db6:


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 32 28 70 43 2d 3e 64 62 2c 20 7a  are_v2(pC->db, z
10f0: 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 61 53 74  Sql, -1, &p->aSt
1100: 6d 74 5b 65 53 74 6d 74 5d 2c 20 30 29 3b 0a 20  mt[eStmt], 0);. 
1110: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1120: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69  e(zSql);.      i
1130: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1140: 20 26 26 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a   && pzErrMsg ){.
1150: 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
1160: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
1170: 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
1180: 33 5f 65 72 72 6d 73 67 28 70 43 2d 3e 64 62 29  3_errmsg(pC->db)
1190: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11a0: 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 74 6d 74 20  .  }..  *ppStmt 
11b0: 3d 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74  = p->aStmt[eStmt
11c0: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ];.  sqlite3_res
11d0: 65 74 28 2a 70 70 53 74 6d 74 29 3b 0a 20 20 72  et(*ppStmt);.  r
11e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
11f0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 65  atic int fts5Exe
1200: 63 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74  cPrintf(.  sqlit
1210: 65 33 20 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a  e3 *db,.  char *
1220: 2a 70 7a 45 72 72 2c 0a 20 20 63 6f 6e 73 74 20  *pzErr,.  const 
1230: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20  char *zFormat,. 
1240: 20 2e 2e 2e 0a 29 7b 0a 20 20 69 6e 74 20 72 63   ....){.  int rc
1250: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 20  ;.  va_list ap; 
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 20 20 2f 2a 20 2e 2e 2e 20 70 72 69 6e 74      /* ... print
1280: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1290: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20   char *zSql;..  
12a0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
12b0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
12c0: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
12d0: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 0a  (zFormat, ap);..
12e0: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
12f0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1300: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
1310: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1320: 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c  3_exec(db, zSql,
1330: 20 30 2c 20 30 2c 20 70 7a 45 72 72 29 3b 0a 20   0, 0, pzErr);. 
1340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1350: 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 76 61  zSql);.  }..  va
1360: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
1370: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1380: 44 72 6f 70 20 61 6c 6c 20 73 68 61 64 6f 77 20  Drop all shadow 
1390: 74 61 62 6c 65 73 2e 20 52 65 74 75 72 6e 20 53  tables. Return S
13a0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
13b0: 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c  essful or an SQL
13c0: 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
13d0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
13e0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 44  int sqlite3Fts5D
13f0: 72 6f 70 41 6c 6c 28 46 74 73 35 43 6f 6e 66 69  ropAll(Fts5Confi
1400: 67 20 2a 70 43 6f 6e 66 69 67 29 7b 0a 20 20 69  g *pConfig){.  i
1410: 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78 65 63  nt rc = fts5Exec
1420: 50 72 69 6e 74 66 28 70 43 6f 6e 66 69 67 2d 3e  Printf(pConfig->
1430: 64 62 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 44  db, 0, .      "D
1440: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
1450: 53 54 53 20 25 51 2e 27 25 71 5f 64 61 74 61 27  STS %Q.'%q_data'
1460: 3b 22 0a 20 20 20 20 20 20 22 44 52 4f 50 20 54  ;".      "DROP T
1470: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 25  ABLE IF EXISTS %
1480: 51 2e 27 25 71 5f 69 64 78 27 3b 22 0a 20 20 20  Q.'%q_idx';".   
1490: 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49     "DROP TABLE I
14a0: 46 20 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f  F EXISTS %Q.'%q_
14b0: 63 6f 6e 66 69 67 27 3b 22 2c 0a 20 20 20 20 20  config';",.     
14c0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
14d0: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 0a 20  Config->zName,. 
14e0: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
14f0: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
1500: 65 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  e,.      pConfig
1510: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
1520: 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28  zName.  );.  if(
1530: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1540: 26 20 70 43 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75  & pConfig->bColu
1550: 6d 6e 73 69 7a 65 20 29 7b 0a 20 20 20 20 72 63  mnsize ){.    rc
1560: 20 3d 20 66 74 73 35 45 78 65 63 50 72 69 6e 74   = fts5ExecPrint
1570: 66 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 30  f(pConfig->db, 0
1580: 2c 20 0a 20 20 20 20 20 20 20 20 22 44 52 4f 50  , .        "DROP
1590: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
15a0: 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27   %Q.'%q_docsize'
15b0: 3b 22 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 6e  ;",.        pCon
15c0: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
15d0: 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  g->zName.    );.
15e0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66  LITE_OK && pConf
1600: 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54  ig->eContent==FT
1610: 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41  S5_CONTENT_NORMA
1620: 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  L ){.    rc = ft
1630: 73 35 45 78 65 63 50 72 69 6e 74 66 28 70 43 6f  s5ExecPrintf(pCo
1640: 6e 66 69 67 2d 3e 64 62 2c 20 30 2c 20 0a 20 20  nfig->db, 0, .  
1650: 20 20 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c        "DROP TABL
1660: 45 20 49 46 20 45 58 49 53 54 53 20 25 51 2e 27  E IF EXISTS %Q.'
1670: 25 71 5f 63 6f 6e 74 65 6e 74 27 3b 22 2c 0a 20  %q_content';",. 
1680: 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e         pConfig->
1690: 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  zDb, pConfig->zN
16a0: 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  ame.    );.  }. 
16b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
16c0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
16d0: 74 6f 72 61 67 65 52 65 6e 61 6d 65 4f 6e 65 28  torageRenameOne(
16e0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
16f0: 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20  Config,         
1700: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 46 54     /* Current FT
1710: 53 35 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  S5 configuration
1720: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20   */.  int *pRc, 
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1750: 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
1760: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1770: 69 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  il,             
1780: 20 2f 2a 20 54 61 69 6c 20 6f 66 20 74 61 62 6c   /* Tail of tabl
1790: 65 20 6e 61 6d 65 20 65 2e 67 2e 20 22 64 61 74  e name e.g. "dat
17a0: 61 22 2c 20 22 63 6f 6e 66 69 67 22 20 2a 2f 0a  a", "config" */.
17b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
17c0: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
17d0: 20 20 2f 2a 20 4e 65 77 20 6e 61 6d 65 20 6f 66    /* New name of
17e0: 20 46 54 53 35 20 74 61 62 6c 65 20 2a 2f 0a 29   FTS5 table */.)
17f0: 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
1800: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
1810: 70 52 63 20 3d 20 66 74 73 35 45 78 65 63 50 72  pRc = fts5ExecPr
1820: 69 6e 74 66 28 70 43 6f 6e 66 69 67 2d 3e 64 62  intf(pConfig->db
1830: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 22 41  , 0, .        "A
1840: 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25  LTER TABLE %Q.'%
1850: 71 5f 25 73 27 20 52 45 4e 41 4d 45 20 54 4f 20  q_%s' RENAME TO 
1860: 27 25 71 5f 25 73 27 3b 22 2c 0a 20 20 20 20 20  '%q_%s';",.     
1870: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
1880: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c   pConfig->zName,
1890: 20 7a 54 61 69 6c 2c 20 7a 4e 61 6d 65 2c 20 7a   zTail, zName, z
18a0: 54 61 69 6c 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Tail.    );.  }.
18b0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
18c0: 73 35 53 74 6f 72 61 67 65 52 65 6e 61 6d 65 28  s5StorageRename(
18d0: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 53 74  Fts5Storage *pSt
18e0: 6f 72 61 67 65 2c 20 63 6f 6e 73 74 20 63 68 61  orage, const cha
18f0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 46 74 73  r *zName){.  Fts
1900: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1910: 20 3d 20 70 53 74 6f 72 61 67 65 2d 3e 70 43 6f   = pStorage->pCo
1920: 6e 66 69 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nfig;.  int rc =
1930: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
1940: 61 67 65 53 79 6e 63 28 70 53 74 6f 72 61 67 65  ageSync(pStorage
1950: 29 3b 0a 0a 20 20 66 74 73 35 53 74 6f 72 61 67  );..  fts5Storag
1960: 65 52 65 6e 61 6d 65 4f 6e 65 28 70 43 6f 6e 66  eRenameOne(pConf
1970: 69 67 2c 20 26 72 63 2c 20 22 64 61 74 61 22 2c  ig, &rc, "data",
1980: 20 7a 4e 61 6d 65 29 3b 0a 20 20 66 74 73 35 53   zName);.  fts5S
1990: 74 6f 72 61 67 65 52 65 6e 61 6d 65 4f 6e 65 28  torageRenameOne(
19a0: 70 43 6f 6e 66 69 67 2c 20 26 72 63 2c 20 22 69  pConfig, &rc, "i
19b0: 64 78 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 66  dx", zName);.  f
19c0: 74 73 35 53 74 6f 72 61 67 65 52 65 6e 61 6d 65  ts5StorageRename
19d0: 4f 6e 65 28 70 43 6f 6e 66 69 67 2c 20 26 72 63  One(pConfig, &rc
19e0: 2c 20 22 63 6f 6e 66 69 67 22 2c 20 7a 4e 61 6d  , "config", zNam
19f0: 65 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e 66 69  e);.  if( pConfi
1a00: 67 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29  g->bColumnsize )
1a10: 7b 0a 20 20 20 20 66 74 73 35 53 74 6f 72 61 67  {.    fts5Storag
1a20: 65 52 65 6e 61 6d 65 4f 6e 65 28 70 43 6f 6e 66  eRenameOne(pConf
1a30: 69 67 2c 20 26 72 63 2c 20 22 64 6f 63 73 69 7a  ig, &rc, "docsiz
1a40: 65 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  e", zName);.  }.
1a50: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65    if( pConfig->e
1a60: 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f  Content==FTS5_CO
1a70: 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0a  NTENT_NORMAL ){.
1a80: 20 20 20 20 66 74 73 35 53 74 6f 72 61 67 65 52      fts5StorageR
1a90: 65 6e 61 6d 65 4f 6e 65 28 70 43 6f 6e 66 69 67  enameOne(pConfig
1aa0: 2c 20 26 72 63 2c 20 22 63 6f 6e 74 65 6e 74 22  , &rc, "content"
1ab0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , zName);.  }.  
1ac0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ad0: 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 73  .** Create the s
1ae0: 68 61 64 6f 77 20 74 61 62 6c 65 20 6e 61 6d 65  hadow table name
1af0: 64 20 7a 50 6f 73 74 2c 20 77 69 74 68 20 64 65  d zPost, with de
1b00: 66 69 6e 69 74 69 6f 6e 20 7a 44 65 66 6e 2e 20  finition zDefn. 
1b10: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1b20: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
1b30: 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
1b40: 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1b50: 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
1b60: 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
1b70: 62 6c 65 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  ble(.  Fts5Confi
1b80: 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20  g *pConfig,     
1b90: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 63         /* FTS5 c
1ba0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
1bb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1bc0: 6f 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ost,            
1bd0: 20 20 2f 2a 20 53 68 61 64 6f 77 20 74 61 62 6c    /* Shadow tabl
1be0: 65 20 74 6f 20 63 72 65 61 74 65 20 28 65 2e 67  e to create (e.g
1bf0: 2e 20 22 63 6f 6e 74 65 6e 74 22 29 20 2a 2f 0a  . "content") */.
1c00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1c10: 65 66 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  efn,            
1c20: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 65 74 63    /* Columns etc
1c30: 2e 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62  . for shadow tab
1c40: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 57 69 74  le */.  int bWit
1c50: 68 6f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  hout,           
1c60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1c70: 66 6f 72 20 77 69 74 68 6f 75 74 20 72 6f 77 69  for without rowi
1c80: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  d */.  char **pz
1c90: 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
1ca0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
1cb0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
1cc0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1cd0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a  har *zErr = 0;..
1ce0: 20 20 72 63 20 3d 20 66 74 73 35 45 78 65 63 50    rc = fts5ExecP
1cf0: 72 69 6e 74 66 28 70 43 6f 6e 66 69 67 2d 3e 64  rintf(pConfig->d
1d00: 62 2c 20 26 7a 45 72 72 2c 20 22 43 52 45 41 54  b, &zErr, "CREAT
1d10: 45 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 25  E TABLE %Q.'%q_%
1d20: 71 27 28 25 73 29 25 73 22 2c 0a 20 20 20 20 20  q'(%s)%s",.     
1d30: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
1d40: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 7a  Config->zName, z
1d50: 50 6f 73 74 2c 20 7a 44 65 66 6e 2c 20 0a 23 69  Post, zDefn, .#i
1d60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 46 54 53  fndef SQLITE_FTS
1d70: 35 5f 4e 4f 5f 57 49 54 48 4f 55 54 5f 52 4f 57  5_NO_WITHOUT_ROW
1d80: 49 44 0a 20 20 20 20 20 20 62 57 69 74 68 6f 75  ID.      bWithou
1d90: 74 3f 22 20 57 49 54 48 4f 55 54 20 52 4f 57 49  t?" WITHOUT ROWI
1da0: 44 22 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  D":.#endif.     
1db0: 20 22 22 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a   "".  );.  if( z
1dc0: 45 72 72 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  Err ){.    *pzEr
1dd0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
1de0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 66 74  ntf(.        "ft
1df0: 73 35 3a 20 65 72 72 6f 72 20 63 72 65 61 74 69  s5: error creati
1e00: 6e 67 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20  ng shadow table 
1e10: 25 71 5f 25 73 3a 20 25 73 22 2c 20 0a 20 20 20  %q_%s: %s", .   
1e20: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e       pConfig->zN
1e30: 61 6d 65 2c 20 7a 50 6f 73 74 2c 20 7a 45 72 72  ame, zPost, zErr
1e40: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1e50: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
1e60: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1e80: 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20  a new Fts5Index 
1e90: 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62  handle. If the b
1ea0: 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20  Create argument 
1eb0: 69 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a  is true, create.
1ec0: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
1ed0: 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1ee0: 20 74 61 62 6c 65 73 20 0a 2a 2a 0a 2a 2a 20 49   tables .**.** I
1ef0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
1f00: 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
1f10: 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
1f20: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1f30: 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77  TE_OK..** Otherw
1f40: 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ise, set *pp to 
1f50: 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20  NULL and return 
1f60: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f70: 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
1f80: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4f  ite3Fts5StorageO
1f90: 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  pen(.  Fts5Confi
1fa0: 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 46  g *pConfig, .  F
1fb0: 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  ts5Index *pIndex
1fc0: 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65  , .  int bCreate
1fd0: 2c 20 0a 20 20 46 74 73 35 53 74 6f 72 61 67 65  , .  Fts5Storage
1fe0: 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a   **pp,.  char **
1ff0: 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20  pzErr           
2000: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2010: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   Error message *
2020: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
2030: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
2040: 35 53 74 6f 72 61 67 65 20 2a 70 3b 20 20 20 20  5Storage *p;    
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2060: 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  New object */.  
2070: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
20a0: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  e to allocate */
20b0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ..  nByte = size
20c0: 6f 66 28 46 74 73 35 53 74 6f 72 61 67 65 29 20  of(Fts5Storage) 
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e0: 20 46 74 73 35 53 74 6f 72 61 67 65 20 6f 62 6a   Fts5Storage obj
20f0: 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 2b  ect */.        +
2100: 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20 2a   pConfig->nCol *
2110: 20 73 69 7a 65 6f 66 28 69 36 34 29 3b 20 20 20   sizeof(i64);   
2120: 20 20 20 2f 2a 20 46 74 73 35 53 74 6f 72 61 67     /* Fts5Storag
2130: 65 2e 61 54 6f 74 61 6c 53 69 7a 65 5b 5d 20 2a  e.aTotalSize[] *
2140: 2f 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46  /.  *pp = p = (F
2150: 74 73 35 53 74 6f 72 61 67 65 2a 29 73 71 6c 69  ts5Storage*)sqli
2160: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
2170: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  );.  if( !p ) re
2180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2190: 4d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  M;..  memset(p, 
21a0: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 2d 3e  0, nByte);.  p->
21b0: 61 54 6f 74 61 6c 53 69 7a 65 20 3d 20 28 69 36  aTotalSize = (i6
21c0: 34 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70  4*)&p[1];.  p->p
21d0: 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67  Config = pConfig
21e0: 3b 0a 20 20 70 2d 3e 70 49 6e 64 65 78 20 3d 20  ;.  p->pIndex = 
21f0: 70 49 6e 64 65 78 3b 0a 0a 20 20 69 66 28 20 62  pIndex;..  if( b
2200: 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 69 66  Create ){.    if
2210: 28 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74  ( pConfig->eCont
2220: 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e  ent==FTS5_CONTEN
2230: 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0a 20 20 20 20  T_NORMAL ){.    
2240: 20 20 69 6e 74 20 6e 44 65 66 6e 20 3d 20 33 32    int nDefn = 32
2250: 20 2b 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c   + pConfig->nCol
2260: 2a 31 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  *10;.      char 
2270: 2a 7a 44 65 66 6e 20 3d 20 73 71 6c 69 74 65 33  *zDefn = sqlite3
2280: 5f 6d 61 6c 6c 6f 63 28 33 32 20 2b 20 70 43 6f  _malloc(32 + pCo
2290: 6e 66 69 67 2d 3e 6e 43 6f 6c 20 2a 20 31 30 29  nfig->nCol * 10)
22a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 65 66  ;.      if( zDef
22b0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
22c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
22d0: 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
22e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
22f0: 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b         int iOff;
2300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2310: 5f 73 6e 70 72 69 6e 74 66 28 6e 44 65 66 6e 2c  _snprintf(nDefn,
2320: 20 7a 44 65 66 6e 2c 20 22 69 64 20 49 4e 54 45   zDefn, "id INTE
2330: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
2340: 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  );.        iOff 
2350: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  = (int)strlen(zD
2360: 65 66 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  efn);.        fo
2370: 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
2380: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
2390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23a0: 73 6e 70 72 69 6e 74 66 28 6e 44 65 66 6e 2d 69  snprintf(nDefn-i
23b0: 4f 66 66 2c 20 26 7a 44 65 66 6e 5b 69 4f 66 66  Off, &zDefn[iOff
23c0: 5d 2c 20 22 2c 20 63 25 64 22 2c 20 69 29 3b 0a  ], ", c%d", i);.
23d0: 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
23e0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 26 7a  = (int)strlen(&z
23f0: 44 65 66 6e 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  Defn[iOff]);.   
2400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2410: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43  c = sqlite3Fts5C
2420: 72 65 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66  reateTable(pConf
2430: 69 67 2c 20 22 63 6f 6e 74 65 6e 74 22 2c 20 7a  ig, "content", z
2440: 44 65 66 6e 2c 20 30 2c 20 70 7a 45 72 72 29 3b  Defn, 0, pzErr);
2450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2460: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 65 66  qlite3_free(zDef
2470: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
2480: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2490: 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e 62 43 6f   && pConfig->bCo
24a0: 6c 75 6d 6e 73 69 7a 65 20 29 7b 0a 20 20 20 20  lumnsize ){.    
24b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
24c0: 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20  s5CreateTable(. 
24d0: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
24e0: 2c 20 22 64 6f 63 73 69 7a 65 22 2c 20 22 69 64  , "docsize", "id
24f0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2500: 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 22 2c 20   KEY, sz BLOB", 
2510: 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29  0, pzErr.      )
2520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2540: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2550: 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
2560: 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 43  le(.          pC
2570: 6f 6e 66 69 67 2c 20 22 63 6f 6e 66 69 67 22 2c  onfig, "config",
2580: 20 22 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c   "k PRIMARY KEY,
2590: 20 76 22 2c 20 31 2c 20 70 7a 45 72 72 0a 20 20   v", 1, pzErr.  
25a0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
25b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
25d0: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
25e0: 61 67 65 43 6f 6e 66 69 67 56 61 6c 75 65 28 70  ageConfigValue(p
25f0: 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20 30 2c 20  , "version", 0, 
2600: 46 54 53 35 5f 43 55 52 52 45 4e 54 5f 56 45 52  FTS5_CURRENT_VER
2610: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  SION);.    }.  }
2620: 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
2630: 20 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f    sqlite3Fts5Sto
2640: 72 61 67 65 43 6c 6f 73 65 28 70 29 3b 0a 20 20  rageClose(p);.  
2650: 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
2660: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2670: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e  *.** Close a han
2680: 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  dle opened by an
2690: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
26a0: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
26b0: 61 67 65 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  ageOpen()..*/.in
26c0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
26d0: 72 61 67 65 43 6c 6f 73 65 28 46 74 73 35 53 74  rageClose(Fts5St
26e0: 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20 69 6e 74  orage *p){.  int
26f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2700: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2710: 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 46  int i;..    /* F
2720: 69 6e 61 6c 69 7a 65 20 61 6c 6c 20 53 51 4c 20  inalize all SQL 
2730: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
2740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
2750: 61 79 53 69 7a 65 28 70 2d 3e 61 53 74 6d 74 29  aySize(p->aStmt)
2760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
2770: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2780: 2d 3e 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20 20  ->aStmt[i]);.   
2790: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
27a0: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  free(p);.  }.  r
27b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70  eturn rc;.}..typ
27c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
27d0: 49 6e 73 65 72 74 43 74 78 20 46 74 73 35 49 6e  InsertCtx Fts5In
27e0: 73 65 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20  sertCtx;.struct 
27f0: 46 74 73 35 49 6e 73 65 72 74 43 74 78 20 7b 0a  Fts5InsertCtx {.
2800: 20 20 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70    Fts5Storage *p
2810: 53 74 6f 72 61 67 65 3b 0a 20 20 69 6e 74 20 69  Storage;.  int i
2820: 43 6f 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 6f 6c  Col;.  int szCol
2830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2840: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2850: 66 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  f column value i
2860: 6e 20 74 6f 6b 65 6e 73 20 2a 2f 0a 7d 3b 0a 0a  n tokens */.};..
2870: 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 61 74 69  /*.** Tokenizati
2880: 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  on callback used
2890: 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
28a0: 74 6f 6b 65 6e 73 20 69 6e 74 6f 20 74 68 65 20  tokens into the 
28b0: 46 54 53 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  FTS index..*/.st
28c0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74 6f  atic int fts5Sto
28d0: 72 61 67 65 49 6e 73 65 72 74 43 61 6c 6c 62 61  rageInsertCallba
28e0: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  ck(.  void *pCon
28f0: 74 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  text,           
2900: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2910: 20 74 6f 20 46 74 73 35 49 6e 73 65 72 74 43 74   to Fts5InsertCt
2920: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  x object */.  in
2930: 74 20 74 66 6c 61 67 73 2c 0a 20 20 63 6f 6e 73  t tflags,.  cons
2940: 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2960: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2970: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   token */.  int 
2980: 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  nToken,         
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
29a0: 69 7a 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20  ize of token in 
29b0: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
29c0: 55 6e 75 73 65 64 31 2c 20 20 20 20 20 20 20 20  Unused1,        
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
29e0: 61 72 74 20 6f 66 66 73 65 74 20 6f 66 20 74 6f  art offset of to
29f0: 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e  ken */.  int iUn
2a00: 75 73 65 64 32 20 20 20 20 20 20 20 20 20 20 20  used2           
2a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
2a20: 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20  offset of token 
2a30: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e 73 65  */.){.  Fts5Inse
2a40: 72 74 43 74 78 20 2a 70 43 74 78 20 3d 20 28 46  rtCtx *pCtx = (F
2a50: 74 73 35 49 6e 73 65 72 74 43 74 78 2a 29 70 43  ts5InsertCtx*)pC
2a60: 6f 6e 74 65 78 74 3b 0a 20 20 46 74 73 35 49 6e  ontext;.  Fts5In
2a70: 64 65 78 20 2a 70 49 64 78 20 3d 20 70 43 74 78  dex *pIdx = pCtx
2a80: 2d 3e 70 53 74 6f 72 61 67 65 2d 3e 70 49 6e 64  ->pStorage->pInd
2a90: 65 78 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ex;.  UNUSED_PAR
2aa0: 41 4d 32 28 69 55 6e 75 73 65 64 31 2c 20 69 55  AM2(iUnused1, iU
2ab0: 6e 75 73 65 64 32 29 3b 0a 20 20 69 66 28 20 6e  nused2);.  if( n
2ac0: 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58 5f 54  Token>FTS5_MAX_T
2ad0: 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54 6f 6b  OKEN_SIZE ) nTok
2ae0: 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f 54 4f  en = FTS5_MAX_TO
2af0: 4b 45 4e 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20  KEN_SIZE;.  if( 
2b00: 28 74 66 6c 61 67 73 20 26 20 46 54 53 35 5f 54  (tflags & FTS5_T
2b10: 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 29 3d  OKEN_COLOCATED)=
2b20: 3d 30 20 7c 7c 20 70 43 74 78 2d 3e 73 7a 43 6f  =0 || pCtx->szCo
2b30: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 74 78  l==0 ){.    pCtx
2b40: 2d 3e 73 7a 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  ->szCol++;.  }. 
2b50: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
2b60: 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 70 49  ts5IndexWrite(pI
2b70: 64 78 2c 20 70 43 74 78 2d 3e 69 43 6f 6c 2c 20  dx, pCtx->iCol, 
2b80: 70 43 74 78 2d 3e 73 7a 43 6f 6c 2d 31 2c 20 70  pCtx->szCol-1, p
2b90: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
2ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 72 6f  }../*.** If a ro
2bb0: 77 20 77 69 74 68 20 72 6f 77 69 64 20 69 44 65  w with rowid iDe
2bc0: 6c 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  l is present in 
2bd0: 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  the %_content ta
2be0: 62 6c 65 2c 20 61 64 64 20 74 68 65 0a 2a 2a 20  ble, add the.** 
2bf0: 64 65 6c 65 74 65 2d 6d 61 72 6b 65 72 73 20 74  delete-markers t
2c00: 6f 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  o the FTS index 
2c10: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 6c  necessary to del
2c20: 65 74 65 20 69 74 2e 20 44 6f 20 6e 6f 74 20 61  ete it. Do not a
2c30: 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6d 6f 76  ctually.** remov
2c40: 65 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  e the %_content 
2c50: 72 6f 77 20 61 74 20 74 68 69 73 20 74 69 6d 65  row at this time
2c60: 20 74 68 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74   though..*/.stat
2c70: 69 63 20 69 6e 74 20 66 74 73 35 53 74 6f 72 61  ic int fts5Stora
2c80: 67 65 44 65 6c 65 74 65 46 72 6f 6d 49 6e 64 65  geDeleteFromInde
2c90: 78 28 0a 20 20 46 74 73 35 53 74 6f 72 61 67 65  x(.  Fts5Storage
2ca0: 20 2a 70 2c 20 0a 20 20 69 36 34 20 69 44 65 6c   *p, .  i64 iDel
2cb0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
2cc0: 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
2cd0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
2ce0: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
2cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
2d00: 20 2a 70 53 65 65 6b 20 3d 20 30 3b 20 20 20 20   *pSeek = 0;    
2d10: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f      /* SELECT to
2d20: 20 72 65 61 64 20 72 6f 77 20 69 44 65 6c 20 66   read row iDel f
2d30: 72 6f 6d 20 25 5f 64 61 74 61 20 2a 2f 0a 20 20  rom %_data */.  
2d40: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2d70: 2f 0a 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20  /.  int rc2;    
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72      /* sqlite3_r
2da0: 65 73 65 74 28 29 20 72 65 74 75 72 6e 20 63 6f  eset() return co
2db0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  de */.  int iCol
2dc0: 3b 0a 20 20 46 74 73 35 49 6e 73 65 72 74 43 74  ;.  Fts5InsertCt
2dd0: 78 20 63 74 78 3b 0a 0a 20 20 69 66 28 20 61 70  x ctx;..  if( ap
2de0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Val==0 ){.    rc
2df0: 20 3d 20 66 74 73 35 53 74 6f 72 61 67 65 47 65   = fts5StorageGe
2e00: 74 53 74 6d 74 28 70 2c 20 46 54 53 35 5f 53 54  tStmt(p, FTS5_ST
2e10: 4d 54 5f 4c 4f 4f 4b 55 50 2c 20 26 70 53 65 65  MT_LOOKUP, &pSee
2e20: 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
2e30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2e40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71  eturn rc;.    sq
2e50: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
2e60: 28 70 53 65 65 6b 2c 20 31 2c 20 69 44 65 6c 29  (pSeek, 1, iDel)
2e70: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2e80: 33 5f 73 74 65 70 28 70 53 65 65 6b 29 21 3d 53  3_step(pSeek)!=S
2e90: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2ea0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2eb0: 33 5f 72 65 73 65 74 28 70 53 65 65 6b 29 3b 0a  3_reset(pSeek);.
2ec0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 74 78      }.  }..  ctx
2ed0: 2e 70 53 74 6f 72 61 67 65 20 3d 20 70 3b 0a 20  .pStorage = p;. 
2ee0: 20 63 74 78 2e 69 43 6f 6c 20 3d 20 2d 31 3b 0a   ctx.iCol = -1;.
2ef0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
2f00: 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74  s5IndexBeginWrit
2f10: 65 28 70 2d 3e 70 49 6e 64 65 78 2c 20 31 2c 20  e(p->pIndex, 1, 
2f20: 69 44 65 6c 29 3b 0a 20 20 66 6f 72 28 69 43 6f  iDel);.  for(iCo
2f30: 6c 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l=1; rc==SQLITE_
2f40: 4f 4b 20 26 26 20 69 43 6f 6c 3c 3d 70 43 6f 6e  OK && iCol<=pCon
2f50: 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  fig->nCol; iCol+
2f60: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  +){.    if( pCon
2f70: 66 69 67 2d 3e 61 62 55 6e 69 6e 64 65 78 65 64  fig->abUnindexed
2f80: 5b 69 43 6f 6c 2d 31 5d 3d 3d 30 20 29 7b 0a 20  [iCol-1]==0 ){. 
2f90: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2fa0: 2a 7a 54 65 78 74 3b 0a 20 20 20 20 20 20 69 6e  *zText;.      in
2fb0: 74 20 6e 54 65 78 74 3b 0a 20 20 20 20 20 20 69  t nText;.      i
2fc0: 66 28 20 70 53 65 65 6b 20 29 7b 0a 20 20 20 20  f( pSeek ){.    
2fd0: 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63 6f 6e      zText = (con
2fe0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2ff0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65  _column_text(pSe
3000: 65 6b 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  ek, iCol);.     
3010: 20 20 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74     nText = sqlit
3020: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
3030: 70 53 65 65 6b 2c 20 69 43 6f 6c 29 3b 0a 20 20  pSeek, iCol);.  
3040: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3050: 20 20 20 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73     zText = (cons
3060: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
3070: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
3080: 5b 69 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 20  [iCol-1]);.     
3090: 20 20 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74     nText = sqlit
30a0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
30b0: 70 56 61 6c 5b 69 43 6f 6c 2d 31 5d 29 3b 0a 20  pVal[iCol-1]);. 
30c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 74 78       }.      ctx
30d0: 2e 73 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  .szCol = 0;.    
30e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
30f0: 73 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f 6e 66  s5Tokenize(pConf
3100: 69 67 2c 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a  ig, FTS5_TOKENIZ
3110: 45 5f 44 4f 43 55 4d 45 4e 54 2c 20 0a 20 20 20  E_DOCUMENT, .   
3120: 20 20 20 20 20 20 20 7a 54 65 78 74 2c 20 6e 54         zText, nT
3130: 65 78 74 2c 20 28 76 6f 69 64 2a 29 26 63 74 78  ext, (void*)&ctx
3140: 2c 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e 73  , fts5StorageIns
3150: 65 72 74 43 61 6c 6c 62 61 63 6b 0a 20 20 20 20  ertCallback.    
3160: 20 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 54    );.      p->aT
3170: 6f 74 61 6c 53 69 7a 65 5b 69 43 6f 6c 2d 31 5d  otalSize[iCol-1]
3180: 20 2d 3d 20 28 69 36 34 29 63 74 78 2e 73 7a 43   -= (i64)ctx.szC
3190: 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ol;.    }.  }.  
31a0: 70 2d 3e 6e 54 6f 74 61 6c 52 6f 77 2d 2d 3b 0a  p->nTotalRow--;.
31b0: 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
31c0: 5f 72 65 73 65 74 28 70 53 65 65 6b 29 3b 0a 20  _reset(pSeek);. 
31d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31e0: 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
31f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
3200: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 72  /*.** Insert a r
3210: 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25  ecord into the %
3220: 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 2e 20  _docsize table. 
3230: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 64 6f  Specifically, do
3240: 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 53 45 52 54  :.**.**   INSERT
3250: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f   OR REPLACE INTO
3260: 20 25 5f 64 6f 63 73 69 7a 65 28 69 64 2c 20 73   %_docsize(id, s
3270: 7a 29 20 56 41 4c 55 45 53 28 69 52 6f 77 69 64  z) VALUES(iRowid
3280: 2c 20 70 42 75 66 29 3b 0a 2a 2a 0a 2a 2a 20 49  , pBuf);.**.** I
3290: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 5f  f there is no %_
32a0: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 28 61  docsize table (a
32b0: 73 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  s happens if the
32c0: 20 63 6f 6c 75 6d 6e 73 69 7a 65 3d 30 20 6f 70   columnsize=0 op
32d0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69  tion.** is speci
32e0: 66 69 65 64 20 77 68 65 6e 20 74 68 65 20 46 54  fied when the FT
32f0: 53 35 20 74 61 62 6c 65 20 69 73 20 63 72 65 61  S5 table is crea
3300: 74 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74  ted), this funct
3310: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
3320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
3330: 73 35 53 74 6f 72 61 67 65 49 6e 73 65 72 74 44  s5StorageInsertD
3340: 6f 63 73 69 7a 65 28 0a 20 20 46 74 73 35 53 74  ocsize(.  Fts5St
3350: 6f 72 61 67 65 20 2a 70 2c 20 20 20 20 20 20 20  orage *p,       
3360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
3370: 72 61 67 65 20 6d 6f 64 75 6c 65 20 74 6f 20 77  rage module to w
3380: 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
3390: 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b0: 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74  id value */.  Ft
33c0: 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 20 20  s5Buffer *pBuf  
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33e0: 20 73 7a 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a   sz value */.){.
33f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3400: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 70  E_OK;.  if( p->p
3410: 43 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75 6d 6e 73  Config->bColumns
3420: 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ize ){.    sqlit
3430: 65 33 5f 73 74 6d 74 20 2a 70 52 65 70 6c 61 63  e3_stmt *pReplac
3440: 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  e = 0;.    rc = 
3450: 66 74 73 35 53 74 6f 72 61 67 65 47 65 74 53 74  fts5StorageGetSt
3460: 6d 74 28 70 2c 20 46 54 53 35 5f 53 54 4d 54 5f  mt(p, FTS5_STMT_
3470: 52 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 2c  REPLACE_DOCSIZE,
3480: 20 26 70 52 65 70 6c 61 63 65 2c 20 30 29 3b 0a   &pReplace, 0);.
3490: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
34b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
34c0: 34 28 70 52 65 70 6c 61 63 65 2c 20 31 2c 20 69  4(pReplace, 1, i
34d0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
34e0: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
34f0: 70 52 65 70 6c 61 63 65 2c 20 32 2c 20 70 42 75  pReplace, 2, pBu
3500: 66 2d 3e 70 2c 20 70 42 75 66 2d 3e 6e 2c 20 53  f->p, pBuf->n, S
3510: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
3520: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
3530: 70 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 20  p(pReplace);.   
3540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
3550: 72 65 73 65 74 28 70 52 65 70 6c 61 63 65 29 3b  reset(pReplace);
3560: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3570: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3580: 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Load the conten
3590: 74 73 20 6f 66 20 74 68 65 20 22 61 76 65 72 61  ts of the "avera
35a0: 67 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f 6d  ges" record from
35b0: 20 64 69 73 6b 20 69 6e 74 6f 20 74 68 65 20 0a   disk into the .
35c0: 2a 2a 20 70 2d 3e 6e 54 6f 74 61 6c 52 6f 77 20  ** p->nTotalRow 
35d0: 61 6e 64 20 70 2d 3e 61 54 6f 74 61 6c 53 69 7a  and p->aTotalSiz
35e0: 65 5b 5d 20 76 61 72 69 61 62 6c 65 73 2e 20 49  e[] variables. I
35f0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  f successful, an
3600: 64 20 69 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  d if.** argument
3610: 20 62 43 61 63 68 65 20 69 73 20 74 72 75 65 2c   bCache is true,
3620: 20 73 65 74 20 74 68 65 20 70 2d 3e 62 54 6f 74   set the p->bTot
3630: 61 6c 73 56 61 6c 69 64 20 66 6c 61 67 20 74 6f  alsValid flag to
3640: 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61   indicate.** tha
3650: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
3660: 66 20 61 54 6f 74 61 6c 53 69 7a 65 5b 5d 20 61  f aTotalSize[] a
3670: 6e 64 20 6e 54 6f 74 61 6c 52 6f 77 20 61 72 65  nd nTotalRow are
3680: 20 76 61 6c 69 64 20 75 6e 74 69 6c 0a 2a 2a 20   valid until.** 
3690: 66 75 72 74 68 65 72 20 6e 6f 74 69 63 65 2e 0a  further notice..
36a0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
36b0: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
36c0: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
36d0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
36e0: 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
36f0: 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
3700: 6e 74 20 66 74 73 35 53 74 6f 72 61 67 65 4c 6f  nt fts5StorageLo
3710: 61 64 54 6f 74 61 6c 73 28 46 74 73 35 53 74 6f  adTotals(Fts5Sto
3720: 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 62 43 61  rage *p, int bCa
3730: 63 68 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  che){.  int rc =
3740: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
3750: 28 20 70 2d 3e 62 54 6f 74 61 6c 73 56 61 6c 69  ( p->bTotalsVali
3760: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  d==0 ){.    rc =
3770: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
3780: 78 47 65 74 41 76 65 72 61 67 65 73 28 70 2d 3e  xGetAverages(p->
3790: 70 49 6e 64 65 78 2c 20 26 70 2d 3e 6e 54 6f 74  pIndex, &p->nTot
37a0: 61 6c 52 6f 77 2c 20 70 2d 3e 61 54 6f 74 61 6c  alRow, p->aTotal
37b0: 53 69 7a 65 29 3b 0a 20 20 20 20 70 2d 3e 62 54  Size);.    p->bT
37c0: 6f 74 61 6c 73 56 61 6c 69 64 20 3d 20 62 43 61  otalsValid = bCa
37d0: 63 68 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  che;.  }.  retur
37e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
37f0: 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
3800: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3810: 20 70 2d 3e 6e 54 6f 74 61 6c 52 6f 77 20 61 6e   p->nTotalRow an
3820: 64 20 70 2d 3e 61 54 6f 74 61 6c 53 69 7a 65 5b  d p->aTotalSize[
3830: 5d 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  ] .** variables 
3840: 69 6e 20 74 68 65 20 22 61 76 65 72 61 67 65 73  in the "averages
3850: 22 20 72 65 63 6f 72 64 20 6f 6e 20 64 69 73 6b  " record on disk
3860: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
3870: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
3880: 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
3890: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
38a0: 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
38b0: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
38c0: 20 69 6e 74 20 66 74 73 35 53 74 6f 72 61 67 65   int fts5Storage
38d0: 53 61 76 65 54 6f 74 61 6c 73 28 46 74 73 35 53  SaveTotals(Fts5S
38e0: 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20 69 6e  torage *p){.  in
38f0: 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e  t nCol = p->pCon
3900: 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74  fig->nCol;.  int
3910: 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   i;.  Fts5Buffer
3920: 20 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 20 3d   buf;.  int rc =
3930: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
3940: 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
3950: 7a 65 6f 66 28 62 75 66 29 29 3b 0a 0a 20 20 73  zeof(buf));..  s
3960: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
3970: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 72 63  AppendVarint(&rc
3980: 2c 20 26 62 75 66 2c 20 70 2d 3e 6e 54 6f 74 61  , &buf, p->nTota
3990: 6c 52 6f 77 29 3b 0a 20 20 66 6f 72 28 69 3d 30  lRow);.  for(i=0
39a0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
39b0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
39c0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
39d0: 74 28 26 72 63 2c 20 26 62 75 66 2c 20 70 2d 3e  t(&rc, &buf, p->
39e0: 61 54 6f 74 61 6c 53 69 7a 65 5b 69 5d 29 3b 0a  aTotalSize[i]);.
39f0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
3a00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
3a10: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
3a20: 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28  ndexSetAverages(
3a30: 70 2d 3e 70 49 6e 64 65 78 2c 20 62 75 66 2e 70  p->pIndex, buf.p
3a40: 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 7d 0a 20 20  , buf.n);.  }.  
3a50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62 75 66  sqlite3_free(buf
3a60: 2e 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  .p);..  return r
3a70: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  c;.}../*.** Remo
3a80: 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 74 68  ve a row from th
3a90: 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a  e FTS table..*/.
3aa0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
3ab0: 74 6f 72 61 67 65 44 65 6c 65 74 65 28 46 74 73  torageDelete(Fts
3ac0: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34  5Storage *p, i64
3ad0: 20 69 44 65 6c 2c 20 73 71 6c 69 74 65 33 5f 76   iDel, sqlite3_v
3ae0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20  alue **apVal){. 
3af0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
3b00: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
3b10: 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  g;.  int rc;.  s
3b20: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
3b30: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
3b40: 28 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74  ( pConfig->eCont
3b50: 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45 4e  ent!=FTS5_CONTEN
3b60: 54 5f 4e 4f 52 4d 41 4c 20 7c 7c 20 61 70 56 61  T_NORMAL || apVa
3b70: 6c 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 66  l==0 );.  rc = f
3b80: 74 73 35 53 74 6f 72 61 67 65 4c 6f 61 64 54 6f  ts5StorageLoadTo
3b90: 74 61 6c 73 28 70 2c 20 31 29 3b 0a 0a 20 20 2f  tals(p, 1);..  /
3ba0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 64  * Delete the ind
3bb0: 65 78 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  ex records */.  
3bc0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3bd0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
3be0: 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 46  s5StorageDeleteF
3bf0: 72 6f 6d 49 6e 64 65 78 28 70 2c 20 69 44 65 6c  romIndex(p, iDel
3c00: 2c 20 61 70 56 61 6c 29 3b 0a 20 20 7d 0a 0a 20  , apVal);.  }.. 
3c10: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 25   /* Delete the %
3c20: 5f 64 6f 63 73 69 7a 65 20 72 65 63 6f 72 64 20  _docsize record 
3c30: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
3c40: 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69  ITE_OK && pConfi
3c50: 67 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29  g->bColumnsize )
3c60: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 53  {.    rc = fts5S
3c70: 74 6f 72 61 67 65 47 65 74 53 74 6d 74 28 70 2c  torageGetStmt(p,
3c80: 20 46 54 53 35 5f 53 54 4d 54 5f 44 45 4c 45 54   FTS5_STMT_DELET
3c90: 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70 44 65 6c  E_DOCSIZE, &pDel
3ca0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
3cb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
3cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
3cd0: 64 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20 31 2c  d_int64(pDel, 1,
3ce0: 20 69 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71   iDel);.      sq
3cf0: 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c 29  lite3_step(pDel)
3d00: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
3d10: 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 29  ite3_reset(pDel)
3d20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
3d30: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 25 5f 63  * Delete the %_c
3d40: 6f 6e 74 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  ontent record */
3d50: 0a 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e  .  if( pConfig->
3d60: 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43  eContent==FTS5_C
3d70: 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b  ONTENT_NORMAL ){
3d80: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
3d90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
3da0: 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67 65  rc = fts5Storage
3db0: 47 65 74 53 74 6d 74 28 70 2c 20 46 54 53 35 5f  GetStmt(p, FTS5_
3dc0: 53 54 4d 54 5f 44 45 4c 45 54 45 5f 43 4f 4e 54  STMT_DELETE_CONT
3dd0: 45 4e 54 2c 20 26 70 44 65 6c 2c 20 30 29 3b 0a  ENT, &pDel, 0);.
3de0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
3df0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
3e00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
3e10: 64 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20 31 2c  d_int64(pDel, 1,
3e20: 20 69 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71   iDel);.      sq
3e30: 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c 29  lite3_step(pDel)
3e40: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
3e50: 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 29  ite3_reset(pDel)
3e60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
3e70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3e80: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 65 6e  ** Delete all en
3e90: 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53  tries in the FTS
3ea0: 35 20 69 6e 64 65 78 2e 0a 2a 2f 0a 69 6e 74 20  5 index..*/.int 
3eb0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
3ec0: 67 65 44 65 6c 65 74 65 41 6c 6c 28 46 74 73 35  geDeleteAll(Fts5
3ed0: 53 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20 46  Storage *p){.  F
3ee0: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
3ef0: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
3f00: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
3f10: 20 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74   Delete the cont
3f20: 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61  ents of the %_da
3f30: 74 61 20 61 6e 64 20 25 5f 64 6f 63 73 69 7a 65  ta and %_docsize
3f40: 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 72 63   tables. */.  rc
3f50: 20 3d 20 66 74 73 35 45 78 65 63 50 72 69 6e 74   = fts5ExecPrint
3f60: 66 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 30  f(pConfig->db, 0
3f70: 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  ,.      "DELETE 
3f80: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64 61 74 61  FROM %Q.'%q_data
3f90: 27 3b 22 20 0a 20 20 20 20 20 20 22 44 45 4c 45  ';" .      "DELE
3fa0: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69  TE FROM %Q.'%q_i
3fb0: 64 78 27 3b 22 2c 0a 20 20 20 20 20 20 70 43 6f  dx';",.      pCo
3fc0: 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
3fd0: 69 67 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ig->zName,.     
3fe0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
3ff0: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
4000: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
4010: 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69  ITE_OK && pConfi
4020: 67 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29  g->bColumnsize )
4030: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45  {.    rc = fts5E
4040: 78 65 63 50 72 69 6e 74 66 28 70 43 6f 6e 66 69  xecPrintf(pConfi
4050: 67 2d 3e 64 62 2c 20 30 2c 0a 20 20 20 20 20 20  g->db, 0,.      
4060: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
4070: 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 3b 22  Q.'%q_docsize';"
4080: 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69  ,.        pConfi
4090: 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
40a0: 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
40b0: 7d 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  }..  /* Reinitia
40c0: 6c 69 7a 65 20 74 68 65 20 25 5f 64 61 74 61 20  lize the %_data 
40d0: 74 61 62 6c 65 2e 20 54 68 69 73 20 63 61 6c 6c  table. This call
40e0: 20 63 72 65 61 74 65 73 20 74 68 65 20 69 6e 69   creates the ini
40f0: 74 69 61 6c 20 73 74 72 75 63 74 75 72 65 0a 20  tial structure. 
4100: 20 2a 2a 20 61 6e 64 20 61 76 65 72 61 67 65 73   ** and averages
4110: 20 72 65 63 6f 72 64 73 2e 20 20 2a 2f 0a 20 20   records.  */.  
4120: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4130: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
4140: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
4150: 69 6e 69 74 28 70 2d 3e 70 49 6e 64 65 78 29 3b  init(p->pIndex);
4160: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
4170: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4180: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
4190: 53 74 6f 72 61 67 65 43 6f 6e 66 69 67 56 61 6c  StorageConfigVal
41a0: 75 65 28 70 2c 20 22 76 65 72 73 69 6f 6e 22 2c  ue(p, "version",
41b0: 20 30 2c 20 46 54 53 35 5f 43 55 52 52 45 4e 54   0, FTS5_CURRENT
41c0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20  _VERSION);.  }. 
41d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
41e0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
41f0: 6f 72 61 67 65 52 65 62 75 69 6c 64 28 46 74 73  orageRebuild(Fts
4200: 35 53 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20  5Storage *p){.  
4210: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d  Fts5Buffer buf =
4220: 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35   {0,0,0};.  Fts5
4230: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
4240: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
4250: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
4260: 63 61 6e 20 3d 20 30 3b 0a 20 20 46 74 73 35 49  can = 0;.  Fts5I
4270: 6e 73 65 72 74 43 74 78 20 63 74 78 3b 0a 20 20  nsertCtx ctx;.  
4280: 69 6e 74 20 72 63 3b 0a 0a 20 20 6d 65 6d 73 65  int rc;..  memse
4290: 74 28 26 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f  t(&ctx, 0, sizeo
42a0: 66 28 46 74 73 35 49 6e 73 65 72 74 43 74 78 29  f(Fts5InsertCtx)
42b0: 29 3b 0a 20 20 63 74 78 2e 70 53 74 6f 72 61 67  );.  ctx.pStorag
42c0: 65 20 3d 20 70 3b 0a 20 20 72 63 20 3d 20 73 71  e = p;.  rc = sq
42d0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
42e0: 44 65 6c 65 74 65 41 6c 6c 28 70 29 3b 0a 20 20  DeleteAll(p);.  
42f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4300: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
4310: 73 35 53 74 6f 72 61 67 65 4c 6f 61 64 54 6f 74  s5StorageLoadTot
4320: 61 6c 73 28 70 2c 20 31 29 3b 0a 20 20 7d 0a 0a  als(p, 1);.  }..
4330: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4340: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
4350: 66 74 73 35 53 74 6f 72 61 67 65 47 65 74 53 74  fts5StorageGetSt
4360: 6d 74 28 70 2c 20 46 54 53 35 5f 53 54 4d 54 5f  mt(p, FTS5_STMT_
4370: 53 43 41 4e 2c 20 26 70 53 63 61 6e 2c 20 30 29  SCAN, &pScan, 0)
4380: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
4390: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
43a0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
43b0: 69 74 65 33 5f 73 74 65 70 28 70 53 63 61 6e 29  ite3_step(pScan)
43c0: 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
43d0: 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
43e0: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 63 61 6e 2c  umn_int64(pScan,
43f0: 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65   0);..    sqlite
4400: 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28  3Fts5BufferZero(
4410: 26 62 75 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  &buf);.    rc = 
4420: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
4430: 42 65 67 69 6e 57 72 69 74 65 28 70 2d 3e 70 49  BeginWrite(p->pI
4440: 6e 64 65 78 2c 20 30 2c 20 69 52 6f 77 69 64 29  ndex, 0, iRowid)
4450: 3b 0a 20 20 20 20 66 6f 72 28 63 74 78 2e 69 43  ;.    for(ctx.iC
4460: 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ol=0; rc==SQLITE
4470: 5f 4f 4b 20 26 26 20 63 74 78 2e 69 43 6f 6c 3c  _OK && ctx.iCol<
4480: 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 63  pConfig->nCol; c
4490: 74 78 2e 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  tx.iCol++){.    
44a0: 20 20 63 74 78 2e 73 7a 43 6f 6c 20 3d 20 30 3b    ctx.szCol = 0;
44b0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66  .      if( pConf
44c0: 69 67 2d 3e 61 62 55 6e 69 6e 64 65 78 65 64 5b  ig->abUnindexed[
44d0: 63 74 78 2e 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a  ctx.iCol]==0 ){.
44e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
44f0: 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ite3Fts5Tokenize
4500: 28 70 43 6f 6e 66 69 67 2c 20 0a 20 20 20 20 20  (pConfig, .     
4510: 20 20 20 20 20 20 20 46 54 53 35 5f 54 4f 4b 45         FTS5_TOKE
4520: 4e 49 5a 45 5f 44 4f 43 55 4d 45 4e 54 2c 0a 20  NIZE_DOCUMENT,. 
4530: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
4540: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
4550: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 63 61  column_text(pSca
4560: 6e 2c 20 63 74 78 2e 69 43 6f 6c 2b 31 29 2c 0a  n, ctx.iCol+1),.
4570: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4580: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
4590: 28 70 53 63 61 6e 2c 20 63 74 78 2e 69 43 6f 6c  (pScan, ctx.iCol
45a0: 2b 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  +1),.           
45b0: 20 28 76 6f 69 64 2a 29 26 63 74 78 2c 0a 20 20   (void*)&ctx,.  
45c0: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 74            fts5St
45d0: 6f 72 61 67 65 49 6e 73 65 72 74 43 61 6c 6c 62  orageInsertCallb
45e0: 61 63 6b 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ack.        );. 
45f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4600: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
4610: 70 65 6e 64 56 61 72 69 6e 74 28 26 72 63 2c 20  pendVarint(&rc, 
4620: 26 62 75 66 2c 20 63 74 78 2e 73 7a 43 6f 6c 29  &buf, ctx.szCol)
4630: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 54 6f 74 61  ;.      p->aTota
4640: 6c 53 69 7a 65 5b 63 74 78 2e 69 43 6f 6c 5d 20  lSize[ctx.iCol] 
4650: 2b 3d 20 28 69 36 34 29 63 74 78 2e 73 7a 43 6f  += (i64)ctx.szCo
4660: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  l;.    }.    p->
4670: 6e 54 6f 74 61 6c 52 6f 77 2b 2b 3b 0a 0a 20 20  nTotalRow++;..  
4680: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4690: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
46a0: 3d 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e 73  = fts5StorageIns
46b0: 65 72 74 44 6f 63 73 69 7a 65 28 70 2c 20 69 52  ertDocsize(p, iR
46c0: 6f 77 69 64 2c 20 26 62 75 66 29 3b 0a 20 20 20  owid, &buf);.   
46d0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
46e0: 5f 66 72 65 65 28 62 75 66 2e 70 29 3b 0a 0a 20  _free(buf.p);.. 
46f0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 61 76   /* Write the av
4700: 65 72 61 67 65 73 20 72 65 63 6f 72 64 20 2a 2f  erages record */
4710: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4720: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
4730: 20 66 74 73 35 53 74 6f 72 61 67 65 53 61 76 65   fts5StorageSave
4740: 54 6f 74 61 6c 73 28 70 29 3b 0a 20 20 7d 0a 20  Totals(p);.  }. 
4750: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
4760: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4770: 6f 72 61 67 65 4f 70 74 69 6d 69 7a 65 28 46 74  orageOptimize(Ft
4780: 73 35 53 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20  s5Storage *p){. 
4790: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
47a0: 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
47b0: 28 70 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  (p->pIndex);.}..
47c0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
47d0: 74 6f 72 61 67 65 4d 65 72 67 65 28 46 74 73 35  torageMerge(Fts5
47e0: 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20  Storage *p, int 
47f0: 6e 4d 65 72 67 65 29 7b 0a 20 20 72 65 74 75 72  nMerge){.  retur
4800: 6e 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  n sqlite3Fts5Ind
4810: 65 78 4d 65 72 67 65 28 70 2d 3e 70 49 6e 64 65  exMerge(p->pInde
4820: 78 2c 20 6e 4d 65 72 67 65 29 3b 0a 7d 0a 0a 69  x, nMerge);.}..i
4830: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4840: 6f 72 61 67 65 52 65 73 65 74 28 46 74 73 35 53  orageReset(Fts5S
4850: 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20 20 72 65  torage *p){.  re
4860: 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35  turn sqlite3Fts5
4870: 49 6e 64 65 78 52 65 73 65 74 28 70 2d 3e 70 49  IndexReset(p->pI
4880: 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
4890: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 72  Allocate a new r
48a0: 6f 77 69 64 2e 20 54 68 69 73 20 69 73 20 75 73  owid. This is us
48b0: 65 64 20 66 6f 72 20 22 65 78 74 65 72 6e 61 6c  ed for "external
48c0: 20 63 6f 6e 74 65 6e 74 22 20 74 61 62 6c 65 73   content" tables
48d0: 20 77 68 65 6e 0a 2a 2a 20 61 20 4e 55 4c 4c 20   when.** a NULL 
48e0: 76 61 6c 75 65 20 69 73 20 69 6e 73 65 72 74 65  value is inserte
48f0: 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 77 69 64  d into the rowid
4900: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6e 65 77   column. The new
4910: 20 72 6f 77 69 64 20 69 73 20 61 6c 6c 6f 63 61   rowid is alloca
4920: 74 65 64 0a 2a 2a 20 62 79 20 69 6e 73 65 72 74  ted.** by insert
4930: 69 6e 67 20 61 20 64 75 6d 6d 79 20 72 6f 77 20  ing a dummy row 
4940: 69 6e 74 6f 20 74 68 65 20 25 5f 64 6f 63 73 69  into the %_docsi
4950: 7a 65 20 74 61 62 6c 65 2e 20 54 68 65 20 64 75  ze table. The du
4960: 6d 6d 79 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 6f  mmy will be.** o
4970: 76 65 72 77 72 69 74 74 65 6e 20 6c 61 74 65 72  verwritten later
4980: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 25  ..**.** If the %
4990: 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 64  _docsize table d
49a0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 53  oes not exist, S
49b0: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 69  QLITE_MISMATCH i
49c0: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 0a 2a  s returned. In.*
49d0: 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
49e0: 75 73 65 72 20 69 73 20 72 65 71 75 69 72 65 64  user is required
49f0: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 72 6f   to provide a ro
4a00: 77 69 64 20 65 78 70 6c 69 63 69 74 6c 79 2e 0a  wid explicitly..
4a10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
4a20: 73 35 53 74 6f 72 61 67 65 4e 65 77 52 6f 77 69  s5StorageNewRowi
4a30: 64 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  d(Fts5Storage *p
4a40: 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b  , i64 *piRowid){
4a50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4a60: 54 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 69  TE_MISMATCH;.  i
4a70: 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 62  f( p->pConfig->b
4a80: 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b 0a 20 20  Columnsize ){.  
4a90: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4aa0: 70 52 65 70 6c 61 63 65 20 3d 20 30 3b 0a 20 20  pReplace = 0;.  
4ab0: 20 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61    rc = fts5Stora
4ac0: 67 65 47 65 74 53 74 6d 74 28 70 2c 20 46 54 53  geGetStmt(p, FTS
4ad0: 35 5f 53 54 4d 54 5f 52 45 50 4c 41 43 45 5f 44  5_STMT_REPLACE_D
4ae0: 4f 43 53 49 5a 45 2c 20 26 70 52 65 70 6c 61 63  OCSIZE, &pReplac
4af0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
4b00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
4b20: 6e 64 5f 6e 75 6c 6c 28 70 52 65 70 6c 61 63 65  nd_null(pReplace
4b30: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
4b40: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 52  te3_bind_null(pR
4b50: 65 70 6c 61 63 65 2c 20 32 29 3b 0a 20 20 20 20  eplace, 2);.    
4b60: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
4b70: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  Replace);.      
4b80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
4b90: 65 74 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20  et(pReplace);.  
4ba0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
4bb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4bc0: 20 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 73 71     *piRowid = sq
4bd0: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
4be0: 74 5f 72 6f 77 69 64 28 70 2d 3e 70 43 6f 6e 66  t_rowid(p->pConf
4bf0: 69 67 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  ig->db);.    }. 
4c00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
4c20: 61 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74  a new row into t
4c30: 68 65 20 46 54 53 20 63 6f 6e 74 65 6e 74 20 74  he FTS content t
4c40: 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
4c50: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 43  ite3Fts5StorageC
4c60: 6f 6e 74 65 6e 74 49 6e 73 65 72 74 28 0a 20 20  ontentInsert(.  
4c70: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4c80: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4c90: 20 2a 2a 61 70 56 61 6c 2c 20 0a 20 20 69 36 34   **apVal, .  i64
4ca0: 20 2a 70 69 52 6f 77 69 64 0a 29 7b 0a 20 20 46   *piRowid.){.  F
4cb0: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
4cc0: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
4cd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4ce0: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 73  TE_OK;..  /* Ins
4cf0: 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20  ert the new row 
4d00: 69 6e 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65  into the %_conte
4d10: 6e 74 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69  nt table. */.  i
4d20: 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e  f( pConfig->eCon
4d30: 74 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45  tent!=FTS5_CONTE
4d40: 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0a 20 20 20  NT_NORMAL ){.   
4d50: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
4d60: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d  ue_type(apVal[1]
4d70: 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  )==SQLITE_INTEGE
4d80: 52 20 29 7b 0a 20 20 20 20 20 20 2a 70 69 52 6f  R ){.      *piRo
4d90: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
4da0: 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
4db0: 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
4dc0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 53        rc = fts5S
4dd0: 74 6f 72 61 67 65 4e 65 77 52 6f 77 69 64 28 70  torageNewRowid(p
4de0: 2c 20 70 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  , piRowid);.    
4df0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
4e00: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e  qlite3_stmt *pIn
4e10: 73 65 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  sert = 0;    /* 
4e20: 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69  Statement to wri
4e30: 74 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  te %_content tab
4e40: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  le */.    int i;
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
4e70: 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
4e80: 20 20 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72     rc = fts5Stor
4e90: 61 67 65 47 65 74 53 74 6d 74 28 70 2c 20 46 54  ageGetStmt(p, FT
4ea0: 53 35 5f 53 54 4d 54 5f 49 4e 53 45 52 54 5f 43  S5_STMT_INSERT_C
4eb0: 4f 4e 54 45 4e 54 2c 20 26 70 49 6e 73 65 72 74  ONTENT, &pInsert
4ec0: 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , 0);.    for(i=
4ed0: 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
4ee0: 20 26 26 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e   && i<=pConfig->
4ef0: 6e 43 6f 6c 2b 31 3b 20 69 2b 2b 29 7b 0a 20 20  nCol+1; i++){.  
4f00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4f10: 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73  _bind_value(pIns
4f20: 65 72 74 2c 20 69 2c 20 61 70 56 61 6c 5b 69 5d  ert, i, apVal[i]
4f30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4f40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4f50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4f60: 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
4f70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4f80: 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29  3_reset(pInsert)
4f90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 69 52  ;.    }.    *piR
4fa0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
4fb0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
4fc0: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 29 3b 0a 20  (pConfig->db);. 
4fd0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
4fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
4ff0: 20 6e 65 77 20 65 6e 74 72 69 65 73 20 69 6e 74   new entries int
5000: 6f 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  o the FTS index 
5010: 61 6e 64 20 25 5f 64 6f 63 73 69 7a 65 20 74 61  and %_docsize ta
5020: 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
5030: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e  te3Fts5StorageIn
5040: 64 65 78 49 6e 73 65 72 74 28 0a 20 20 46 74 73  dexInsert(.  Fts
5050: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 0a 20 20  5Storage *p, .  
5060: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5070: 61 70 56 61 6c 2c 20 0a 20 20 69 36 34 20 69 52  apVal, .  i64 iR
5080: 6f 77 69 64 0a 29 7b 0a 20 20 46 74 73 35 43 6f  owid.){.  Fts5Co
5090: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
50a0: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e  p->pConfig;.  in
50b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
50c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
50d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
50e0: 20 20 46 74 73 35 49 6e 73 65 72 74 43 74 78 20    Fts5InsertCtx 
50f0: 63 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  ctx;            
5100: 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 61 74 69 6f    /* Tokenizatio
5110: 6e 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 65  n callback conte
5120: 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  xt object */.  F
5130: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20  ts5Buffer buf;  
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5150: 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f  * Buffer used to
5160: 20 62 75 69 6c 64 20 75 70 20 25 5f 64 6f 63 73   build up %_docs
5170: 69 7a 65 20 62 6c 6f 62 20 2a 2f 0a 0a 20 20 6d  ize blob */..  m
5180: 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
5190: 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
51a0: 29 29 3b 0a 20 20 63 74 78 2e 70 53 74 6f 72 61  ));.  ctx.pStora
51b0: 67 65 20 3d 20 70 3b 0a 20 20 72 63 20 3d 20 66  ge = p;.  rc = f
51c0: 74 73 35 53 74 6f 72 61 67 65 4c 6f 61 64 54 6f  ts5StorageLoadTo
51d0: 74 61 6c 73 28 70 2c 20 31 29 3b 0a 0a 20 20 69  tals(p, 1);..  i
51e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
51f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
5200: 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65 67  ite3Fts5IndexBeg
5210: 69 6e 57 72 69 74 65 28 70 2d 3e 70 49 6e 64 65  inWrite(p->pInde
5220: 78 2c 20 30 2c 20 69 52 6f 77 69 64 29 3b 0a 20  x, 0, iRowid);. 
5230: 20 7d 0a 20 20 66 6f 72 28 63 74 78 2e 69 43 6f   }.  for(ctx.iCo
5240: 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l=0; rc==SQLITE_
5250: 4f 4b 20 26 26 20 63 74 78 2e 69 43 6f 6c 3c 70  OK && ctx.iCol<p
5260: 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 63 74  Config->nCol; ct
5270: 78 2e 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63  x.iCol++){.    c
5280: 74 78 2e 73 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20  tx.szCol = 0;.  
5290: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
52a0: 62 55 6e 69 6e 64 65 78 65 64 5b 63 74 78 2e 69  bUnindexed[ctx.i
52b0: 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col]==0 ){.     
52c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
52d0: 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f 6e 66 69  5Tokenize(pConfi
52e0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  g, .          FT
52f0: 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55  S5_TOKENIZE_DOCU
5300: 4d 45 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20  MENT,.          
5310: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
5320: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5330: 61 70 56 61 6c 5b 63 74 78 2e 69 43 6f 6c 2b 32  apVal[ctx.iCol+2
5340: 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  ]),.          sq
5350: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5360: 73 28 61 70 56 61 6c 5b 63 74 78 2e 69 43 6f 6c  s(apVal[ctx.iCol
5370: 2b 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  +2]),.          
5380: 28 76 6f 69 64 2a 29 26 63 74 78 2c 0a 20 20 20  (void*)&ctx,.   
5390: 20 20 20 20 20 20 20 66 74 73 35 53 74 6f 72 61         fts5Stora
53a0: 67 65 49 6e 73 65 72 74 43 61 6c 6c 62 61 63 6b  geInsertCallback
53b0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
53c0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
53d0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
53e0: 74 28 26 72 63 2c 20 26 62 75 66 2c 20 63 74 78  t(&rc, &buf, ctx
53f0: 2e 73 7a 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  .szCol);.    p->
5400: 61 54 6f 74 61 6c 53 69 7a 65 5b 63 74 78 2e 69  aTotalSize[ctx.i
5410: 43 6f 6c 5d 20 2b 3d 20 28 69 36 34 29 63 74 78  Col] += (i64)ctx
5420: 2e 73 7a 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 2d  .szCol;.  }.  p-
5430: 3e 6e 54 6f 74 61 6c 52 6f 77 2b 2b 3b 0a 0a 20  >nTotalRow++;.. 
5440: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 25 5f   /* Write the %_
5450: 64 6f 63 73 69 7a 65 20 72 65 63 6f 72 64 20 2a  docsize record *
5460: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
5470: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
5480: 3d 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e 73  = fts5StorageIns
5490: 65 72 74 44 6f 63 73 69 7a 65 28 70 2c 20 69 52  ertDocsize(p, iR
54a0: 6f 77 69 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d  owid, &buf);.  }
54b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
54c0: 62 75 66 2e 70 29 3b 0a 0a 20 20 72 65 74 75 72  buf.p);..  retur
54d0: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
54e0: 69 6e 74 20 66 74 73 35 53 74 6f 72 61 67 65 43  int fts5StorageC
54f0: 6f 75 6e 74 28 46 74 73 35 53 74 6f 72 61 67 65  ount(Fts5Storage
5500: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5510: 2a 7a 53 75 66 66 69 78 2c 20 69 36 34 20 2a 70  *zSuffix, i64 *p
5520: 6e 52 6f 77 29 7b 0a 20 20 46 74 73 35 43 6f 6e  nRow){.  Fts5Con
5530: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
5540: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 63 68 61  ->pConfig;.  cha
5550: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72  r *zSql;.  int r
5560: 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  c;..  zSql = sql
5570: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
5580: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5590: 4f 4d 20 25 51 2e 27 25 71 5f 25 73 27 22 2c 20  OM %Q.'%q_%s'", 
55a0: 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e  .      pConfig->
55b0: 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  zDb, pConfig->zN
55c0: 61 6d 65 2c 20 7a 53 75 66 66 69 78 0a 20 20 29  ame, zSuffix.  )
55d0: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
55e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
55f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
5600: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
5610: 74 6d 74 20 2a 70 43 6e 74 20 3d 20 30 3b 0a 20  tmt *pCnt = 0;. 
5620: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
5630: 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66  prepare_v2(pConf
5640: 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ig->db, zSql, -1
5650: 2c 20 26 70 43 6e 74 2c 20 30 29 3b 0a 20 20 20  , &pCnt, 0);.   
5660: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5670: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
5680: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
5690: 74 65 33 5f 73 74 65 70 28 70 43 6e 74 29 20 29  te3_step(pCnt) )
56a0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 52 6f 77  {.        *pnRow
56b0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
56c0: 6e 5f 69 6e 74 36 34 28 70 43 6e 74 2c 20 30 29  n_int64(pCnt, 0)
56d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
56e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
56f0: 61 6c 69 7a 65 28 70 43 6e 74 29 3b 0a 20 20 20  alize(pCnt);.   
5700: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
5710: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
5720: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5730: 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
5740: 63 74 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  ct used by sqlit
5750: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74  e3Fts5StorageInt
5760: 65 67 72 69 74 79 28 29 2e 0a 2a 2f 0a 74 79 70  egrity()..*/.typ
5770: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
5780: 49 6e 74 65 67 72 69 74 79 43 74 78 20 46 74 73  IntegrityCtx Fts
5790: 35 49 6e 74 65 67 72 69 74 79 43 74 78 3b 0a 73  5IntegrityCtx;.s
57a0: 74 72 75 63 74 20 46 74 73 35 49 6e 74 65 67 72  truct Fts5Integr
57b0: 69 74 79 43 74 78 20 7b 0a 20 20 69 36 34 20 69  ityCtx {.  i64 i
57c0: 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f  Rowid;.  int iCo
57d0: 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 6f 6c 3b 0a  l;.  int szCol;.
57e0: 20 20 75 36 34 20 63 6b 73 75 6d 3b 0a 20 20 46    u64 cksum;.  F
57f0: 74 73 35 54 65 72 6d 73 65 74 20 2a 70 54 65 72  ts5Termset *pTer
5800: 6d 73 65 74 3b 0a 20 20 46 74 73 35 43 6f 6e 66  mset;.  Fts5Conf
5810: 69 67 20 2a 70 43 6f 6e 66 69 67 3b 0a 7d 3b 0a  ig *pConfig;.};.
5820: 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 61  ../*.** Tokeniza
5830: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 75 73  tion callback us
5840: 65 64 20 62 79 20 69 6e 74 65 67 72 69 74 79 20  ed by integrity 
5850: 63 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  check..*/.static
5860: 20 69 6e 74 20 66 74 73 35 53 74 6f 72 61 67 65   int fts5Storage
5870: 49 6e 74 65 67 72 69 74 79 43 61 6c 6c 62 61 63  IntegrityCallbac
5880: 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  k(.  void *pCont
5890: 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
58a0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
58b0: 74 6f 20 46 74 73 35 49 6e 74 65 67 72 69 74 79  to Fts5Integrity
58c0: 43 74 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Ctx object */.  
58d0: 69 6e 74 20 74 66 6c 61 67 73 2c 0a 20 20 63 6f  int tflags,.  co
58e0: 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
58f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5900: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
5910: 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e  ng token */.  in
5920: 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  t nToken,       
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5940: 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65 6e 20 69   Size of token i
5950: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
5960: 20 69 55 6e 75 73 65 64 31 2c 20 20 20 20 20 20   iUnused1,      
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5980: 53 74 61 72 74 20 6f 66 66 73 65 74 20 6f 66 20  Start offset of 
5990: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  token */.  int i
59a0: 55 6e 75 73 65 64 32 20 20 20 20 20 20 20 20 20  Unused2         
59b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
59c0: 64 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65  d offset of toke
59d0: 6e 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e  n */.){.  Fts5In
59e0: 74 65 67 72 69 74 79 43 74 78 20 2a 70 43 74 78  tegrityCtx *pCtx
59f0: 20 3d 20 28 46 74 73 35 49 6e 74 65 67 72 69 74   = (Fts5Integrit
5a00: 79 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  yCtx*)pContext;.
5a10: 20 20 46 74 73 35 54 65 72 6d 73 65 74 20 2a 70    Fts5Termset *p
5a20: 54 65 72 6d 73 65 74 20 3d 20 70 43 74 78 2d 3e  Termset = pCtx->
5a30: 70 54 65 72 6d 73 65 74 3b 0a 20 20 69 6e 74 20  pTermset;.  int 
5a40: 62 50 72 65 73 65 6e 74 3b 0a 20 20 69 6e 74 20  bPresent;.  int 
5a50: 69 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ii;.  int rc = S
5a60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
5a70: 69 50 6f 73 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  iPos;.  int iCol
5a80: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
5a90: 4d 32 28 69 55 6e 75 73 65 64 31 2c 20 69 55 6e  M2(iUnused1, iUn
5aa0: 75 73 65 64 32 29 3b 0a 20 20 69 66 28 20 6e 54  used2);.  if( nT
5ab0: 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58 5f 54 4f  oken>FTS5_MAX_TO
5ac0: 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54 6f 6b 65  KEN_SIZE ) nToke
5ad0: 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f 54 4f 4b  n = FTS5_MAX_TOK
5ae0: 45 4e 5f 53 49 5a 45 3b 0a 0a 20 20 69 66 28 20  EN_SIZE;..  if( 
5af0: 28 74 66 6c 61 67 73 20 26 20 46 54 53 35 5f 54  (tflags & FTS5_T
5b00: 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 29 3d  OKEN_COLOCATED)=
5b10: 3d 30 20 7c 7c 20 70 43 74 78 2d 3e 73 7a 43 6f  =0 || pCtx->szCo
5b20: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 74 78  l==0 ){.    pCtx
5b30: 2d 3e 73 7a 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 0a  ->szCol++;.  }..
5b40: 20 20 73 77 69 74 63 68 28 20 70 43 74 78 2d 3e    switch( pCtx->
5b50: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
5b60: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53   ){.    case FTS
5b70: 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 3a 0a 20  5_DETAIL_FULL:. 
5b80: 20 20 20 20 20 69 50 6f 73 20 3d 20 70 43 74 78       iPos = pCtx
5b90: 2d 3e 73 7a 43 6f 6c 2d 31 3b 0a 20 20 20 20 20  ->szCol-1;.     
5ba0: 20 69 43 6f 6c 20 3d 20 70 43 74 78 2d 3e 69 43   iCol = pCtx->iC
5bb0: 6f 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ol;.      break;
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f  ..    case FTS5_
5bd0: 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 3a 0a  DETAIL_COLUMNS:.
5be0: 20 20 20 20 20 20 69 50 6f 73 20 3d 20 70 43 74        iPos = pCt
5bf0: 78 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69  x->iCol;.      i
5c00: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  Col = 0;.      b
5c10: 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
5c20: 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
5c30: 28 20 70 43 74 78 2d 3e 70 43 6f 6e 66 69 67 2d  ( pCtx->pConfig-
5c40: 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
5c50: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20  ETAIL_NONE );.  
5c60: 20 20 20 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20      iPos = 0;.  
5c70: 20 20 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20      iCol = 0;.  
5c80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
5c90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
5ca0: 73 35 54 65 72 6d 73 65 74 41 64 64 28 70 54 65  s5TermsetAdd(pTe
5cb0: 72 6d 73 65 74 2c 20 30 2c 20 70 54 6f 6b 65 6e  rmset, 0, pToken
5cc0: 2c 20 6e 54 6f 6b 65 6e 2c 20 26 62 50 72 65 73  , nToken, &bPres
5cd0: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ent);.  if( rc==
5ce0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 50 72  SQLITE_OK && bPr
5cf0: 65 73 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  esent==0 ){.    
5d00: 70 43 74 78 2d 3e 63 6b 73 75 6d 20 5e 3d 20 73  pCtx->cksum ^= s
5d10: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
5d20: 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 20 20 20  ntryCksum(.     
5d30: 20 20 20 70 43 74 78 2d 3e 69 52 6f 77 69 64 2c     pCtx->iRowid,
5d40: 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 30 2c 20   iCol, iPos, 0, 
5d50: 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20  pToken, nToken. 
5d60: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72     );.  }..  for
5d70: 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
5d80: 45 5f 4f 4b 20 26 26 20 69 69 3c 70 43 74 78 2d  E_OK && ii<pCtx-
5d90: 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  >pConfig->nPrefi
5da0: 78 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  x; ii++){.    co
5db0: 6e 73 74 20 69 6e 74 20 6e 43 68 61 72 20 3d 20  nst int nChar = 
5dc0: 70 43 74 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 61  pCtx->pConfig->a
5dd0: 50 72 65 66 69 78 5b 69 69 5d 3b 0a 20 20 20 20  Prefix[ii];.    
5de0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69  int nByte = sqli
5df0: 74 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72  te3Fts5IndexChar
5e00: 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f  lenToBytelen(pTo
5e10: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68  ken, nToken, nCh
5e20: 61 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  ar);.    if( nBy
5e30: 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  te ){.      rc =
5e40: 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d   sqlite3Fts5Term
5e50: 73 65 74 41 64 64 28 70 54 65 72 6d 73 65 74 2c  setAdd(pTermset,
5e60: 20 69 69 2b 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e   ii+1, pToken, n
5e70: 42 79 74 65 2c 20 26 62 50 72 65 73 65 6e 74 29  Byte, &bPresent)
5e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50 72 65  ;.      if( bPre
5e90: 73 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sent==0 ){.     
5ea0: 20 20 20 70 43 74 78 2d 3e 63 6b 73 75 6d 20 5e     pCtx->cksum ^
5eb0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
5ec0: 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20  exEntryCksum(.  
5ed0: 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e            pCtx->
5ee0: 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  iRowid, iCol, iP
5ef0: 6f 73 2c 20 69 69 2b 31 2c 20 70 54 6f 6b 65 6e  os, ii+1, pToken
5f00: 2c 20 6e 42 79 74 65 0a 20 20 20 20 20 20 20 20  , nByte.        
5f10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5f20: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
5f30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
5f40: 6b 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  k that the conte
5f50: 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69  nts of the FTS i
5f60: 6e 64 65 78 20 6d 61 74 63 68 20 74 68 61 74 20  ndex match that 
5f70: 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74  of the %_content
5f80: 0a 2a 2a 20 74 61 62 6c 65 2e 20 52 65 74 75 72  .** table. Retur
5f90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
5fa0: 68 65 79 20 64 6f 2c 20 6f 72 20 53 51 4c 49 54  hey do, or SQLIT
5fb0: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 6e 6f 74  E_CORRUPT if not
5fc0: 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 73 6f 6d 65  . Return.** some
5fd0: 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65 72   other SQLite er
5fe0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
5ff0: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
6000: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 0a  e attempting to.
6010: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69  ** determine thi
6020: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
6030: 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74 65  3Fts5StorageInte
6040: 67 72 69 74 79 28 46 74 73 35 53 74 6f 72 61 67  grity(Fts5Storag
6050: 65 20 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e  e *p){.  Fts5Con
6060: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
6070: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74  ->pConfig;.  int
6080: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60a0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
60b0: 20 69 6e 74 20 2a 61 43 6f 6c 53 69 7a 65 3b 20   int *aColSize; 
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 69 7a   /* Array of siz
60e0: 65 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20  e pConfig->nCol 
60f0: 2a 2f 0a 20 20 69 36 34 20 2a 61 54 6f 74 61 6c  */.  i64 *aTotal
6100: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
6110: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
6120: 20 73 69 7a 65 20 70 43 6f 6e 66 69 67 2d 3e 6e   size pConfig->n
6130: 43 6f 6c 20 2a 2f 0a 20 20 46 74 73 35 49 6e 74  Col */.  Fts5Int
6140: 65 67 72 69 74 79 43 74 78 20 63 74 78 3b 0a 20  egrityCtx ctx;. 
6150: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
6160: 53 63 61 6e 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  Scan;..  memset(
6170: 26 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &ctx, 0, sizeof(
6180: 46 74 73 35 49 6e 74 65 67 72 69 74 79 43 74 78  Fts5IntegrityCtx
6190: 29 29 3b 0a 20 20 63 74 78 2e 70 43 6f 6e 66 69  ));.  ctx.pConfi
61a0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
61b0: 20 20 61 54 6f 74 61 6c 53 69 7a 65 20 3d 20 28    aTotalSize = (
61c0: 69 36 34 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  i64*)sqlite3_mal
61d0: 6c 6f 63 28 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  loc(pConfig->nCo
61e0: 6c 20 2a 20 28 73 69 7a 65 6f 66 28 69 6e 74 29  l * (sizeof(int)
61f0: 2b 73 69 7a 65 6f 66 28 69 36 34 29 29 29 3b 0a  +sizeof(i64)));.
6200: 20 20 69 66 28 20 21 61 54 6f 74 61 6c 53 69 7a    if( !aTotalSiz
6210: 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
6220: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 43 6f 6c 53  E_NOMEM;.  aColS
6230: 69 7a 65 20 3d 20 28 69 6e 74 2a 29 26 61 54 6f  ize = (int*)&aTo
6240: 74 61 6c 53 69 7a 65 5b 70 43 6f 6e 66 69 67 2d  talSize[pConfig-
6250: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
6260: 28 61 54 6f 74 61 6c 53 69 7a 65 2c 20 30 2c 20  (aTotalSize, 0, 
6270: 73 69 7a 65 6f 66 28 69 36 34 29 20 2a 20 70 43  sizeof(i64) * pC
6280: 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a 0a 20  onfig->nCol);.. 
6290: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
62a0: 20 65 78 70 65 63 74 65 64 20 69 6e 64 65 78 20   expected index 
62b0: 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
62c0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
62d0: 66 20 74 68 65 0a 20 20 2a 2a 20 25 5f 63 6f 6e  f the.  ** %_con
62e0: 74 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69 73  tent table. This
62f0: 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68   block stores th
6300: 65 20 63 68 65 63 6b 73 75 6d 20 69 6e 20 63 74  e checksum in ct
6310: 78 2e 63 6b 73 75 6d 2e 20 2a 2f 0a 20 20 72 63  x.cksum. */.  rc
6320: 20 3d 20 66 74 73 35 53 74 6f 72 61 67 65 47 65   = fts5StorageGe
6330: 74 53 74 6d 74 28 70 2c 20 46 54 53 35 5f 53 54  tStmt(p, FTS5_ST
6340: 4d 54 5f 53 43 41 4e 2c 20 26 70 53 63 61 6e 2c  MT_SCAN, &pScan,
6350: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
6360: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6370: 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 77 68 69  int rc2;.    whi
6380: 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
6390: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 63  sqlite3_step(pSc
63a0: 61 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  an) ){.      int
63b0: 20 69 3b 0a 20 20 20 20 20 20 63 74 78 2e 69 52   i;.      ctx.iR
63c0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  owid = sqlite3_c
63d0: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 63 61  olumn_int64(pSca
63e0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 74 78  n, 0);.      ctx
63f0: 2e 73 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  .szCol = 0;.    
6400: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62    if( pConfig->b
6410: 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b 0a 20 20  Columnsize ){.  
6420: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6430: 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 6f 63  e3Fts5StorageDoc
6440: 73 69 7a 65 28 70 2c 20 63 74 78 2e 69 52 6f 77  size(p, ctx.iRow
6450: 69 64 2c 20 61 43 6f 6c 53 69 7a 65 29 3b 0a 20  id, aColSize);. 
6460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6470: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6480: 26 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  & pConfig->eDeta
6490: 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
64a0: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
64b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
64c0: 54 65 72 6d 73 65 74 4e 65 77 28 26 63 74 78 2e  TermsetNew(&ctx.
64d0: 70 54 65 72 6d 73 65 74 29 3b 0a 20 20 20 20 20  pTermset);.     
64e0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
64f0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
6500: 26 26 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43  && i<pConfig->nC
6510: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6520: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
6530: 62 55 6e 69 6e 64 65 78 65 64 5b 69 5d 20 29 20  bUnindexed[i] ) 
6540: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6550: 20 20 63 74 78 2e 69 43 6f 6c 20 3d 20 69 3b 0a    ctx.iCol = i;.
6560: 20 20 20 20 20 20 20 20 63 74 78 2e 73 7a 43 6f          ctx.szCo
6570: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  l = 0;.        i
6580: 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  f( pConfig->eDet
6590: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
65a0: 5f 43 4f 4c 55 4d 4e 53 20 29 7b 0a 20 20 20 20  _COLUMNS ){.    
65b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
65c0: 65 33 46 74 73 35 54 65 72 6d 73 65 74 4e 65 77  e3Fts5TermsetNew
65d0: 28 26 63 74 78 2e 70 54 65 72 6d 73 65 74 29 3b  (&ctx.pTermset);
65e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
65f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6600: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6610: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
6620: 73 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f 6e 66  s5Tokenize(pConf
6630: 69 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ig, .           
6640: 20 20 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45     FTS5_TOKENIZE
6650: 5f 44 4f 43 55 4d 45 4e 54 2c 0a 20 20 20 20 20  _DOCUMENT,.     
6660: 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20           (const 
6670: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
6680: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 63 61 6e 2c  lumn_text(pScan,
6690: 20 69 2b 31 29 2c 0a 20 20 20 20 20 20 20 20 20   i+1),.         
66a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
66b0: 75 6d 6e 5f 62 79 74 65 73 28 70 53 63 61 6e 2c  umn_bytes(pScan,
66c0: 20 69 2b 31 29 2c 0a 20 20 20 20 20 20 20 20 20   i+1),.         
66d0: 20 20 20 20 20 28 76 6f 69 64 2a 29 26 63 74 78       (void*)&ctx
66e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
66f0: 66 74 73 35 53 74 6f 72 61 67 65 49 6e 74 65 67  fts5StorageInteg
6700: 72 69 74 79 43 61 6c 6c 62 61 63 6b 0a 20 20 20  rityCallback.   
6710: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
6720: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
6730: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6740: 20 70 43 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75 6d   pConfig->bColum
6750: 6e 73 69 7a 65 20 26 26 20 63 74 78 2e 73 7a 43  nsize && ctx.szC
6760: 6f 6c 21 3d 61 43 6f 6c 53 69 7a 65 5b 69 5d 20  ol!=aColSize[i] 
6770: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
6780: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
6790: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
67a0: 20 20 61 54 6f 74 61 6c 53 69 7a 65 5b 69 5d 20    aTotalSize[i] 
67b0: 2b 3d 20 63 74 78 2e 73 7a 43 6f 6c 3b 0a 20 20  += ctx.szCol;.  
67c0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
67d0: 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
67e0: 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20  _DETAIL_COLUMNS 
67f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6800: 69 74 65 33 46 74 73 35 54 65 72 6d 73 65 74 46  ite3Fts5TermsetF
6810: 72 65 65 28 63 74 78 2e 70 54 65 72 6d 73 65 74  ree(ctx.pTermset
6820: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 74 78  );.          ctx
6830: 2e 70 54 65 72 6d 73 65 74 20 3d 20 30 3b 0a 20  .pTermset = 0;. 
6840: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
6860: 73 35 54 65 72 6d 73 65 74 46 72 65 65 28 63 74  s5TermsetFree(ct
6870: 78 2e 70 54 65 72 6d 73 65 74 29 3b 0a 20 20 20  x.pTermset);.   
6880: 20 20 20 63 74 78 2e 70 54 65 72 6d 73 65 74 20     ctx.pTermset 
6890: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
68a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
68b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
68c0: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
68d0: 65 73 65 74 28 70 53 63 61 6e 29 3b 0a 20 20 20  eset(pScan);.   
68e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
68f0: 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
6900: 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 74 68   }..  /* Test th
6910: 61 74 20 74 68 65 20 22 74 6f 74 61 6c 73 22 20  at the "totals" 
6920: 28 73 6f 6d 65 74 69 6d 65 73 20 63 61 6c 6c 65  (sometimes calle
6930: 64 20 22 61 76 65 72 61 67 65 73 22 29 20 72 65  d "averages") re
6940: 63 6f 72 64 20 6c 6f 6f 6b 73 20 4f 6b 20 2a 2f  cord looks Ok */
6950: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6960: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
6970: 69 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  i;.    rc = fts5
6980: 53 74 6f 72 61 67 65 4c 6f 61 64 54 6f 74 61 6c  StorageLoadTotal
6990: 73 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  s(p, 0);.    for
69a0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
69b0: 5f 4f 4b 20 26 26 20 69 3c 70 43 6f 6e 66 69 67  _OK && i<pConfig
69c0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
69d0: 20 20 20 20 69 66 28 20 70 2d 3e 61 54 6f 74 61      if( p->aTota
69e0: 6c 53 69 7a 65 5b 69 5d 21 3d 61 54 6f 74 61 6c  lSize[i]!=aTotal
69f0: 53 69 7a 65 5b 69 5d 20 29 20 72 63 20 3d 20 46  Size[i] ) rc = F
6a00: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
6a10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
6a20: 63 6b 20 74 68 61 74 20 74 68 65 20 25 5f 64 6f  ck that the %_do
6a30: 63 73 69 7a 65 20 61 6e 64 20 25 5f 63 6f 6e 74  csize and %_cont
6a40: 65 6e 74 20 74 61 62 6c 65 73 20 63 6f 6e 74 61  ent tables conta
6a50: 69 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 0a  in the expected.
6a60: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    ** number of r
6a70: 6f 77 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  ows.  */.  if( r
6a80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
6a90: 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e  pConfig->eConten
6aa0: 74 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f  t==FTS5_CONTENT_
6ab0: 4e 4f 52 4d 41 4c 20 29 7b 0a 20 20 20 20 69 36  NORMAL ){.    i6
6ac0: 34 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  4 nRow = 0;.    
6ad0: 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67 65  rc = fts5Storage
6ae0: 43 6f 75 6e 74 28 70 2c 20 22 63 6f 6e 74 65 6e  Count(p, "conten
6af0: 74 22 2c 20 26 6e 52 6f 77 29 3b 0a 20 20 20 20  t", &nRow);.    
6b00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6b10: 4b 20 26 26 20 6e 52 6f 77 21 3d 70 2d 3e 6e 54  K && nRow!=p->nT
6b20: 6f 74 61 6c 52 6f 77 20 29 20 72 63 20 3d 20 46  otalRow ) rc = F
6b30: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
6b40: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6b50: 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d  E_OK && pConfig-
6b60: 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b 0a  >bColumnsize ){.
6b70: 20 20 20 20 69 36 34 20 6e 52 6f 77 20 3d 20 30      i64 nRow = 0
6b80: 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 53  ;.    rc = fts5S
6b90: 74 6f 72 61 67 65 43 6f 75 6e 74 28 70 2c 20 22  torageCount(p, "
6ba0: 64 6f 63 73 69 7a 65 22 2c 20 26 6e 52 6f 77 29  docsize", &nRow)
6bb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
6bc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 6f 77 21  LITE_OK && nRow!
6bd0: 3d 70 2d 3e 6e 54 6f 74 61 6c 52 6f 77 20 29 20  =p->nTotalRow ) 
6be0: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
6bf0: 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 73  T;.  }..  /* Pas
6c00: 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 63  s the expected c
6c10: 68 65 63 6b 73 75 6d 20 64 6f 77 6e 20 74 6f 20  hecksum down to 
6c20: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 6d 6f  the FTS index mo
6c30: 64 75 6c 65 2e 20 49 74 20 77 69 6c 6c 0a 20 20  dule. It will.  
6c40: 2a 2a 20 76 65 72 69 66 79 2c 20 61 6d 6f 6e 67  ** verify, among
6c50: 73 74 20 6f 74 68 65 72 20 74 68 69 6e 67 73 2c  st other things,
6c60: 20 74 68 61 74 20 69 74 20 6d 61 74 63 68 65 73   that it matches
6c70: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 67 65   the checksum ge
6c80: 6e 65 72 61 74 65 64 20 62 79 0a 20 20 2a 2a 20  nerated by.  ** 
6c90: 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 69  inspecting the i
6ca0: 6e 64 65 78 20 69 74 73 65 6c 66 2e 20 20 2a 2f  ndex itself.  */
6cb0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6cc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
6cd0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
6ce0: 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  xIntegrityCheck(
6cf0: 70 2d 3e 70 49 6e 64 65 78 2c 20 63 74 78 2e 63  p->pIndex, ctx.c
6d00: 6b 73 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ksum);.  }..  sq
6d10: 6c 69 74 65 33 5f 66 72 65 65 28 61 54 6f 74 61  lite3_free(aTota
6d20: 6c 53 69 7a 65 29 3b 0a 20 20 72 65 74 75 72 6e  lSize);.  return
6d30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62   rc;.}../*.** Ob
6d40: 74 61 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 73  tain an SQLite s
6d50: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
6d60: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
6d70: 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72   to read data fr
6d80: 6f 6d 20 74 68 65 0a 2a 2a 20 25 5f 63 6f 6e 74  om the.** %_cont
6d90: 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  ent table..*/.in
6da0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
6db0: 72 61 67 65 53 74 6d 74 28 0a 20 20 46 74 73 35  rageStmt(.  Fts5
6dc0: 53 74 6f 72 61 67 65 20 2a 70 2c 20 0a 20 20 69  Storage *p, .  i
6dd0: 6e 74 20 65 53 74 6d 74 2c 20 0a 20 20 73 71 6c  nt eStmt, .  sql
6de0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 2c 20  ite3_stmt **pp, 
6df0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
6e00: 73 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sg.){.  int rc;.
6e10: 20 20 61 73 73 65 72 74 28 20 65 53 74 6d 74 3d    assert( eStmt=
6e20: 3d 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e 5f  =FTS5_STMT_SCAN_
6e30: 41 53 43 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  ASC .       || e
6e40: 53 74 6d 74 3d 3d 46 54 53 35 5f 53 54 4d 54 5f  Stmt==FTS5_STMT_
6e50: 53 43 41 4e 5f 44 45 53 43 0a 20 20 20 20 20 20  SCAN_DESC.      
6e60: 20 7c 7c 20 65 53 74 6d 74 3d 3d 46 54 53 35 5f   || eStmt==FTS5_
6e70: 53 54 4d 54 5f 4c 4f 4f 4b 55 50 0a 20 20 29 3b  STMT_LOOKUP.  );
6e80: 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72  .  rc = fts5Stor
6e90: 61 67 65 47 65 74 53 74 6d 74 28 70 2c 20 65 53  ageGetStmt(p, eS
6ea0: 74 6d 74 2c 20 70 70 2c 20 70 7a 45 72 72 4d 73  tmt, pp, pzErrMs
6eb0: 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  g);.  if( rc==SQ
6ec0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
6ed0: 73 73 65 72 74 28 20 70 2d 3e 61 53 74 6d 74 5b  ssert( p->aStmt[
6ee0: 65 53 74 6d 74 5d 3d 3d 2a 70 70 20 29 3b 0a 20  eStmt]==*pp );. 
6ef0: 20 20 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d     p->aStmt[eStm
6f00: 74 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  t] = 0;.  }.  re
6f10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6f20: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 53 51 4c  * Release an SQL
6f30: 69 74 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  ite statement ha
6f40: 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 76 69  ndle obtained vi
6f50: 61 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  a an earlier cal
6f60: 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 46  l to.** sqlite3F
6f70: 74 73 35 53 74 6f 72 61 67 65 53 74 6d 74 28 29  ts5StorageStmt()
6f80: 2e 20 54 68 65 20 65 53 74 6d 74 20 70 61 72 61  . The eStmt para
6f90: 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
6fa0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
6fb0: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 61 74   must match that
6fc0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
6fd0: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
6fe0: 65 53 74 6d 74 28 29 20 63 61 6c 6c 2e 0a 2a 2f  eStmt() call..*/
6ff0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
7000: 35 53 74 6f 72 61 67 65 53 74 6d 74 52 65 6c 65  5StorageStmtRele
7010: 61 73 65 28 0a 20 20 46 74 73 35 53 74 6f 72 61  ase(.  Fts5Stora
7020: 67 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 65 53  ge *p, .  int eS
7030: 74 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  tmt, .  sqlite3_
7040: 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20  stmt *pStmt.){. 
7050: 20 61 73 73 65 72 74 28 20 65 53 74 6d 74 3d 3d   assert( eStmt==
7060: 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e 5f 41  FTS5_STMT_SCAN_A
7070: 53 43 0a 20 20 20 20 20 20 20 7c 7c 20 65 53 74  SC.       || eSt
7080: 6d 74 3d 3d 46 54 53 35 5f 53 54 4d 54 5f 53 43  mt==FTS5_STMT_SC
7090: 41 4e 5f 44 45 53 43 0a 20 20 20 20 20 20 20 7c  AN_DESC.       |
70a0: 7c 20 65 53 74 6d 74 3d 3d 46 54 53 35 5f 53 54  | eStmt==FTS5_ST
70b0: 4d 54 5f 4c 4f 4f 4b 55 50 0a 20 20 29 3b 0a 20  MT_LOOKUP.  );. 
70c0: 20 69 66 28 20 70 2d 3e 61 53 74 6d 74 5b 65 53   if( p->aStmt[eS
70d0: 74 6d 74 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  tmt]==0 ){.    s
70e0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
70f0: 6d 74 29 3b 0a 20 20 20 20 70 2d 3e 61 53 74 6d  mt);.    p->aStm
7100: 74 5b 65 53 74 6d 74 5d 20 3d 20 70 53 74 6d 74  t[eStmt] = pStmt
7110: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
7120: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
7130: 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  pStmt);.  }.}..s
7140: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74  tatic int fts5St
7150: 6f 72 61 67 65 44 65 63 6f 64 65 53 69 7a 65 41  orageDecodeSizeA
7160: 72 72 61 79 28 0a 20 20 69 6e 74 20 2a 61 43 6f  rray(.  int *aCo
7170: 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20  l, int nCol,    
7180: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
7190: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
71a0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f    const u8 *aBlo
71b0: 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 20 20 20 20  b, int nBlob    
71c0: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 72    /* Record to r
71d0: 65 61 64 20 76 61 72 69 6e 74 73 20 66 72 6f 6d  ead varints from
71e0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
71f0: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
7200: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
7210: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
7220: 20 69 4f 66 66 3e 3d 6e 42 6c 6f 62 20 29 20 72   iOff>=nBlob ) r
7230: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 4f 66  eturn 1;.    iOf
7240: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
7250: 6e 74 33 32 28 26 61 42 6c 6f 62 5b 69 4f 66 66  nt32(&aBlob[iOff
7260: 5d 2c 20 61 43 6f 6c 5b 69 5d 29 3b 0a 20 20 7d  ], aCol[i]);.  }
7270: 0a 20 20 72 65 74 75 72 6e 20 28 69 4f 66 66 21  .  return (iOff!
7280: 3d 6e 42 6c 6f 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  =nBlob);.}../*.*
7290: 2a 20 41 72 67 75 6d 65 6e 74 20 61 43 6f 6c 20  * Argument aCol 
72a0: 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 72 72  points to an arr
72b0: 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 63  ay of integers c
72c0: 6f 6e 74 61 69 6e 69 6e 67 20 6f 6e 65 20 65 6e  ontaining one en
72d0: 74 72 79 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  try for.** each 
72e0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 20 54 68  table column. Th
72f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64  is function read
7300: 73 20 74 68 65 20 25 5f 64 6f 63 73 69 7a 65 20  s the %_docsize 
7310: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 0a 2a  record for the.*
7320: 2a 20 73 70 65 63 69 66 69 65 64 20 72 6f 77 69  * specified rowi
7330: 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20  d and populates 
7340: 61 43 6f 6c 5b 5d 20 77 69 74 68 20 74 68 65 20  aCol[] with the 
7350: 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 41  results..**.** A
7360: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
7370: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7380: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
7390: 72 73 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  rs, or SQLITE_OK
73a0: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
73b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
73c0: 35 53 74 6f 72 61 67 65 44 6f 63 73 69 7a 65 28  5StorageDocsize(
73d0: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
73e0: 69 36 34 20 69 52 6f 77 69 64 2c 20 69 6e 74 20  i64 iRowid, int 
73f0: 2a 61 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 43  *aCol){.  int nC
7400: 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ol = p->pConfig-
7410: 3e 6e 43 6f 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d  >nCol;    /* Num
7420: 62 65 72 20 6f 66 20 75 73 65 72 20 63 6f 6c 75  ber of user colu
7430: 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a  mns in table */.
7440: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
7450: 70 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20  pLookup = 0;    
7460: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74    /* Statement t
7470: 6f 20 71 75 65 72 79 20 25 5f 64 6f 63 73 69 7a  o query %_docsiz
7480: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
74b0: 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   Code */..  asse
74c0: 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  rt( p->pConfig->
74d0: 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 3b 0a 20  bColumnsize );. 
74e0: 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67   rc = fts5Storag
74f0: 65 47 65 74 53 74 6d 74 28 70 2c 20 46 54 53 35  eGetStmt(p, FTS5
7500: 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 5f 44 4f 43  _STMT_LOOKUP_DOC
7510: 53 49 5a 45 2c 20 26 70 4c 6f 6f 6b 75 70 2c 20  SIZE, &pLookup, 
7520: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
7530: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
7540: 6e 74 20 62 43 6f 72 72 75 70 74 20 3d 20 31 3b  nt bCorrupt = 1;
7550: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
7560: 64 5f 69 6e 74 36 34 28 70 4c 6f 6f 6b 75 70 2c  d_int64(pLookup,
7570: 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20   1, iRowid);.   
7580: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
7590: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c  =sqlite3_step(pL
75a0: 6f 6f 6b 75 70 29 20 29 7b 0a 20 20 20 20 20 20  ookup) ){.      
75b0: 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 20  const u8 *aBlob 
75c0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
75d0: 5f 62 6c 6f 62 28 70 4c 6f 6f 6b 75 70 2c 20 30  _blob(pLookup, 0
75e0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  );.      int nBl
75f0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
7600: 75 6d 6e 5f 62 79 74 65 73 28 70 4c 6f 6f 6b 75  umn_bytes(pLooku
7610: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 0);.      if(
7620: 20 30 3d 3d 66 74 73 35 53 74 6f 72 61 67 65 44   0==fts5StorageD
7630: 65 63 6f 64 65 53 69 7a 65 41 72 72 61 79 28 61  ecodeSizeArray(a
7640: 43 6f 6c 2c 20 6e 43 6f 6c 2c 20 61 42 6c 6f 62  Col, nCol, aBlob
7650: 2c 20 6e 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20  , nBlob) ){.    
7660: 20 20 20 20 62 43 6f 72 72 75 70 74 20 3d 20 30      bCorrupt = 0
7670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7680: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7690: 5f 72 65 73 65 74 28 70 4c 6f 6f 6b 75 70 29 3b  _reset(pLookup);
76a0: 0a 20 20 20 20 69 66 28 20 62 43 6f 72 72 75 70  .    if( bCorrup
76b0: 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
76c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
76d0: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
76e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
76f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
7700: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
7710: 53 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65  Size(Fts5Storage
7720: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69   *p, int iCol, i
7730: 36 34 20 2a 70 6e 54 6f 6b 65 6e 29 7b 0a 20 20  64 *pnToken){.  
7740: 69 6e 74 20 72 63 20 3d 20 66 74 73 35 53 74 6f  int rc = fts5Sto
7750: 72 61 67 65 4c 6f 61 64 54 6f 74 61 6c 73 28 70  rageLoadTotals(p
7760: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
7770: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7780: 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20   *pnToken = 0;. 
7790: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
77a0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
77b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
77c0: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b  ->pConfig->nCol;
77d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2a   i++){.        *
77e0: 70 6e 54 6f 6b 65 6e 20 2b 3d 20 70 2d 3e 61 54  pnToken += p->aT
77f0: 6f 74 61 6c 53 69 7a 65 5b 69 5d 3b 0a 20 20 20  otalSize[i];.   
7800: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
7810: 66 28 20 69 43 6f 6c 3c 70 2d 3e 70 43 6f 6e 66  f( iCol<p->pConf
7820: 69 67 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ig->nCol ){.    
7830: 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 70 2d 3e    *pnToken = p->
7840: 61 54 6f 74 61 6c 53 69 7a 65 5b 69 43 6f 6c 5d  aTotalSize[iCol]
7850: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7860: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
7870: 41 4e 47 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ANGE;.    }.  }.
7880: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7890: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
78a0: 74 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28 46  torageRowCount(F
78b0: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
78c0: 36 34 20 2a 70 6e 52 6f 77 29 7b 0a 20 20 69 6e  64 *pnRow){.  in
78d0: 74 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61  t rc = fts5Stora
78e0: 67 65 4c 6f 61 64 54 6f 74 61 6c 73 28 70 2c 20  geLoadTotals(p, 
78f0: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
7900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
7910: 70 6e 52 6f 77 20 3d 20 70 2d 3e 6e 54 6f 74 61  pnRow = p->nTota
7920: 6c 52 6f 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lRow;.  }.  retu
7930: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7940: 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63  Flush any data c
7950: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e  urrently held in
7960: 2d 6d 65 6d 6f 72 79 20 74 6f 20 64 69 73 6b 2e  -memory to disk.
7970: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
7980: 74 73 35 53 74 6f 72 61 67 65 53 79 6e 63 28 46  ts5StorageSync(F
7990: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29 7b 0a  ts5Storage *p){.
79a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
79b0: 45 5f 4f 4b 3b 0a 20 20 69 36 34 20 69 4c 61 73  E_OK;.  i64 iLas
79c0: 74 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  tRowid = sqlite3
79d0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
79e0: 69 64 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64  id(p->pConfig->d
79f0: 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 62 54 6f  b);.  if( p->bTo
7a00: 74 61 6c 73 56 61 6c 69 64 20 29 7b 0a 20 20 20  talsValid ){.   
7a10: 20 72 63 20 3d 20 66 74 73 35 53 74 6f 72 61 67   rc = fts5Storag
7a20: 65 53 61 76 65 54 6f 74 61 6c 73 28 70 29 3b 0a  eSaveTotals(p);.
7a30: 20 20 20 20 70 2d 3e 62 54 6f 74 61 6c 73 56 61      p->bTotalsVa
7a40: 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  lid = 0;.  }.  i
7a50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7a60: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7a70: 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e  ite3Fts5IndexSyn
7a80: 63 28 70 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20  c(p->pIndex);.  
7a90: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f  }.  sqlite3_set_
7aa0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
7ab0: 64 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62  d(p->pConfig->db
7ac0: 2c 20 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20  , iLastRowid);. 
7ad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
7ae0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
7af0: 6f 72 61 67 65 52 6f 6c 6c 62 61 63 6b 28 46 74  orageRollback(Ft
7b00: 73 35 53 74 6f 72 61 67 65 20 2a 70 29 7b 0a 20  s5Storage *p){. 
7b10: 20 70 2d 3e 62 54 6f 74 61 6c 73 56 61 6c 69 64   p->bTotalsValid
7b20: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73   = 0;.  return s
7b30: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
7b40: 6f 6c 6c 62 61 63 6b 28 70 2d 3e 70 49 6e 64 65  ollback(p->pInde
7b50: 78 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  x);.}..int sqlit
7b60: 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e  e3Fts5StorageCon
7b70: 66 69 67 56 61 6c 75 65 28 0a 20 20 46 74 73 35  figValue(.  Fts5
7b80: 53 74 6f 72 61 67 65 20 2a 70 2c 20 0a 20 20 63  Storage *p, .  c
7b90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 0a 20 20  onst char *z,.  
7ba0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
7bb0: 56 61 6c 2c 0a 20 20 69 6e 74 20 69 56 61 6c 0a  Val,.  int iVal.
7bc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
7bd0: 74 20 2a 70 52 65 70 6c 61 63 65 20 3d 20 30 3b  t *pReplace = 0;
7be0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 35  .  int rc = fts5
7bf0: 53 74 6f 72 61 67 65 47 65 74 53 74 6d 74 28 70  StorageGetStmt(p
7c00: 2c 20 46 54 53 35 5f 53 54 4d 54 5f 52 45 50 4c  , FTS5_STMT_REPL
7c10: 41 43 45 5f 43 4f 4e 46 49 47 2c 20 26 70 52 65  ACE_CONFIG, &pRe
7c20: 70 6c 61 63 65 2c 20 30 29 3b 0a 20 20 69 66 28  place, 0);.  if(
7c30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7c40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
7c50: 6e 64 5f 74 65 78 74 28 70 52 65 70 6c 61 63 65  nd_text(pReplace
7c60: 2c 20 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  , 1, z, -1, SQLI
7c70: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
7c80: 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20  if( pVal ){.    
7c90: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76    sqlite3_bind_v
7ca0: 61 6c 75 65 28 70 52 65 70 6c 61 63 65 2c 20 32  alue(pReplace, 2
7cb0: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  , pVal);.    }el
7cc0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7cd0: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 52 65 70 6c  3_bind_int(pRepl
7ce0: 61 63 65 2c 20 32 2c 20 69 56 61 6c 29 3b 0a 20  ace, 2, iVal);. 
7cf0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7d00: 5f 73 74 65 70 28 70 52 65 70 6c 61 63 65 29 3b  _step(pReplace);
7d10: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7d20: 33 5f 72 65 73 65 74 28 70 52 65 70 6c 61 63 65  3_reset(pReplace
7d30: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
7d40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 56  =SQLITE_OK && pV
7d50: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4e  al ){.    int iN
7d60: 65 77 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ew = p->pConfig-
7d70: 3e 69 43 6f 6f 6b 69 65 20 2b 20 31 3b 0a 20 20  >iCookie + 1;.  
7d80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
7d90: 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65  s5IndexSetCookie
7da0: 28 70 2d 3e 70 49 6e 64 65 78 2c 20 69 4e 65 77  (p->pIndex, iNew
7db0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
7dc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7dd0: 20 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43    p->pConfig->iC
7de0: 6f 6f 6b 69 65 20 3d 20 69 4e 65 77 3b 0a 20 20  ookie = iNew;.  
7df0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7e00: 20 72 63 3b 0a 7d 0a                              rc;.}.