/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 17986112dc76e7e39170e08df68f84180f66a9fe:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4a 75 6e 20 30  /*.** 2014 Jun 0
0010: 39 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  9.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 69 73 20 61 6e 20 53 51 4c 69 74 65 20 6d 6f   is an SQLite mo
0190: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  dule implementin
01a0: 67 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72  g full-text sear
01b0: 63 68 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  ch..*/..#include
01c0: 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a 23 64   "fts5Int.h"..#d
01d0: 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55  efine FTS5_DEFAU
01e0: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 20 20 31  LT_PAGE_SIZE   1
01f0: 30 30 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35  000.#define FTS5
0200: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 45 52  _DEFAULT_AUTOMER
0210: 47 45 20 20 20 20 20 20 34 0a 0a 2f 2a 20 4d 61  GE      4../* Ma
0220: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 70 61  ximum allowed pa
0230: 67 65 20 73 69 7a 65 20 2a 2f 0a 23 64 65 66 69  ge size */.#defi
0240: 6e 65 20 46 54 53 35 5f 4d 41 58 5f 50 41 47 45  ne FTS5_MAX_PAGE
0250: 5f 53 49 5a 45 20 28 31 32 38 2a 31 30 32 34 29  _SIZE (128*1024)
0260: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
0270: 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71 75 6f  an SQL-style quo
0280: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  ted string into 
0290: 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67 20  a normal string 
02a0: 62 79 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74  by removing.** t
02b0: 68 65 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  he quote charact
02c0: 65 72 73 2e 20 20 54 68 65 20 63 6f 6e 76 65 72  ers.  The conver
02d0: 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d  sion is done in-
02e0: 70 6c 61 63 65 2e 20 20 49 66 20 74 68 65 0a 2a  place.  If the.*
02f0: 2a 20 69 6e 70 75 74 20 64 6f 65 73 20 6e 6f 74  * input does not
0300: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 71 75   begin with a qu
0310: 6f 74 65 20 63 68 61 72 61 63 74 65 72 2c 20 74  ote character, t
0320: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
0330: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  .** is a no-op..
0340: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a  **.** Examples:.
0350: 2a 2a 0a 2a 2a 20 20 20 20 20 22 61 62 63 22 20  **.**     "abc" 
0360: 20 20 62 65 63 6f 6d 65 73 20 20 20 61 62 63 0a    becomes   abc.
0370: 2a 2a 20 20 20 20 20 27 78 79 7a 27 20 20 20 62  **     'xyz'   b
0380: 65 63 6f 6d 65 73 20 20 20 78 79 7a 0a 2a 2a 20  ecomes   xyz.** 
0390: 20 20 20 20 5b 70 71 72 5d 20 20 20 62 65 63 6f      [pqr]   beco
03a0: 6d 65 73 20 20 20 70 71 72 0a 2a 2a 20 20 20 20  mes   pqr.**    
03b0: 20 60 6d 6e 6f 60 20 20 20 62 65 63 6f 6d 65 73   `mno`   becomes
03c0: 20 20 20 6d 6e 6f 0a 2a 2f 0a 76 6f 69 64 20 73     mno.*/.void s
03d0: 71 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f 74  qlite3Fts5Dequot
03e0: 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68  e(char *z){.  ch
03f0: 61 72 20 71 75 6f 74 65 3b 20 20 20 20 20 20 20  ar quote;       
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0410: 20 51 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   Quote character
0420: 20 28 69 66 20 61 6e 79 20 29 20 2a 2f 0a 0a 20   (if any ) */.. 
0430: 20 71 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20   quote = z[0];. 
0440: 20 69 66 28 20 71 75 6f 74 65 3d 3d 27 5b 27 20   if( quote=='[' 
0450: 7c 7c 20 71 75 6f 74 65 3d 3d 27 5c 27 27 20 7c  || quote=='\'' |
0460: 7c 20 71 75 6f 74 65 3d 3d 27 22 27 20 7c 7c 20  | quote=='"' || 
0470: 71 75 6f 74 65 3d 3d 27 60 27 20 29 7b 0a 20 20  quote=='`' ){.  
0480: 20 20 69 6e 74 20 69 49 6e 20 3d 20 31 3b 20 20    int iIn = 1;  
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
04b0: 20 62 79 74 65 20 74 6f 20 72 65 61 64 20 66 72   byte to read fr
04c0: 6f 6d 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20  om input */.    
04d0: 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
04e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
04f0: 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 62   Index of next b
0500: 79 74 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  yte to write to 
0510: 6f 75 74 70 75 74 20 2a 2f 0a 0a 20 20 20 20 2f  output */..    /
0520: 2a 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62  * If the first b
0530: 79 74 65 20 77 61 73 20 61 20 27 5b 27 2c 20 74  yte was a '[', t
0540: 68 65 6e 20 74 68 65 20 63 6c 6f 73 65 2d 71 75  hen the close-qu
0550: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 69 73  ote character is
0560: 20 61 20 27 5d 27 20 2a 2f 0a 20 20 20 20 69 66   a ']' */.    if
0570: 28 20 71 75 6f 74 65 3d 3d 27 5b 27 20 29 20 71  ( quote=='[' ) q
0580: 75 6f 74 65 20 3d 20 27 5d 27 3b 20 20 0a 0a 20  uote = ']';  .. 
0590: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
05a0: 28 7a 5b 69 49 6e 5d 29 20 29 7b 0a 20 20 20 20  (z[iIn]) ){.    
05b0: 20 20 69 66 28 20 7a 5b 69 49 6e 5d 3d 3d 71 75    if( z[iIn]==qu
05c0: 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ote ){.        i
05d0: 66 28 20 7a 5b 69 49 6e 2b 31 5d 21 3d 71 75 6f  f( z[iIn+1]!=quo
05e0: 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  te ) break;.    
05f0: 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20      z[iOut++] = 
0600: 71 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 69  quote;.        i
0610: 49 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d  In += 2;.      }
0620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
0630: 69 4f 75 74 2b 2b 5d 20 3d 20 7a 5b 69 49 6e 2b  iOut++] = z[iIn+
0640: 2b 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +];.      }.    
0650: 7d 0a 20 20 20 20 7a 5b 69 4f 75 74 5d 20 3d 20  }.    z[iOut] = 
0660: 27 5c 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  '\0';.  }.}../*.
0670: 2a 2a 20 50 61 72 73 65 20 74 68 65 20 22 73 70  ** Parse the "sp
0680: 65 63 69 61 6c 22 20 43 52 45 41 54 45 20 56 49  ecial" CREATE VI
0690: 52 54 55 41 4c 20 54 41 42 4c 45 20 64 69 72 65  RTUAL TABLE dire
06a0: 63 74 69 76 65 20 61 6e 64 20 75 70 64 61 74 65  ctive and update
06b0: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  .** configuratio
06c0: 6e 20 6f 62 6a 65 63 74 20 70 43 6f 6e 66 69 67  n object pConfig
06d0: 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
06e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
06f0: 73 66 75 6c 2c 20 6f 62 6a 65 63 74 20 70 43 6f  sful, object pCo
0700: 6e 66 69 67 20 69 73 20 75 70 64 61 74 65 64 20  nfig is updated 
0710: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
0720: 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 61 6e  turned. If.** an
0730: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
0740: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
0750: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
0760: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
0770: 73 61 67 65 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  sage.** may be l
0780: 65 66 74 20 69 6e 20 2a 70 7a 45 72 72 2e 20 49  eft in *pzErr. I
0790: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
07a0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
07b0: 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e  aller to.** even
07c0: 74 75 61 6c 6c 79 20 66 72 65 65 20 61 6e 79 20  tually free any 
07d0: 73 75 63 68 20 65 72 72 6f 72 20 6d 65 73 73 61  such error messa
07e0: 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
07f0: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
0800: 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e 66 69  ic int fts5Confi
0810: 67 50 61 72 73 65 53 70 65 63 69 61 6c 28 0a 20  gParseSpecial(. 
0820: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
0830: 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20  nfig,           
0840: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
0850: 6e 20 6f 62 6a 65 63 74 20 74 6f 20 75 70 64 61  n object to upda
0860: 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  te */.  char *zC
0870: 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  md,             
0880: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69          /* Speci
0890: 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 61  al command to pa
08a0: 72 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  rse */.  char *z
08b0: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
08c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
08d0: 6d 65 6e 74 20 74 6f 20 70 61 72 73 65 20 2a 2f  ment to parse */
08e0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20  .  char **pzErr 
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
0910: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20   message */.){. 
0920: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
0930: 69 63 6d 70 28 7a 43 6d 64 2c 20 22 70 72 65 66  icmp(zCmd, "pref
0940: 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  ix")==0 ){.    c
0950: 68 61 72 20 2a 70 3b 0a 20 20 20 20 69 66 28 20  har *p;.    if( 
0960: 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
0970: 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72   ){.      *pzErr
0980: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
0990: 74 66 28 22 6d 75 6c 74 69 70 6c 65 20 70 72 65  tf("multiple pre
09a0: 66 69 78 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76  fix=... directiv
09b0: 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  es");.      retu
09c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
09d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6e 66  .    }.    pConf
09e0: 69 67 2d 3e 61 50 72 65 66 69 78 20 3d 20 73 71  ig->aPrefix = sq
09f0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
0a00: 65 6f 66 28 69 6e 74 29 20 2a 20 46 54 53 35 5f  eof(int) * FTS5_
0a10: 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58  MAX_PREFIX_INDEX
0a20: 45 53 29 3b 0a 20 20 20 20 70 20 3d 20 7a 41 72  ES);.    p = zAr
0a30: 67 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 5b  g;.    while( p[
0a40: 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
0a50: 6e 50 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  nPre = 0;.      
0a60: 77 68 69 6c 65 28 20 70 5b 30 5d 3d 3d 27 20 27  while( p[0]==' '
0a70: 20 29 20 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68   ) p++;.      wh
0a80: 69 6c 65 28 20 70 5b 30 5d 3e 3d 27 30 27 20 26  ile( p[0]>='0' &
0a90: 26 20 70 5b 30 5d 3c 3d 27 39 27 20 26 26 20 6e  & p[0]<='9' && n
0aa0: 50 72 65 3c 31 30 30 30 20 29 7b 0a 20 20 20 20  Pre<1000 ){.    
0ab0: 20 20 20 20 6e 50 72 65 20 3d 20 6e 50 72 65 2a      nPre = nPre*
0ac0: 31 30 20 2b 20 28 70 5b 30 5d 20 2d 20 27 30 27  10 + (p[0] - '0'
0ad0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a  );.        p++;.
0ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
0af0: 69 6c 65 28 20 70 5b 30 5d 3d 3d 27 20 27 20 29  ile( p[0]==' ' )
0b00: 20 70 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   p++;.      if( 
0b10: 70 5b 30 5d 3d 3d 27 2c 27 20 29 7b 0a 20 20 20  p[0]==',' ){.   
0b20: 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20       p++;.      
0b30: 7d 65 6c 73 65 20 69 66 28 20 70 5b 30 5d 20 29  }else if( p[0] )
0b40: 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
0b50: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
0b60: 74 66 28 22 6d 61 6c 66 6f 72 6d 65 64 20 70 72  tf("malformed pr
0b70: 65 66 69 78 3d 2e 2e 2e 20 64 69 72 65 63 74 69  efix=... directi
0b80: 76 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ve");.        re
0b90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
0ba0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
0bb0: 20 69 66 28 20 6e 50 72 65 3d 3d 30 20 7c 7c 20   if( nPre==0 || 
0bc0: 6e 50 72 65 3e 3d 31 30 30 30 20 29 7b 0a 20 20  nPre>=1000 ){.  
0bd0: 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73        *pzErr = s
0be0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
0bf0: 70 72 65 66 69 78 20 6c 65 6e 67 74 68 20 6f 75  prefix length ou
0c00: 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 64 22 2c  t of range: %d",
0c10: 20 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 20 20   nPre);.        
0c20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
0c30: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
0c40: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65     pConfig->aPre
0c50: 66 69 78 5b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  fix[pConfig->nPr
0c60: 65 66 69 78 5d 20 3d 20 6e 50 72 65 3b 0a 20 20  efix] = nPre;.  
0c70: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72      pConfig->nPr
0c80: 65 66 69 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  efix++;.    }.  
0c90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0ca0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 45 72  OK;.  }..  *pzEr
0cb0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
0cc0: 6e 74 66 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65  ntf("unrecognize
0cd0: 64 20 64 69 72 65 63 74 69 76 65 3a 20 5c 22 25  d directive: \"%
0ce0: 73 5c 22 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 72  s\"", zCmd);.  r
0cf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
0d00: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 70  OR;.}../*.** Dup
0d10: 6c 69 63 61 74 65 20 74 68 65 20 73 74 72 69 6e  licate the strin
0d20: 67 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  g passed as the 
0d30: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 6e  only argument in
0d40: 74 6f 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  to a buffer allo
0d50: 63 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  cated.** by sqli
0d60: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
0d70: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
0d80: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
0d90: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a  encountered..*/.
0da0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 66 74 73  static char *fts
0db0: 35 53 74 72 64 75 70 28 69 6e 74 20 2a 70 52 63  5Strdup(int *pRc
0dc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
0dd0: 7b 0a 20 20 63 68 61 72 20 2a 70 52 65 74 20 3d  {.  char *pRet =
0de0: 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
0df0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
0e00: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f   pRet = sqlite3_
0e10: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 29  mprintf("%s", z)
0e20: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d  ;.    if( pRet==
0e30: 30 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54  0 ) *pRc = SQLIT
0e40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
0e50: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
0e60: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
0e70: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0e80: 20 64 65 66 61 75 6c 74 20 74 6f 6b 65 6e 69 7a   default tokeniz
0e90: 65 72 20 28 22 73 69 6d 70 6c 65 22 29 20 61 74  er ("simple") at
0ea0: 20 0a 2a 2a 20 46 74 73 35 43 6f 6e 66 69 67 2e   .** Fts5Config.
0eb0: 70 54 6f 6b 65 6e 69 7a 65 72 2e 20 52 65 74 75  pTokenizer. Retu
0ec0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
0ed0: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
0ee0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
0ef0: 2a 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  * code if an err
0f00: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
0f10: 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e  atic int fts5Con
0f20: 66 69 67 44 65 66 61 75 6c 74 54 6f 6b 65 6e 69  figDefaultTokeni
0f30: 7a 65 72 28 46 74 73 35 47 6c 6f 62 61 6c 20 2a  zer(Fts5Global *
0f40: 70 47 6c 6f 62 61 6c 2c 20 46 74 73 35 43 6f 6e  pGlobal, Fts5Con
0f50: 66 69 67 20 2a 70 43 6f 6e 66 69 67 29 7b 0a 20  fig *pConfig){. 
0f60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
0f70: 74 73 35 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28  ts5GetTokenizer(
0f80: 0a 20 20 20 20 20 20 70 47 6c 6f 62 61 6c 2c 20  .      pGlobal, 
0f90: 30 2c 20 30 2c 20 26 70 43 6f 6e 66 69 67 2d 3e  0, 0, &pConfig->
0fa0: 70 54 6f 6b 2c 20 26 70 43 6f 6e 66 69 67 2d 3e  pTok, &pConfig->
0fb0: 70 54 6f 6b 41 70 69 0a 20 20 29 3b 0a 7d 0a 0a  pTokApi.  );.}..
0fc0: 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20  /*.** Arguments 
0fd0: 6e 41 72 67 2f 61 7a 41 72 67 20 63 6f 6e 74 61  nArg/azArg conta
0fe0: 69 6e 20 74 68 65 20 73 74 72 69 6e 67 20 61 72  in the string ar
0ff0: 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
1000: 6f 20 74 68 65 20 78 43 72 65 61 74 65 0a 2a 2a  o the xCreate.**
1010: 20 6f 72 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74   or xConnect met
1020: 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
1030: 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  al table. This f
1040: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1050: 20 74 6f 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   to .** allocate
1060: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1070: 46 74 73 35 43 6f 6e 66 69 67 20 63 6f 6e 74 61  Fts5Config conta
1080: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
1090: 73 20 6f 66 20 70 61 72 73 69 6e 67 0a 2a 2a 20  s of parsing.** 
10a0: 74 68 6f 73 65 20 61 72 67 75 6d 65 6e 74 73 2e  those arguments.
10b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
10c0: 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
10d0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
10e0: 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *ppOut is set to
10f0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
1100: 20 6e 65 77 20 46 74 73 35 43 6f 6e 66 69 67 20   new Fts5Config 
1110: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
1120: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
1130: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1140: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1150: 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20  , *ppOut is set 
1160: 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 65  to NULL and an e
1170: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 61 79  rror message may
1180: 20 62 65 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 2a   be left in.** *
1190: 70 7a 45 72 72 2e 20 49 74 20 69 73 20 74 68 65  pzErr. It is the
11a0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
11b0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
11c0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
11d0: 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 65 72   any .** such er
11e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 75 73 69 6e  ror message usin
11f0: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
1200: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1210: 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28  Fts5ConfigParse(
1220: 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  .  Fts5Global *p
1230: 47 6c 6f 62 61 6c 2c 0a 20 20 73 71 6c 69 74 65  Global,.  sqlite
1240: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 6e 41 72  3 *db,.  int nAr
1250: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1260: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1270: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1280: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1290: 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20  **azArg,        
12a0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
12b0: 20 6e 41 72 67 20 43 52 45 41 54 45 20 56 49 52   nArg CREATE VIR
12c0: 54 55 41 4c 20 54 41 42 4c 45 20 61 72 67 73 20  TUAL TABLE args 
12d0: 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
12e0: 2a 2a 70 70 4f 75 74 2c 20 20 20 20 20 20 20 20  **ppOut,        
12f0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73       /* OUT: Res
1300: 75 6c 74 73 20 6f 66 20 70 61 72 73 65 20 2a 2f  ults of parse */
1310: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20  .  char **pzErr 
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
1340: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20   message */.){. 
1350: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1360: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1370: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1380: 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
1390: 2a 70 52 65 74 3b 20 20 20 20 20 20 20 20 20 20  *pRet;          
13a0: 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
13b0: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
13c0: 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74  .  *ppOut = pRet
13d0: 20 3d 20 28 46 74 73 35 43 6f 6e 66 69 67 2a 29   = (Fts5Config*)
13e0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
13f0: 69 7a 65 6f 66 28 46 74 73 35 43 6f 6e 66 69 67  izeof(Fts5Config
1400: 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d  ));.  if( pRet==
1410: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1420: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  E_NOMEM;.  memse
1430: 74 28 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f  t(pRet, 0, sizeo
1440: 66 28 46 74 73 35 43 6f 6e 66 69 67 29 29 3b 0a  f(Fts5Config));.
1450: 20 20 70 52 65 74 2d 3e 64 62 20 3d 20 64 62 3b    pRet->db = db;
1460: 0a 20 20 70 52 65 74 2d 3e 69 43 6f 6f 6b 69 65  .  pRet->iCookie
1470: 20 3d 20 2d 31 3b 0a 0a 20 20 70 52 65 74 2d 3e   = -1;..  pRet->
1480: 61 7a 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29  azCol = (char**)
1490: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
14a0: 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f  cZero(&rc, sizeo
14b0: 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 72 67 29  f(char*) * nArg)
14c0: 3b 0a 20 20 70 52 65 74 2d 3e 7a 44 62 20 3d 20  ;.  pRet->zDb = 
14d0: 66 74 73 35 53 74 72 64 75 70 28 26 72 63 2c 20  fts5Strdup(&rc, 
14e0: 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 70 52 65  azArg[1]);.  pRe
14f0: 74 2d 3e 7a 4e 61 6d 65 20 3d 20 66 74 73 35 53  t->zName = fts5S
1500: 74 72 64 75 70 28 26 72 63 2c 20 61 7a 41 72 67  trdup(&rc, azArg
1510: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  [2]);.  if( rc==
1520: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1530: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1540: 69 63 6d 70 28 70 52 65 74 2d 3e 7a 4e 61 6d 65  icmp(pRet->zName
1550: 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45  , FTS5_RANK_NAME
1560: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  )==0 ){.      *p
1570: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
1580: 70 72 69 6e 74 66 28 22 72 65 73 65 72 76 65 64  printf("reserved
1590: 20 66 74 73 35 20 74 61 62 6c 65 20 6e 61 6d 65   fts5 table name
15a0: 3a 20 25 73 22 2c 20 70 52 65 74 2d 3e 7a 4e 61  : %s", pRet->zNa
15b0: 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  me);.      rc = 
15c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
15e0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
15f0: 69 3d 33 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=3; rc==SQLITE_
1600: 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b  OK && i<nArg; i+
1610: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
1620: 20 2a 7a 44 75 70 20 3d 20 66 74 73 35 53 74 72   *zDup = fts5Str
1630: 64 75 70 28 26 72 63 2c 20 61 7a 41 72 67 5b 69  dup(&rc, azArg[i
1640: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
1650: 7a 44 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20  zDup ){.        
1660: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
1670: 69 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  is is a special 
1680: 64 69 72 65 63 74 69 76 65 20 2d 20 22 63 6d 64  directive - "cmd
1690: 3d 61 72 67 22 20 2a 2f 0a 20 20 20 20 20 20 20  =arg" */.       
16a0: 20 20 20 69 66 28 20 7a 44 75 70 5b 30 5d 21 3d     if( zDup[0]!=
16b0: 27 22 27 20 26 26 20 7a 44 75 70 5b 30 5d 21 3d  '"' && zDup[0]!=
16c0: 27 5c 27 27 20 26 26 20 7a 44 75 70 5b 30 5d 21  '\'' && zDup[0]!
16d0: 3d 27 5b 27 20 26 26 20 7a 44 75 70 5b 30 5d 21  ='[' && zDup[0]!
16e0: 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='`' ){.        
16f0: 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 7a 44      char *p = zD
1700: 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  up;.            
1710: 77 68 69 6c 65 28 20 2a 70 20 26 26 20 2a 70 21  while( *p && *p!
1720: 3d 27 3d 27 20 29 20 70 2b 2b 3b 0a 20 20 20 20  ='=' ) p++;.    
1730: 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 20 29          if( *p )
1740: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1750: 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 26 70 5b  char *zArg = &p[
1760: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
1770: 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20    *p = '\0';.   
1780: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1790: 65 33 46 74 73 35 44 65 71 75 6f 74 65 28 7a 41  e3Fts5Dequote(zA
17a0: 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rg);.           
17b0: 20 20 20 72 63 20 3d 20 66 74 73 35 43 6f 6e 66     rc = fts5Conf
17c0: 69 67 50 61 72 73 65 53 70 65 63 69 61 6c 28 70  igParseSpecial(p
17d0: 52 65 74 2c 20 7a 44 75 70 2c 20 7a 41 72 67 2c  Ret, zDup, zArg,
17e0: 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20   pzErr);.       
17f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1800: 72 65 65 28 7a 44 75 70 29 3b 0a 20 20 20 20 20  ree(zDup);.     
1810: 20 20 20 20 20 20 20 20 20 7a 44 75 70 20 3d 20           zDup = 
1820: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
1830: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
1840: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74          /* If it
1850: 20 69 73 20 6e 6f 74 20 61 20 73 70 65 63 69 61   is not a specia
1860: 6c 20 64 69 72 65 63 74 69 76 65 2c 20 69 74 20  l directive, it 
1870: 6d 75 73 74 20 62 65 20 61 20 63 6f 6c 75 6d 6e  must be a column
1880: 20 6e 61 6d 65 2e 20 49 6e 0a 20 20 20 20 20 20   name. In.      
1890: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
18a0: 65 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  e, check that it
18b0: 20 69 73 20 6e 6f 74 20 74 68 65 20 72 65 73 65   is not the rese
18c0: 72 76 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rved column name
18d0: 20 22 72 61 6e 6b 22 2e 20 2a 2f 0a 20 20 20 20   "rank". */.    
18e0: 20 20 20 20 20 20 69 66 28 20 7a 44 75 70 20 29        if( zDup )
18f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1900: 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f 74 65  lite3Fts5Dequote
1910: 28 7a 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20  (zDup);.        
1920: 20 20 20 20 70 52 65 74 2d 3e 61 7a 43 6f 6c 5b      pRet->azCol[
1930: 70 52 65 74 2d 3e 6e 43 6f 6c 2b 2b 5d 20 3d 20  pRet->nCol++] = 
1940: 7a 44 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20  zDup;.          
1950: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1960: 72 69 63 6d 70 28 7a 44 75 70 2c 20 46 54 53 35  ricmp(zDup, FTS5
1970: 5f 52 41 4e 4b 5f 4e 41 4d 45 29 3d 3d 30 20 29  _RANK_NAME)==0 )
1980: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1990: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
19a0: 5f 6d 70 72 69 6e 74 66 28 22 72 65 73 65 72 76  _mprintf("reserv
19b0: 65 64 20 66 74 73 35 20 63 6f 6c 75 6d 6e 20 6e  ed fts5 column n
19c0: 61 6d 65 3a 20 25 73 22 2c 20 7a 44 75 70 29 3b  ame: %s", zDup);
19d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
19e0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
19f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1a00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
1a30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a40: 70 52 65 74 2d 3e 70 54 6f 6b 3d 3d 30 20 29 7b  pRet->pTok==0 ){
1a50: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 43 6f  .    rc = fts5Co
1a60: 6e 66 69 67 44 65 66 61 75 6c 74 54 6f 6b 65 6e  nfigDefaultToken
1a70: 69 7a 65 72 28 70 47 6c 6f 62 61 6c 2c 20 70 52  izer(pGlobal, pR
1a80: 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  et);.  }..  if( 
1a90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1aa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
1ab0: 43 6f 6e 66 69 67 46 72 65 65 28 70 52 65 74 29  ConfigFree(pRet)
1ac0: 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
1ad0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ae0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
1af0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
1b00: 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  on object passed
1b10: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
1b20: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
1b30: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
1b40: 46 72 65 65 28 46 74 73 35 43 6f 6e 66 69 67 20  Free(Fts5Config 
1b50: 2a 70 43 6f 6e 66 69 67 29 7b 0a 20 20 69 66 28  *pConfig){.  if(
1b60: 20 70 43 6f 6e 66 69 67 20 29 7b 0a 20 20 20 20   pConfig ){.    
1b70: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 70  int i;.    if( p
1b80: 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 20 26 26 20  Config->pTok && 
1b90: 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69  pConfig->pTokApi
1ba0: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
1bb0: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b     pConfig->pTok
1bc0: 41 70 69 2d 3e 78 44 65 6c 65 74 65 28 70 43 6f  Api->xDelete(pCo
1bd0: 6e 66 69 67 2d 3e 70 54 6f 6b 29 3b 0a 20 20 20  nfig->pTok);.   
1be0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1bf0: 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 44 62  ree(pConfig->zDb
1c00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1c10: 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  ree(pConfig->zNa
1c20: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  me);.    for(i=0
1c30: 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  ; i<pConfig->nCo
1c40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
1c50: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e  qlite3_free(pCon
1c60: 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  fig->azCol[i]);.
1c70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1c80: 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e  3_free(pConfig->
1c90: 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 73 71 6c 69  azCol);.    sqli
1ca0: 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67  te3_free(pConfig
1cb0: 2d 3e 61 50 72 65 66 69 78 29 3b 0a 20 20 20 20  ->aPrefix);.    
1cc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
1cd0: 6e 66 69 67 2d 3e 7a 52 61 6e 6b 29 3b 0a 20 20  nfig->zRank);.  
1ce0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1cf0: 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41 72 67  Config->zRankArg
1d00: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
1d10: 66 72 65 65 28 70 43 6f 6e 66 69 67 29 3b 0a 20  free(pConfig);. 
1d20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c   }.}../*.** Call
1d30: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
1d40: 5f 76 74 61 62 28 29 20 62 61 73 65 64 20 6f 6e  _vtab() based on
1d50: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1d60: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
1d70: 6f 6e 0a 2a 2a 20 6f 62 6a 65 63 74 20 70 61 73  on.** object pas
1d80: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
1d90: 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e  argument. Return
1da0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
1db0: 63 63 65 73 73 66 75 6c 2c 20 6f 72 0a 2a 2a 20  ccessful, or.** 
1dc0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1dd0: 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
1de0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20   occurs..*/.int 
1df0: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
1e00: 67 44 65 63 6c 61 72 65 56 74 61 62 28 46 74 73  gDeclareVtab(Fts
1e10: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1e20: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
1e30: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t rc;.  char *zS
1e40: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 6c 64  ql;.  char *zOld
1e50: 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 28 63 68 61  ;..  zSql = (cha
1e60: 72 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  r*)sqlite3_mprin
1e70: 74 66 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  tf("CREATE TABLE
1e80: 20 78 28 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30   x(");.  for(i=0
1e90: 3b 20 7a 53 71 6c 20 26 26 20 69 3c 70 43 6f 6e  ; zSql && i<pCon
1ea0: 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  fig->nCol; i++){
1eb0: 0a 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 53 71 6c  .    zOld = zSql
1ec0: 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
1ed0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1ee0: 25 73 25 51 22 2c 20 7a 4f 6c 64 2c 20 28 69 3d  %s%Q", zOld, (i=
1ef0: 3d 30 3f 22 22 3a 22 2c 20 22 29 2c 20 70 43 6f  =0?"":", "), pCo
1f00: 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 3b  nfig->azCol[i]);
1f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1f20: 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  e(zOld);.  }..  
1f30: 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20  if( zSql ){.    
1f40: 7a 4f 6c 64 20 3d 20 7a 53 71 6c 3b 0a 20 20 20  zOld = zSql;.   
1f50: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1f60: 6d 70 72 69 6e 74 66 28 22 25 73 2c 20 25 51 20  mprintf("%s, %Q 
1f70: 48 49 44 44 45 4e 2c 20 25 73 20 48 49 44 44 45  HIDDEN, %s HIDDE
1f80: 4e 29 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 4f  N)", .        zO
1f90: 6c 64 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  ld, pConfig->zNa
1fa0: 6d 65 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41  me, FTS5_RANK_NA
1fb0: 4d 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  ME.    );.    sq
1fc0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29  lite3_free(zOld)
1fd0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 53 71  ;.  }..  if( zSq
1fe0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
1ff0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2000: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2010: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
2020: 5f 76 74 61 62 28 70 43 6f 6e 66 69 67 2d 3e 64  _vtab(pConfig->d
2030: 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71  b, zSql);.    sq
2040: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2050: 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72  ;.  }.  .  retur
2060: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2070: 6f 6b 65 6e 69 7a 65 20 74 68 65 20 74 65 78 74  okenize the text
2080: 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
2090: 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
20a0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a   arguments..**.*
20b0: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 69  * The callback i
20c0: 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
20d0: 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e  or each token in
20e0: 20 74 68 65 20 69 6e 70 75 74 20 74 65 78 74 2e   the input text.
20f0: 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   The.** argument
2100: 73 20 70 61 73 73 65 64 20 74 6f 20 69 74 20 61  s passed to it a
2110: 72 65 2c 20 69 6e 20 6f 72 64 65 72 3a 0a 2a 2a  re, in order:.**
2120: 0a 2a 2a 20 20 20 20 20 76 6f 69 64 20 2a 70 43  .**     void *pC
2130: 74 78 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43  tx          // C
2140: 6f 70 79 20 6f 66 20 34 74 68 20 61 72 67 75 6d  opy of 4th argum
2150: 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 46 74  ent to sqlite3Ft
2160: 73 35 54 6f 6b 65 6e 69 7a 65 28 29 0a 2a 2a 20  s5Tokenize().** 
2170: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2180: 70 54 6f 6b 65 6e 20 20 2f 2f 20 50 6f 69 6e 74  pToken  // Point
2190: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
21a0: 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 0a 2a 2a  taining token.**
21b0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20       int nToken 
21c0: 20 20 20 20 20 20 20 20 20 2f 2f 20 53 69 7a 65           // Size
21d0: 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79 74   of token in byt
21e0: 65 73 0a 2a 2a 20 20 20 20 20 69 6e 74 20 69 53  es.**     int iS
21f0: 74 61 72 74 20 20 20 20 20 20 20 20 20 20 2f 2f  tart          //
2200: 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20   Byte offset of 
2210: 73 74 61 72 74 20 6f 66 20 74 6f 6b 65 6e 20 77  start of token w
2220: 69 74 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74  ithin input text
2230: 0a 2a 2a 20 20 20 20 20 69 6e 74 20 69 45 6e 64  .**     int iEnd
2240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 42              // B
2250: 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 65 6e  yte offset of en
2260: 64 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  d of token withi
2270: 6e 20 69 6e 70 75 74 20 74 65 78 74 0a 2a 2a 20  n input text.** 
2280: 20 20 20 20 69 6e 74 20 69 50 6f 73 20 20 20 20      int iPos    
2290: 20 20 20 20 20 20 20 20 2f 2f 20 50 6f 73 69 74          // Posit
22a0: 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20  ion of token in 
22b0: 69 6e 70 75 74 20 28 66 69 72 73 74 20 74 6f 6b  input (first tok
22c0: 65 6e 20 69 73 20 30 29 0a 2a 2a 0a 2a 2a 20 49  en is 0).**.** I
22d0: 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  f the callback r
22e0: 65 74 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72  eturns a non-zer
22f0: 6f 20 76 61 6c 75 65 20 74 68 65 20 74 6f 6b 65  o value the toke
2300: 6e 69 7a 61 74 69 6f 6e 20 69 73 20 61 62 61 6e  nization is aban
2310: 64 6f 6e 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  doned.** and no 
2320: 66 75 72 74 68 65 72 20 63 61 6c 6c 62 61 63 6b  further callback
2330: 73 20 61 72 65 20 69 73 73 75 65 64 2e 20 0a 2a  s are issued. .*
2340: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2350: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2360: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2370: 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  ul or an SQLite 
2380: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 66  error code.** if
2390: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
23a0: 2e 20 49 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a  . If the tokeniz
23b0: 61 74 69 6f 6e 20 77 61 73 20 61 62 61 6e 64 6f  ation was abando
23c0: 6e 65 64 20 65 61 72 6c 79 20 62 65 63 61 75 73  ned early becaus
23d0: 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 62 61 63  e.** the callbac
23e0: 6b 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  k returned SQLIT
23f0: 45 5f 44 4f 4e 45 2c 20 74 68 69 73 20 69 73 20  E_DONE, this is 
2400: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  not an error and
2410: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
2420: 2a 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 73 20  * still returns 
2430: 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69  SQLITE_OK. Or, i
2440: 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69  f the tokenizati
2450: 6f 6e 20 77 61 73 20 61 62 61 6e 64 6f 6e 65 64  on was abandoned
2460: 20 65 61 72 6c 79 0a 2a 2a 20 62 65 63 61 75 73   early.** becaus
2470: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  e the callback r
2480: 65 74 75 72 6e 65 64 20 61 6e 6f 74 68 65 72 20  eturned another 
2490: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
24a0: 69 74 20 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a  it is assumed.**
24b0: 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 69 74 65   to be an SQLite
24c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
24d0: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
24e0: 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
24f0: 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69  qlite3Fts5Tokeni
2500: 7a 65 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  ze(.  Fts5Config
2510: 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20   *pConfig,      
2520: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43 6f        /* FTS5 Co
2530: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
2540: 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2550: 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e  ar *pText, int n
2560: 54 65 78 74 2c 20 20 20 2f 2a 20 54 65 78 74 20  Text,   /* Text 
2570: 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 20  to tokenize */. 
2580: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61 73 73   /* Context pass
25b0: 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20 2a  ed to xToken() *
25c0: 2f 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e  /.  int (*xToken
25d0: 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 63  )(void*, const c
25e0: 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  har*, int, int, 
25f0: 69 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f 2a 20  int, int)    /* 
2600: 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  Callback */.){. 
2610: 20 72 65 74 75 72 6e 20 70 43 6f 6e 66 69 67 2d   return pConfig-
2620: 3e 70 54 6f 6b 41 70 69 2d 3e 78 54 6f 6b 65 6e  >pTokApi->xToken
2630: 69 7a 65 28 70 43 6f 6e 66 69 67 2d 3e 70 54 6f  ize(pConfig->pTo
2640: 6b 2c 20 70 43 74 78 2c 20 70 54 65 78 74 2c 20  k, pCtx, pText, 
2650: 6e 54 65 78 74 2c 20 78 54 6f 6b 65 6e 29 3b 0a  nText, xToken);.
2660: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
2670: 74 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f 20  t pIn points to 
2680: 61 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74  a character that
2690: 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e 75   is part of a nu
26a0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0a 2a 2a  l-terminated .**
26b0: 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20   string. Return 
26c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
26d0: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
26e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 49 6e 20   following *pIn 
26f0: 69 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e  in .** the strin
2700: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  g that is not a 
2710: 77 68 69 74 65 2d 73 70 61 63 65 20 63 68 61 72  white-space char
2720: 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
2730: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 74 73   const char *fts
2740: 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65  5ConfigSkipWhite
2750: 73 70 61 63 65 28 63 6f 6e 73 74 20 63 68 61 72  space(const char
2760: 20 2a 70 49 6e 29 7b 0a 20 20 63 6f 6e 73 74 20   *pIn){.  const 
2770: 63 68 61 72 20 2a 70 20 3d 20 70 49 6e 3b 0a 20  char *p = pIn;. 
2780: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77 68   if( p ){.    wh
2790: 69 6c 65 28 20 2a 70 3d 3d 27 20 27 20 29 7b 20  ile( *p==' ' ){ 
27a0: 70 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  p++; }.  }.  ret
27b0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
27c0: 41 72 67 75 6d 65 6e 74 20 70 49 6e 20 70 6f 69  Argument pIn poi
27d0: 6e 74 73 20 74 6f 20 61 20 63 68 61 72 61 63 74  nts to a charact
27e0: 65 72 20 74 68 61 74 20 69 73 20 70 61 72 74 20  er that is part 
27f0: 6f 66 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  of a nul-termina
2800: 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e 67 2e 20  ted .** string. 
2810: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2820: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68   to the first ch
2830: 61 72 61 63 74 65 72 20 66 6f 6c 6c 6f 77 69 6e  aracter followin
2840: 67 20 2a 70 49 6e 20 69 6e 20 0a 2a 2a 20 74 68  g *pIn in .** th
2850: 65 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  e string that is
2860: 20 6e 6f 74 20 61 20 22 62 61 72 65 77 6f 72 64   not a "bareword
2870: 22 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a  " character..*/.
2880: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2890: 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69  r *fts5ConfigSki
28a0: 70 42 61 72 65 77 6f 72 64 28 63 6f 6e 73 74 20  pBareword(const 
28b0: 63 68 61 72 20 2a 70 49 6e 29 7b 0a 20 20 63 6f  char *pIn){.  co
28c0: 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 70 49  nst char *p = pI
28d0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 20 20  n;.  while( *p  
28e0: 20 20 20 20 26 26 20 2a 70 21 3d 27 20 27 20 26      && *p!=' ' &
28f0: 26 20 2a 70 21 3d 27 3a 27 20 26 26 20 2a 70 21  & *p!=':' && *p!
2900: 3d 27 21 27 20 26 26 20 2a 70 21 3d 27 40 27 20  ='!' && *p!='@' 
2910: 0a 20 20 20 20 20 20 26 26 20 2a 70 21 3d 27 23  .      && *p!='#
2920: 27 20 26 26 20 2a 70 21 3d 27 24 27 20 26 26 20  ' && *p!='$' && 
2930: 2a 70 21 3d 27 25 27 20 26 26 20 2a 70 21 3d 27  *p!='%' && *p!='
2940: 5e 27 20 26 26 20 2a 70 21 3d 27 26 27 20 0a 20  ^' && *p!='&' . 
2950: 20 20 20 20 20 26 26 20 2a 70 21 3d 27 2a 27 20       && *p!='*' 
2960: 26 26 20 2a 70 21 3d 27 28 27 20 26 26 20 2a 70  && *p!='(' && *p
2970: 21 3d 27 29 27 20 0a 20 20 29 7b 0a 20 20 20 20  !=')' .  ){.    
2980: 70 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  p++;.  }.  if( p
2990: 3d 3d 70 49 6e 20 29 20 70 20 3d 20 30 3b 0a 20  ==pIn ) p = 0;. 
29a0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 73 74   return p;.}..st
29b0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 5f 69 73  atic int fts5_is
29c0: 64 69 67 69 74 28 63 68 61 72 20 61 29 7b 0a 20  digit(char a){. 
29d0: 20 72 65 74 75 72 6e 20 28 61 3e 3d 27 30 27 20   return (a>='0' 
29e0: 26 26 20 61 3c 3d 27 39 27 29 3b 0a 7d 0a 0a 0a  && a<='9');.}...
29f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2a00: 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b  ar *fts5ConfigSk
2a10: 69 70 4c 69 74 65 72 61 6c 28 63 6f 6e 73 74 20  ipLiteral(const 
2a20: 63 68 61 72 20 2a 70 49 6e 29 7b 0a 20 20 63 6f  char *pIn){.  co
2a30: 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 70 49  nst char *p = pI
2a40: 6e 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  n;.  if( p ){.  
2a50: 20 20 73 77 69 74 63 68 28 20 2a 70 20 29 7b 0a    switch( *p ){.
2a60: 20 20 20 20 20 20 63 61 73 65 20 27 6e 27 3a 20        case 'n': 
2a70: 63 61 73 65 20 27 4e 27 3a 0a 20 20 20 20 20 20  case 'N':.      
2a80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2a90: 72 6e 69 63 6d 70 28 22 6e 75 6c 6c 22 2c 20 70  rnicmp("null", p
2aa0: 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
2ab0: 20 20 20 20 20 70 20 3d 20 26 70 5b 34 5d 3b 0a       p = &p[4];.
2ac0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ad0: 20 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b 0a           p = 0;.
2ae0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2af0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2b00: 20 0a 20 20 20 20 20 20 63 61 73 65 20 27 78 27   .      case 'x'
2b10: 3a 20 63 61 73 65 20 27 58 27 3a 0a 20 20 20 20  : case 'X':.    
2b20: 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20      p++;.       
2b30: 20 69 66 28 20 2a 70 3d 3d 27 5c 27 27 20 29 7b   if( *p=='\'' ){
2b40: 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a  .          p++;.
2b50: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2b60: 20 28 2a 70 3e 3d 27 61 27 20 26 26 20 2a 70 3c   (*p>='a' && *p<
2b70: 3d 27 66 27 29 20 0a 20 20 20 20 20 20 20 20 20  ='f') .         
2b80: 20 20 20 20 20 7c 7c 20 28 2a 70 3e 3d 27 41 27       || (*p>='A'
2b90: 20 26 26 20 2a 70 3c 3d 27 46 27 29 20 0a 20 20   && *p<='F') .  
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2bb0: 2a 70 3e 3d 27 30 27 20 26 26 20 2a 70 3c 3d 27  *p>='0' && *p<='
2bc0: 39 27 29 20 0a 20 20 20 20 20 20 20 20 20 20 29  9') .          )
2bd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2b  {.            p+
2be0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2bf0: 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d           if( *p=
2c00: 3d 27 5c 27 27 20 26 26 20 30 3d 3d 28 28 70 2d  ='\'' && 0==((p-
2c10: 70 49 6e 29 25 32 29 20 29 7b 0a 20 20 20 20 20  pIn)%2) ){.     
2c20: 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20         p++;.    
2c30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c40: 20 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b 0a           p = 0;.
2c50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c70: 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
2c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
2c90: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
2ca0: 20 27 5c 27 27 3a 0a 20 20 20 20 20 20 20 20 70   '\'':.        p
2cb0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ++;.        whil
2cc0: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
2cd0: 20 20 69 66 28 20 2a 70 3d 3d 27 5c 27 27 20 29    if( *p=='\'' )
2ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2b  {.            p+
2cf0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  +;.            i
2d00: 66 28 20 2a 70 21 3d 27 5c 27 27 20 29 20 62 72  f( *p!='\'' ) br
2d10: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2d20: 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a  .          p++;.
2d30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70            if( *p
2d40: 3d 3d 30 20 29 20 70 20 3d 20 30 3b 0a 20 20 20  ==0 ) p = 0;.   
2d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
2d60: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66  reak;..      def
2d70: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 2f 2a  ault:.        /*
2d80: 20 6d 61 79 62 65 20 61 20 6e 75 6d 62 65 72 20   maybe a number 
2d90: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  */.        if( *
2da0: 70 3d 3d 27 2b 27 20 7c 7c 20 2a 70 3d 3d 27 2d  p=='+' || *p=='-
2db0: 27 20 29 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) p++;.       
2dc0: 20 77 68 69 6c 65 28 20 66 74 73 35 5f 69 73 64   while( fts5_isd
2dd0: 69 67 69 74 28 2a 70 29 20 29 20 70 2b 2b 3b 0a  igit(*p) ) p++;.
2de0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
2df0: 68 69 73 20 70 6f 69 6e 74 2c 20 69 66 20 74 68  his point, if th
2e00: 65 20 6c 69 74 65 72 61 6c 20 77 61 73 20 61 6e  e literal was an
2e10: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 70 61   integer, the pa
2e20: 72 73 65 20 69 73 20 0a 20 20 20 20 20 20 20 20  rse is .        
2e30: 2a 2a 20 66 69 6e 69 73 68 65 64 2e 20 4f 72 2c  ** finished. Or,
2e40: 20 69 66 20 69 74 20 69 73 20 61 20 66 6c 6f 61   if it is a floa
2e50: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
2e60: 2c 20 69 74 20 6d 61 79 20 63 6f 6e 74 69 6e 75  , it may continu
2e70: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  e.        ** wit
2e80: 68 20 65 69 74 68 65 72 20 61 20 64 65 63 69 6d  h either a decim
2e90: 61 6c 20 70 6f 69 6e 74 20 6f 72 20 61 6e 20 27  al point or an '
2ea0: 45 27 20 63 68 61 72 61 63 74 65 72 2e 20 2a 2f  E' character. */
2eb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d  .        if( *p=
2ec0: 3d 27 2e 27 20 26 26 20 66 74 73 35 5f 69 73 64  ='.' && fts5_isd
2ed0: 69 67 69 74 28 70 5b 31 5d 29 20 29 7b 0a 20 20  igit(p[1]) ){.  
2ee0: 20 20 20 20 20 20 20 20 70 20 2b 3d 20 32 3b 0a          p += 2;.
2ef0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2f00: 20 66 74 73 35 5f 69 73 64 69 67 69 74 28 2a 70   fts5_isdigit(*p
2f10: 29 20 29 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20  ) ) p++;.       
2f20: 20 7d 0a 0a 20 20 20 20 20 20 20 20 62 72 65 61   }..        brea
2f30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
2f40: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2f50: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 6e 20  ** Argument pIn 
2f60: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
2f70: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  rst character in
2f80: 20 77 68 61 74 20 69 73 20 65 78 70 65 63 74 65   what is expecte
2f90: 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 63 6f 6d  d to be.** a com
2fa0: 6d 61 2d 73 65 70 61 72 61 74 65 64 20 6c 69 73  ma-separated lis
2fb0: 74 20 6f 66 20 53 51 4c 20 6c 69 74 65 72 61 6c  t of SQL literal
2fc0: 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  s followed by a 
2fd0: 27 29 27 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  ')' character..*
2fe0: 2a 20 49 66 20 69 74 20 61 63 74 75 61 6c 6c 79  * If it actually
2ff0: 20 69 73 20 74 68 69 73 2c 20 72 65 74 75 72 6e   is this, return
3000: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3010: 65 20 27 29 27 2e 20 4f 74 68 65 72 77 69 73 65  e ')'. Otherwise
3020: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c  , return.** NULL
3030: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 61 20 70   to indicate a p
3040: 61 72 73 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  arse error..*/.s
3050: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3060: 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70   *fts5ConfigSkip
3070: 41 72 67 73 28 63 6f 6e 73 74 20 63 68 61 72 20  Args(const char 
3080: 2a 70 49 6e 29 7b 0a 20 20 63 6f 6e 73 74 20 63  *pIn){.  const c
3090: 68 61 72 20 2a 70 20 3d 20 70 49 6e 3b 0a 20 20  har *p = pIn;.  
30a0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
30b0: 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69     p = fts5Confi
30c0: 67 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28  gSkipWhitespace(
30d0: 70 29 3b 0a 20 20 20 20 70 20 3d 20 66 74 73 35  p);.    p = fts5
30e0: 43 6f 6e 66 69 67 53 6b 69 70 4c 69 74 65 72 61  ConfigSkipLitera
30f0: 6c 28 70 29 3b 0a 20 20 20 20 70 20 3d 20 66 74  l(p);.    p = ft
3100: 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74  s5ConfigSkipWhit
3110: 65 73 70 61 63 65 28 70 29 3b 0a 20 20 20 20 69  espace(p);.    i
3120: 66 28 20 70 3d 3d 30 20 7c 7c 20 2a 70 3d 3d 27  f( p==0 || *p=='
3130: 29 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  )' ) break;.    
3140: 69 66 28 20 2a 70 21 3d 27 2c 27 20 29 7b 0a 20  if( *p!=',' ){. 
3150: 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
3160: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3170: 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72     p++;.  }..  r
3180: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
3190: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 49 6e 20  * Parameter zIn 
31a0: 63 6f 6e 74 61 69 6e 73 20 61 20 72 61 6e 6b 28  contains a rank(
31b0: 29 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69  ) function speci
31c0: 66 69 63 61 74 69 6f 6e 2e 20 54 68 65 20 66 6f  fication. The fo
31d0: 72 6d 61 74 20 6f 66 20 0a 2a 2a 20 74 68 69 73  rmat of .** this
31e0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 42   is:.**.**   + B
31f0: 61 72 65 77 6f 72 64 20 28 66 75 6e 63 74 69 6f  areword (functio
3200: 6e 20 6e 61 6d 65 29 0a 2a 2a 20 20 20 2b 20 4f  n name).**   + O
3210: 70 65 6e 20 70 61 72 65 6e 74 68 65 73 69 73 20  pen parenthesis 
3220: 2d 20 22 28 22 0a 2a 2a 20 20 20 2b 20 5a 65 72  - "(".**   + Zer
3230: 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20 6c 69  o or more SQL li
3240: 74 65 72 61 6c 73 20 69 6e 20 61 20 63 6f 6d 6d  terals in a comm
3250: 61 20 73 65 70 61 72 61 74 65 64 20 6c 69 73 74  a separated list
3260: 0a 2a 2a 20 20 20 2b 20 43 6c 6f 73 65 20 70 61  .**   + Close pa
3270: 72 65 6e 74 68 65 73 69 73 20 2d 20 22 29 22 0a  renthesis - ")".
3280: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
3290: 73 35 43 6f 6e 66 69 67 50 61 72 73 65 52 61 6e  s5ConfigParseRan
32a0: 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  k(.  const char 
32b0: 2a 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *zIn,           
32c0: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74       /* Input st
32d0: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
32e0: 2a 70 7a 52 61 6e 6b 2c 20 20 20 20 20 20 20 20  *pzRank,        
32f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3300: 3a 20 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20  : Rank function 
3310: 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  name */.  char *
3320: 2a 70 7a 52 61 6e 6b 41 72 67 73 20 20 20 20 20  *pzRankArgs     
3330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3340: 3a 20 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20  : Rank function 
3350: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
3360: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20    const char *p 
3370: 3d 20 7a 49 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  = zIn;.  const c
3380: 68 61 72 20 2a 70 52 61 6e 6b 3b 0a 20 20 63 68  har *pRank;.  ch
3390: 61 72 20 2a 7a 52 61 6e 6b 20 3d 20 30 3b 0a 20  ar *zRank = 0;. 
33a0: 20 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73   char *zRankArgs
33b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
33c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2a   SQLITE_OK;..  *
33d0: 70 7a 52 61 6e 6b 20 3d 20 30 3b 0a 20 20 2a 70  pzRank = 0;.  *p
33e0: 7a 52 61 6e 6b 41 72 67 73 20 3d 20 30 3b 0a 0a  zRankArgs = 0;..
33f0: 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67    p = fts5Config
3400: 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70  SkipWhitespace(p
3410: 29 3b 0a 20 20 70 52 61 6e 6b 20 3d 20 70 3b 0a  );.  pRank = p;.
3420: 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67    p = fts5Config
3430: 53 6b 69 70 42 61 72 65 77 6f 72 64 28 70 29 3b  SkipBareword(p);
3440: 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
3450: 20 7a 52 61 6e 6b 20 3d 20 73 71 6c 69 74 65 33   zRank = sqlite3
3460: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
3470: 72 63 2c 20 31 20 2b 20 70 20 2d 20 70 52 61 6e  rc, 1 + p - pRan
3480: 6b 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 61 6e  k);.    if( zRan
3490: 6b 20 29 20 6d 65 6d 63 70 79 28 7a 52 61 6e 6b  k ) memcpy(zRank
34a0: 2c 20 70 52 61 6e 6b 2c 20 70 2d 70 52 61 6e 6b  , pRank, p-pRank
34b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
34c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
34d0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  R;.  }..  if( rc
34e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34f0: 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69     p = fts5Confi
3500: 67 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28  gSkipWhitespace(
3510: 70 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 21 3d  p);.    if( *p!=
3520: 27 28 27 20 29 20 72 63 20 3d 20 53 51 4c 49 54  '(' ) rc = SQLIT
3530: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 2b 2b  E_ERROR;.    p++
3540: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
3550: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 41 72   const char *pAr
3570: 67 73 3b 20 0a 20 20 20 20 70 20 3d 20 66 74 73  gs; .    p = fts
3580: 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65  5ConfigSkipWhite
3590: 73 70 61 63 65 28 70 29 3b 0a 20 20 20 20 70 41  space(p);.    pA
35a0: 72 67 73 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d  rgs = p;.    p =
35b0: 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 41   fts5ConfigSkipA
35c0: 72 67 73 28 70 29 3b 0a 20 20 20 20 69 66 28 20  rgs(p);.    if( 
35d0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  p==0 ){.      rc
35e0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
35f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
3600: 21 3d 70 41 72 67 73 20 29 7b 0a 20 20 20 20 20  !=pArgs ){.     
3610: 20 7a 52 61 6e 6b 41 72 67 73 20 3d 20 73 71 6c   zRankArgs = sql
3620: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
3630: 72 6f 28 26 72 63 2c 20 31 20 2b 20 70 20 2d 20  ro(&rc, 1 + p - 
3640: 70 41 72 67 73 29 3b 0a 20 20 20 20 20 20 69 66  pArgs);.      if
3650: 28 20 7a 52 61 6e 6b 41 72 67 73 20 29 20 6d 65  ( zRankArgs ) me
3660: 6d 63 70 79 28 7a 52 61 6e 6b 41 72 67 73 2c 20  mcpy(zRankArgs, 
3670: 70 41 72 67 73 2c 20 70 2d 70 41 72 67 73 29 3b  pArgs, p-pArgs);
3680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
3690: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
36b0: 72 65 65 28 7a 52 61 6e 6b 29 3b 0a 20 20 20 20  ree(zRank);.    
36c0: 61 73 73 65 72 74 28 20 7a 52 61 6e 6b 41 72 67  assert( zRankArg
36d0: 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
36e0: 0a 20 20 20 20 2a 70 7a 52 61 6e 6b 20 3d 20 7a  .    *pzRank = z
36f0: 52 61 6e 6b 3b 0a 20 20 20 20 2a 70 7a 52 61 6e  Rank;.    *pzRan
3700: 6b 41 72 67 73 20 3d 20 7a 52 61 6e 6b 41 72 67  kArgs = zRankArg
3710: 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  s;.  }.  return 
3720: 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
3730: 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74 56  e3Fts5ConfigSetV
3740: 61 6c 75 65 28 0a 20 20 46 74 73 35 43 6f 6e 66  alue(.  Fts5Conf
3750: 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
3760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
3770: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
3780: 75 65 20 2a 70 56 61 6c 2c 0a 20 20 69 6e 74 20  ue *pVal,.  int 
3790: 2a 70 62 42 61 64 6b 65 79 0a 29 7b 0a 20 20 69  *pbBadkey.){.  i
37a0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37b0: 4b 3b 0a 20 20 69 66 28 20 20 20 20 20 20 30 3d  K;.  if(      0=
37c0: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
37d0: 28 7a 4b 65 79 2c 20 22 63 6f 6f 6b 69 65 22 29  (zKey, "cookie")
37e0: 20 29 7b 0a 20 20 20 20 70 43 6f 6e 66 69 67 2d   ){.    pConfig-
37f0: 3e 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74  >iCookie = sqlit
3800: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61  e3_value_int(pVa
3810: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 65 6c 73 65 20  l);.  }..  else 
3820: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
3830: 74 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22 70 67  tricmp(zKey, "pg
3840: 73 7a 22 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  sz") ){.    int 
3850: 70 67 73 7a 20 3d 20 30 3b 0a 20 20 20 20 69 66  pgsz = 0;.    if
3860: 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ( SQLITE_INTEGER
3870: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
3880: 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56 61  numeric_type(pVa
3890: 6c 29 20 29 7b 0a 20 20 20 20 20 20 70 67 73 7a  l) ){.      pgsz
38a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
38b0: 5f 69 6e 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  _int(pVal);.    
38c0: 7d 0a 20 20 20 20 69 66 28 20 70 67 73 7a 3c 3d  }.    if( pgsz<=
38d0: 30 20 7c 7c 20 70 67 73 7a 3e 46 54 53 35 5f 4d  0 || pgsz>FTS5_M
38e0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  AX_PAGE_SIZE ){.
38f0: 20 20 20 20 20 20 69 66 28 20 70 62 42 61 64 6b        if( pbBadk
3900: 65 79 20 29 20 2a 70 62 42 61 64 6b 65 79 20 3d  ey ) *pbBadkey =
3910: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
3920: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70 67       pConfig->pg
3930: 73 7a 20 3d 20 70 67 73 7a 3b 0a 20 20 20 20 7d  sz = pgsz;.    }
3940: 0a 20 20 7d 0a 0a 20 20 65 6c 73 65 20 69 66 28  .  }..  else if(
3950: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
3960: 63 6d 70 28 7a 4b 65 79 2c 20 22 61 75 74 6f 6d  cmp(zKey, "autom
3970: 65 72 67 65 22 29 20 29 7b 0a 20 20 20 20 69 6e  erge") ){.    in
3980: 74 20 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 2d  t nAutomerge = -
3990: 31 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  1;.    if( SQLIT
39a0: 45 5f 49 4e 54 45 47 45 52 3d 3d 73 71 6c 69 74  E_INTEGER==sqlit
39b0: 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63  e3_value_numeric
39c0: 5f 74 79 70 65 28 70 56 61 6c 29 20 29 7b 0a 20  _type(pVal) ){. 
39d0: 20 20 20 20 20 6e 41 75 74 6f 6d 65 72 67 65 20       nAutomerge 
39e0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
39f0: 69 6e 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  int(pVal);.    }
3a00: 0a 20 20 20 20 69 66 28 20 6e 41 75 74 6f 6d 65  .    if( nAutome
3a10: 72 67 65 3c 30 20 7c 7c 20 6e 41 75 74 6f 6d 65  rge<0 || nAutome
3a20: 72 67 65 3e 36 34 20 29 7b 0a 20 20 20 20 20 20  rge>64 ){.      
3a30: 69 66 28 20 70 62 42 61 64 6b 65 79 20 29 20 2a  if( pbBadkey ) *
3a40: 70 62 42 61 64 6b 65 79 20 3d 20 31 3b 0a 20 20  pbBadkey = 1;.  
3a50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
3a60: 66 28 20 6e 41 75 74 6f 6d 65 72 67 65 3d 3d 31  f( nAutomerge==1
3a70: 20 29 20 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20   ) nAutomerge = 
3a80: 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 41 55 54  FTS5_DEFAULT_AUT
3a90: 4f 4d 45 52 47 45 3b 0a 20 20 20 20 20 20 70 43  OMERGE;.      pC
3aa0: 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
3ab0: 65 20 3d 20 6e 41 75 74 6f 6d 65 72 67 65 3b 0a  e = nAutomerge;.
3ac0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 6c 73      }.  }..  els
3ad0: 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
3ae0: 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22  _stricmp(zKey, "
3af0: 72 61 6e 6b 22 29 20 29 7b 0a 20 20 20 20 63 6f  rank") ){.    co
3b00: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20  nst char *zIn = 
3b10: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
3b20: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
3b30: 70 56 61 6c 29 3b 0a 20 20 20 20 63 68 61 72 20  pVal);.    char 
3b40: 2a 7a 52 61 6e 6b 3b 0a 20 20 20 20 63 68 61 72  *zRank;.    char
3b50: 20 2a 7a 52 61 6e 6b 41 72 67 73 3b 0a 20 20 20   *zRankArgs;.   
3b60: 20 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67   rc = fts5Config
3b70: 50 61 72 73 65 52 61 6e 6b 28 7a 49 6e 2c 20 26  ParseRank(zIn, &
3b80: 7a 52 61 6e 6b 2c 20 26 7a 52 61 6e 6b 41 72 67  zRank, &zRankArg
3b90: 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  s);.    if( rc==
3ba0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3bb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3bc0: 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 29 3b  pConfig->zRank);
3bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
3be0: 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61  ree(pConfig->zRa
3bf0: 6e 6b 41 72 67 73 29 3b 0a 20 20 20 20 20 20 70  nkArgs);.      p
3c00: 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 20 3d 20  Config->zRank = 
3c10: 7a 52 61 6e 6b 3b 0a 20 20 20 20 20 20 70 43 6f  zRank;.      pCo
3c20: 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 20  nfig->zRankArgs 
3c30: 3d 20 7a 52 61 6e 6b 41 72 67 73 3b 0a 20 20 20  = zRankArgs;.   
3c40: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
3c50: 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20  QLITE_ERROR ){. 
3c60: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3c70: 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  _OK;.      if( p
3c80: 62 42 61 64 6b 65 79 20 29 20 2a 70 62 42 61 64  bBadkey ) *pbBad
3c90: 6b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  key = 1;.    }. 
3ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3cb0: 70 62 42 61 64 6b 65 79 20 29 20 2a 70 62 42 61  pbBadkey ) *pbBa
3cc0: 64 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  dkey = 1;.  }.  
3cd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3ce0: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e  .** Load the con
3cf0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63  tents of the %_c
3d00: 6f 6e 66 69 67 20 74 61 62 6c 65 20 69 6e 74 6f  onfig table into
3d10: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20   memory..*/.int 
3d20: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
3d30: 67 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66 69 67  gLoad(Fts5Config
3d40: 20 2a 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20 69   *pConfig, int i
3d50: 43 6f 6f 6b 69 65 29 7b 0a 20 20 63 6f 6e 73 74  Cookie){.  const
3d60: 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 20 3d   char *zSelect =
3d70: 20 22 53 45 4c 45 43 54 20 6b 2c 20 76 20 46 52   "SELECT k, v FR
3d80: 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 66 69 67  OM %Q.'%q_config
3d90: 27 22 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  '";.  char *zSql
3da0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
3db0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   *p = 0;.  int r
3dc0: 63 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 64 65 66  c;..  /* Set def
3dd0: 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  ault values */. 
3de0: 20 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 3d   pConfig->pgsz =
3df0: 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 50 41   FTS5_DEFAULT_PA
3e00: 47 45 5f 53 49 5a 45 3b 0a 20 20 70 43 6f 6e 66  GE_SIZE;.  pConf
3e10: 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 3d  ig->nAutomerge =
3e20: 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 41 55   FTS5_DEFAULT_AU
3e30: 54 4f 4d 45 52 47 45 3b 0a 0a 20 20 7a 53 71 6c  TOMERGE;..  zSql
3e40: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
3e50: 74 66 28 7a 53 65 6c 65 63 74 2c 20 70 43 6f 6e  tf(zSelect, pCon
3e60: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
3e70: 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  g->zName);.  if(
3e80: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
3e90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
3ea0: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
3eb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
3ec0: 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d  pare_v2(pConfig-
3ed0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
3ee0: 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
3ef0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
3f00: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63   }..  assert( rc
3f10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
3f20: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ==0 );.  if( rc=
3f30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3f40: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
3f50: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
3f60: 70 28 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  p(p) ){.      co
3f70: 6e 73 74 20 63 68 61 72 20 2a 7a 4b 20 3d 20 28  nst char *zK = (
3f80: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
3f90: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
3fa0: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
3fb0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
3fc0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
3fd0: 6e 5f 76 61 6c 75 65 28 70 2c 20 31 29 3b 0a 20  n_value(p, 1);. 
3fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
3ff0: 43 6f 6e 66 69 67 53 65 74 56 61 6c 75 65 28 70  ConfigSetValue(p
4000: 43 6f 6e 66 69 67 2c 20 7a 4b 2c 20 70 56 61 6c  Config, zK, pVal
4010: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
4020: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
4030: 61 6c 69 7a 65 28 70 29 3b 0a 20 20 7d 0a 0a 20  alize(p);.  }.. 
4040: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4050: 4f 4b 20 29 7b 0a 20 20 20 20 70 43 6f 6e 66 69  OK ){.    pConfi
4060: 67 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 69 43 6f  g->iCookie = iCo
4070: 6f 6b 69 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  okie;.  }.  retu
4080: 72 6e 20 72 63 3b 0a 7d 0a 0a                    rn rc;.}..