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

Artifact 664fdc8519b55753f5c24d7b45176f05586b7965:


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 63 6f 6e 73 74 20 63 68  5Strdup(const ch
0dc0: 61 72 20 2a 7a 29 7b 0a 20 20 72 65 74 75 72 6e  ar *z){.  return
0dd0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
0de0: 28 22 25 73 22 2c 20 7a 29 3b 0a 7d 0a 0a 2f 2a  ("%s", z);.}../*
0df0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20  .** Allocate an 
0e00: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0e10: 64 65 66 61 75 6c 74 20 74 6f 6b 65 6e 69 7a 65  default tokenize
0e20: 72 20 28 22 73 69 6d 70 6c 65 22 29 20 61 74 20  r ("simple") at 
0e30: 0a 2a 2a 20 46 74 73 35 43 6f 6e 66 69 67 2e 70  .** Fts5Config.p
0e40: 54 6f 6b 65 6e 69 7a 65 72 2e 20 52 65 74 75 72  Tokenizer. Retur
0e50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
0e60: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
0e70: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
0e80: 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
0e90: 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
0ea0: 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e 66  tic int fts5Conf
0eb0: 69 67 44 65 66 61 75 6c 74 54 6f 6b 65 6e 69 7a  igDefaultTokeniz
0ec0: 65 72 28 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  er(Fts5Global *p
0ed0: 47 6c 6f 62 61 6c 2c 20 46 74 73 35 43 6f 6e 66  Global, Fts5Conf
0ee0: 69 67 20 2a 70 43 6f 6e 66 69 67 29 7b 0a 20 20  ig *pConfig){.  
0ef0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
0f00: 73 35 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 0a  s5GetTokenizer(.
0f10: 20 20 20 20 20 20 70 47 6c 6f 62 61 6c 2c 20 30        pGlobal, 0
0f20: 2c 20 30 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 70  , 0, &pConfig->p
0f30: 54 6f 6b 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 70  Tok, &pConfig->p
0f40: 54 6f 6b 41 70 69 0a 20 20 29 3b 0a 7d 0a 0a 2f  TokApi.  );.}../
0f50: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 6e  *.** Arguments n
0f60: 41 72 67 2f 61 7a 41 72 67 20 63 6f 6e 74 61 69  Arg/azArg contai
0f70: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 61 72 67  n the string arg
0f80: 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
0f90: 20 74 68 65 20 78 43 72 65 61 74 65 0a 2a 2a 20   the xCreate.** 
0fa0: 6f 72 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68  or xConnect meth
0fb0: 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
0fc0: 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
0fd0: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
0fe0: 74 6f 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 20  to .** allocate 
0ff0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 46  an instance of F
1000: 74 73 35 43 6f 6e 66 69 67 20 63 6f 6e 74 61 69  ts5Config contai
1010: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ning the results
1020: 20 6f 66 20 70 61 72 73 69 6e 67 0a 2a 2a 20 74   of parsing.** t
1030: 68 6f 73 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a  hose arguments..
1040: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1050: 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
1060: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1070: 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  ppOut is set to 
1080: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
1090: 6e 65 77 20 46 74 73 35 43 6f 6e 66 69 67 20 6f  new Fts5Config o
10a0: 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
10b0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
10c0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
10d0: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c  is .** returned,
10e0: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
10f0: 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 65 72  o NULL and an er
1100: 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 61 79 20  ror message may 
1110: 62 65 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 2a 70  be left in.** *p
1120: 7a 45 72 72 2e 20 49 74 20 69 73 20 74 68 65 20  zErr. It is the 
1130: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1140: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1150: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
1160: 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 65 72 72  any .** such err
1170: 6f 72 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67  or message using
1180: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
1190: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
11a0: 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28 0a  ts5ConfigParse(.
11b0: 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47    Fts5Global *pG
11c0: 6c 6f 62 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33  lobal,.  sqlite3
11d0: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 6e 41 72 67   *db,.  int nArg
11e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1200: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1210: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1220: 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
1230: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1240: 6e 41 72 67 20 43 52 45 41 54 45 20 56 49 52 54  nArg CREATE VIRT
1250: 55 41 4c 20 54 41 42 4c 45 20 61 72 67 73 20 2a  UAL TABLE args *
1260: 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
1270: 2a 70 70 4f 75 74 2c 20 20 20 20 20 20 20 20 20  *ppOut,         
1280: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
1290: 6c 74 73 20 6f 66 20 70 61 72 73 65 20 2a 2f 0a  lts of parse */.
12a0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20    char **pzErr  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
12d0: 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  message */.){.  
12e0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12f0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
1300: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1310: 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
1320: 70 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  pRet;           
1330: 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
1340: 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  t to return */..
1350: 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 20    *ppOut = pRet 
1360: 3d 20 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 73  = (Fts5Config*)s
1370: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
1380: 7a 65 6f 66 28 46 74 73 35 43 6f 6e 66 69 67 29  zeof(Fts5Config)
1390: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
13a0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
13c0: 28 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (pRet, 0, sizeof
13d0: 28 46 74 73 35 43 6f 6e 66 69 67 29 29 3b 0a 20  (Fts5Config));. 
13e0: 20 70 52 65 74 2d 3e 64 62 20 3d 20 64 62 3b 0a   pRet->db = db;.
13f0: 20 20 70 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20    pRet->iCookie 
1400: 3d 20 2d 31 3b 0a 0a 20 20 70 52 65 74 2d 3e 61  = -1;..  pRet->a
1410: 7a 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29 73  zCol = (char**)s
1420: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
1430: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41  zeof(char*) * nA
1440: 72 67 29 3b 0a 20 20 70 52 65 74 2d 3e 7a 44 62  rg);.  pRet->zDb
1450: 20 3d 20 66 74 73 35 53 74 72 64 75 70 28 61 7a   = fts5Strdup(az
1460: 41 72 67 5b 31 5d 29 3b 0a 20 20 70 52 65 74 2d  Arg[1]);.  pRet-
1470: 3e 7a 4e 61 6d 65 20 3d 20 66 74 73 35 53 74 72  >zName = fts5Str
1480: 64 75 70 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  dup(azArg[2]);. 
1490: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
14a0: 69 63 6d 70 28 70 52 65 74 2d 3e 7a 4e 61 6d 65  icmp(pRet->zName
14b0: 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45  , FTS5_RANK_NAME
14c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45  )==0 ){.    *pzE
14d0: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
14e0: 69 6e 74 66 28 22 72 65 73 65 72 76 65 64 20 66  intf("reserved f
14f0: 74 73 35 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20  ts5 table name: 
1500: 25 73 22 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d 65  %s", pRet->zName
1510: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1520: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
1530: 65 20 69 66 28 20 70 52 65 74 2d 3e 61 7a 43 6f  e if( pRet->azCo
1540: 6c 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 7a 44  l==0 || pRet->zD
1550: 62 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 7a 4e  b==0 || pRet->zN
1560: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ame==0 ){.    rc
1570: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1580: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1590: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  t i;.    for(i=3
15a0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
15b0: 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  && i<nArg; i++){
15c0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 44 75  .      char *zDu
15d0: 70 20 3d 20 66 74 73 35 53 74 72 64 75 70 28 61  p = fts5Strdup(a
15e0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
15f0: 69 66 28 20 7a 44 75 70 3d 3d 30 20 29 7b 0a 20  if( zDup==0 ){. 
1600: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1610: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1620: 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20 20 20  }else{..        
1630: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
1640: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 64 69   is a special di
1650: 72 65 63 74 69 76 65 20 2d 20 22 63 6d 64 3d 61  rective - "cmd=a
1660: 72 67 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  rg" */.        i
1670: 66 28 20 7a 44 75 70 5b 30 5d 21 3d 27 22 27 20  f( zDup[0]!='"' 
1680: 26 26 20 7a 44 75 70 5b 30 5d 21 3d 27 5c 27 27  && zDup[0]!='\''
1690: 20 26 26 20 7a 44 75 70 5b 30 5d 21 3d 27 5b 27   && zDup[0]!='['
16a0: 20 26 26 20 7a 44 75 70 5b 30 5d 21 3d 27 60 27   && zDup[0]!='`'
16b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
16c0: 61 72 20 2a 70 20 3d 20 7a 44 75 70 3b 0a 20 20  ar *p = zDup;.  
16d0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
16e0: 70 20 26 26 20 2a 70 21 3d 27 3d 27 20 29 20 70  p && *p!='=' ) p
16f0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
1700: 28 20 2a 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( *p ){.        
1710: 20 20 20 20 63 68 61 72 20 2a 7a 41 72 67 20 3d      char *zArg =
1720: 20 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20   &p[1];.        
1730: 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20      *p = '\0';. 
1740: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1750: 65 33 46 74 73 35 44 65 71 75 6f 74 65 28 7a 41  e3Fts5Dequote(zA
1760: 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rg);.           
1770: 20 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67   rc = fts5Config
1780: 50 61 72 73 65 53 70 65 63 69 61 6c 28 70 52 65  ParseSpecial(pRe
1790: 74 2c 20 7a 44 75 70 2c 20 7a 41 72 67 2c 20 70  t, zDup, zArg, p
17a0: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  zErr);.         
17b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17c0: 7a 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  zDup);.         
17d0: 20 20 20 7a 44 75 70 20 3d 20 30 3b 0a 20 20 20     zDup = 0;.   
17e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17f0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   }..        /* I
1800: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 20 73 70  f it is not a sp
1810: 65 63 69 61 6c 20 64 69 72 65 63 74 69 76 65 2c  ecial directive,
1820: 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 63 6f   it must be a co
1830: 6c 75 6d 6e 20 6e 61 6d 65 2e 20 49 6e 0a 20 20  lumn name. In.  
1840: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
1850: 73 65 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69  se, check that i
1860: 74 20 69 73 20 6e 6f 74 20 74 68 65 20 72 65 73  t is not the res
1870: 65 72 76 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  erved column nam
1880: 65 20 22 72 61 6e 6b 22 2e 20 2a 2f 0a 20 20 20  e "rank". */.   
1890: 20 20 20 20 20 69 66 28 20 7a 44 75 70 20 29 7b       if( zDup ){
18a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18b0: 65 33 46 74 73 35 44 65 71 75 6f 74 65 28 7a 44  e3Fts5Dequote(zD
18c0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  up);.          p
18d0: 52 65 74 2d 3e 61 7a 43 6f 6c 5b 70 52 65 74 2d  Ret->azCol[pRet-
18e0: 3e 6e 43 6f 6c 2b 2b 5d 20 3d 20 7a 44 75 70 3b  >nCol++] = zDup;
18f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
1900: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1910: 44 75 70 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e  Dup, FTS5_RANK_N
1920: 41 4d 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  AME)==0 ){.     
1930: 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
1940: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1950: 22 72 65 73 65 72 76 65 64 20 66 74 73 35 20 63  "reserved fts5 c
1960: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c  olumn name: %s",
1970: 20 7a 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   zDup);.        
1980: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1990: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
19a0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
19b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
19c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19d0: 5f 4f 4b 20 26 26 20 70 52 65 74 2d 3e 70 54 6f  _OK && pRet->pTo
19e0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k==0 ){.    rc =
19f0: 20 66 74 73 35 43 6f 6e 66 69 67 44 65 66 61 75   fts5ConfigDefau
1a00: 6c 74 54 6f 6b 65 6e 69 7a 65 72 28 70 47 6c 6f  ltTokenizer(pGlo
1a10: 62 61 6c 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a  bal, pRet);.  }.
1a20: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
1a40: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 46 72 65  te3Fts5ConfigFre
1a50: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 2a 70 70  e(pRet);.    *pp
1a60: 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Out = 0;.  }.  r
1a70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a80: 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 66  ** Free the conf
1a90: 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74  iguration object
1aa0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
1ab0: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
1ac0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
1ad0: 35 43 6f 6e 66 69 67 46 72 65 65 28 46 74 73 35  5ConfigFree(Fts5
1ae0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 29  Config *pConfig)
1af0: 7b 0a 20 20 69 66 28 20 70 43 6f 6e 66 69 67 20  {.  if( pConfig 
1b00: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1b10: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 70    if( pConfig->p
1b20: 54 6f 6b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e  Tok && pConfig->
1b30: 70 54 6f 6b 41 70 69 2d 3e 78 44 65 6c 65 74 65  pTokApi->xDelete
1b40: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6e 66 69   ){.      pConfi
1b50: 67 2d 3e 70 54 6f 6b 41 70 69 2d 3e 78 44 65 6c  g->pTokApi->xDel
1b60: 65 74 65 28 70 43 6f 6e 66 69 67 2d 3e 70 54 6f  ete(pConfig->pTo
1b70: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  k);.    }.    sq
1b80: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
1b90: 69 67 2d 3e 7a 44 62 29 3b 0a 20 20 20 20 73 71  ig->zDb);.    sq
1ba0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
1bb0: 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ig->zName);.    
1bc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66  for(i=0; i<pConf
1bd0: 69 67 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ig->nCol; i++){.
1be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1bf0: 65 65 28 70 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f  ee(pConfig->azCo
1c00: 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l[i]);.    }.   
1c10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1c20: 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c 29 3b 0a 20  onfig->azCol);. 
1c30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c40: 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
1c50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1c60: 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61  ree(pConfig->zRa
1c70: 6e 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nk);.    sqlite3
1c80: 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a  _free(pConfig->z
1c90: 52 61 6e 6b 41 72 67 73 29 3b 0a 20 20 20 20 73  RankArgs);.    s
1ca0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e  qlite3_free(pCon
1cb0: 66 69 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  fig);.  }.}../*.
1cc0: 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ** Call sqlite3_
1cd0: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 62  declare_vtab() b
1ce0: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
1cf0: 65 6e 74 73 20 6f 66 20 74 68 65 20 63 6f 6e 66  ents of the conf
1d00: 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6f 62 6a  iguration.** obj
1d10: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
1d20: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
1d30: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1d40: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
1d50: 20 6f 72 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65   or.** an SQLite
1d60: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1d70: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
1d80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
1d90: 73 35 43 6f 6e 66 69 67 44 65 63 6c 61 72 65 56  s5ConfigDeclareV
1da0: 74 61 62 28 46 74 73 35 43 6f 6e 66 69 67 20 2a  tab(Fts5Config *
1db0: 70 43 6f 6e 66 69 67 29 7b 0a 20 20 69 6e 74 20  pConfig){.  int 
1dc0: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  i;.  int rc;.  c
1dd0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
1de0: 72 20 2a 7a 4f 6c 64 3b 0a 0a 20 20 7a 53 71 6c  r *zOld;..  zSql
1df0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
1e00: 33 5f 6d 70 72 69 6e 74 66 28 22 43 52 45 41 54  3_mprintf("CREAT
1e10: 45 20 54 41 42 4c 45 20 78 28 22 29 3b 0a 20 20  E TABLE x(");.  
1e20: 66 6f 72 28 69 3d 30 3b 20 7a 53 71 6c 20 26 26  for(i=0; zSql &&
1e30: 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c   i<pConfig->nCol
1e40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 4f 6c 64  ; i++){.    zOld
1e50: 20 3d 20 7a 53 71 6c 3b 0a 20 20 20 20 7a 53 71   = zSql;.    zSq
1e60: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1e70: 6e 74 66 28 22 25 73 25 73 25 51 22 2c 20 7a 4f  ntf("%s%s%Q", zO
1e80: 6c 64 2c 20 28 69 3d 3d 30 3f 22 22 3a 22 2c 20  ld, (i==0?"":", 
1e90: 22 29 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 7a 43  "), pConfig->azC
1ea0: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69  ol[i]);.    sqli
1eb0: 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a  te3_free(zOld);.
1ec0: 20 20 7d 0a 0a 20 20 69 66 28 20 7a 53 71 6c 20    }..  if( zSql 
1ed0: 29 7b 0a 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 53  ){.    zOld = zS
1ee0: 71 6c 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  ql;.    zSql = s
1ef0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1f00: 25 73 2c 20 25 51 20 48 49 44 44 45 4e 2c 20 25  %s, %Q HIDDEN, %
1f10: 73 20 48 49 44 44 45 4e 29 22 2c 20 0a 20 20 20  s HIDDEN)", .   
1f20: 20 20 20 20 20 7a 4f 6c 64 2c 20 70 43 6f 6e 66       zOld, pConf
1f30: 69 67 2d 3e 7a 4e 61 6d 65 2c 20 46 54 53 35 5f  ig->zName, FTS5_
1f40: 52 41 4e 4b 5f 4e 41 4d 45 0a 20 20 20 20 29 3b  RANK_NAME.    );
1f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1f60: 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  e(zOld);.  }..  
1f70: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
1f80: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1f90: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
1fa0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1fb0: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 70 43 6f  declare_vtab(pCo
1fc0: 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 29 3b  nfig->db, zSql);
1fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1fe0: 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 0a  e(zSql);.  }.  .
1ff0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2000: 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 65 20 74  /*.** Tokenize t
2010: 68 65 20 74 65 78 74 20 70 61 73 73 65 64 20 76  he text passed v
2020: 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e  ia the second an
2030: 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  d third argument
2040: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  s..**.** The cal
2050: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
2060: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
2070: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 69 6e 70 75  oken in the inpu
2080: 74 20 74 65 78 74 2e 20 54 68 65 0a 2a 2a 20 61  t text. The.** a
2090: 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
20a0: 74 6f 20 69 74 20 61 72 65 2c 20 69 6e 20 6f 72  to it are, in or
20b0: 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 76  der:.**.**     v
20c0: 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20 20 20  oid *pCtx       
20d0: 20 20 20 2f 2f 20 43 6f 70 79 20 6f 66 20 34 74     // Copy of 4t
20e0: 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  h argument to sq
20f0: 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a  lite3Fts5Tokeniz
2100: 65 28 29 0a 2a 2a 20 20 20 20 20 63 6f 6e 73 74  e().**     const
2110: 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 20 20 2f   char *pToken  /
2120: 2f 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  / Pointer to buf
2130: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
2140: 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 69 6e 74 20  oken.**     int 
2150: 6e 54 6f 6b 65 6e 20 20 20 20 20 20 20 20 20 20  nToken          
2160: 2f 2f 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65 6e  // Size of token
2170: 20 69 6e 20 62 79 74 65 73 0a 2a 2a 20 20 20 20   in bytes.**    
2180: 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
2190: 20 20 20 20 20 2f 2f 20 42 79 74 65 20 6f 66 66       // Byte off
21a0: 73 65 74 20 6f 66 20 73 74 61 72 74 20 6f 66 20  set of start of 
21b0: 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 69 6e 70  token within inp
21c0: 75 74 20 74 65 78 74 0a 2a 2a 20 20 20 20 20 69  ut text.**     i
21d0: 6e 74 20 69 45 6e 64 20 20 20 20 20 20 20 20 20  nt iEnd         
21e0: 20 20 20 2f 2f 20 42 79 74 65 20 6f 66 66 73 65     // Byte offse
21f0: 74 20 6f 66 20 65 6e 64 20 6f 66 20 74 6f 6b 65  t of end of toke
2200: 6e 20 77 69 74 68 69 6e 20 69 6e 70 75 74 20 74  n within input t
2210: 65 78 74 0a 2a 2a 20 20 20 20 20 69 6e 74 20 69  ext.**     int i
2220: 50 6f 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  Pos            /
2230: 2f 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  / Position of to
2240: 6b 65 6e 20 69 6e 20 69 6e 70 75 74 20 28 66 69  ken in input (fi
2250: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 30 29 0a  rst token is 0).
2260: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  **.** If the cal
2270: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 61 20  lback returns a 
2280: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 74  non-zero value t
2290: 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20  he tokenization 
22a0: 69 73 20 61 62 61 6e 64 6f 6e 65 64 0a 2a 2a 20  is abandoned.** 
22b0: 61 6e 64 20 6e 6f 20 66 75 72 74 68 65 72 20 63  and no further c
22c0: 61 6c 6c 62 61 63 6b 73 20 61 72 65 20 69 73 73  allbacks are iss
22d0: 75 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ued. .**.** This
22e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
22f0: 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  s SQLITE_OK if s
2300: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20  uccessful or an 
2310: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2320: 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72  e.** if an error
2330: 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
2340: 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20 77 61 73  tokenization was
2350: 20 61 62 61 6e 64 6f 6e 65 64 20 65 61 72 6c 79   abandoned early
2360: 20 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20   because.** the 
2370: 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 65  callback returne
2380: 64 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2c 20 74  d SQLITE_DONE, t
2390: 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 65 72  his is not an er
23a0: 72 6f 72 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ror and this fun
23b0: 63 74 69 6f 6e 0a 2a 2a 20 73 74 69 6c 6c 20 72  ction.** still r
23c0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
23d0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 74 6f 6b  . Or, if the tok
23e0: 65 6e 69 7a 61 74 69 6f 6e 20 77 61 73 20 61 62  enization was ab
23f0: 61 6e 64 6f 6e 65 64 20 65 61 72 6c 79 0a 2a 2a  andoned early.**
2400: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
2410: 6c 62 61 63 6b 20 72 65 74 75 72 6e 65 64 20 61  lback returned a
2420: 6e 6f 74 68 65 72 20 6e 6f 6e 2d 7a 65 72 6f 20  nother non-zero 
2430: 76 61 6c 75 65 2c 20 69 74 20 69 73 20 61 73 73  value, it is ass
2440: 75 6d 65 64 0a 2a 2a 20 74 6f 20 62 65 20 61 6e  umed.** to be an
2450: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2460: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20  de and returned 
2470: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
2480: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2490: 35 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73  5Tokenize(.  Fts
24a0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
24b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
24c0: 46 54 53 35 20 43 6f 6e 66 69 67 75 72 61 74 69  FTS5 Configurati
24d0: 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  on object */.  c
24e0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 78 74  onst char *pText
24f0: 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20 20 20 2f  , int nText,   /
2500: 2a 20 54 65 78 74 20 74 6f 20 74 6f 6b 65 6e 69  * Text to tokeni
2510: 7a 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ze */.  void *pC
2520: 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
2530: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2540: 78 74 20 70 61 73 73 65 64 20 74 6f 20 78 54 6f  xt passed to xTo
2550: 6b 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 28  ken() */.  int (
2560: 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20  *xToken)(void*, 
2570: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
2580: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29  , int, int, int)
2590: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
25a0: 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  */.){.  return p
25b0: 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69 2d  Config->pTokApi-
25c0: 3e 78 54 6f 6b 65 6e 69 7a 65 28 70 43 6f 6e 66  >xTokenize(pConf
25d0: 69 67 2d 3e 70 54 6f 6b 2c 20 70 43 74 78 2c 20  ig->pTok, pCtx, 
25e0: 70 54 65 78 74 2c 20 6e 54 65 78 74 2c 20 78 54  pText, nText, xT
25f0: 6f 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oken);.}../*.** 
2600: 41 72 67 75 6d 65 6e 74 20 70 49 6e 20 70 6f 69  Argument pIn poi
2610: 6e 74 73 20 74 6f 20 61 20 63 68 61 72 61 63 74  nts to a charact
2620: 65 72 20 74 68 61 74 20 69 73 20 70 61 72 74 20  er that is part 
2630: 6f 66 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  of a nul-termina
2640: 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e 67 2e 20  ted .** string. 
2650: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2660: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68   to the first ch
2670: 61 72 61 63 74 65 72 20 66 6f 6c 6c 6f 77 69 6e  aracter followin
2680: 67 20 2a 70 49 6e 20 69 6e 20 0a 2a 2a 20 74 68  g *pIn in .** th
2690: 65 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  e string that is
26a0: 20 6e 6f 74 20 61 20 77 68 69 74 65 2d 73 70 61   not a white-spa
26b0: 63 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  ce character..*/
26c0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
26d0: 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b  ar *fts5ConfigSk
26e0: 69 70 57 68 69 74 65 73 70 61 63 65 28 63 6f 6e  ipWhitespace(con
26f0: 73 74 20 63 68 61 72 20 2a 70 49 6e 29 7b 0a 20  st char *pIn){. 
2700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d   const char *p =
2710: 20 70 49 6e 3b 0a 20 20 69 66 28 20 70 20 29 7b   pIn;.  if( p ){
2720: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 3d 3d  .    while( *p==
2730: 27 20 27 20 29 7b 20 70 2b 2b 3b 20 7d 0a 20 20  ' ' ){ p++; }.  
2740: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2750: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
2760: 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  pIn points to a 
2770: 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 69  character that i
2780: 73 20 70 61 72 74 20 6f 66 20 61 20 6e 75 6c 2d  s part of a nul-
2790: 74 65 72 6d 69 6e 61 74 65 64 20 0a 2a 2a 20 73  terminated .** s
27a0: 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 61 20  tring. Return a 
27b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
27c0: 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 66  irst character f
27d0: 6f 6c 6c 6f 77 69 6e 67 20 2a 70 49 6e 20 69 6e  ollowing *pIn in
27e0: 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20   .** the string 
27f0: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 22 62  that is not a "b
2800: 61 72 65 77 6f 72 64 22 20 63 68 61 72 61 63 74  areword" charact
2810: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  er..*/.static co
2820: 6e 73 74 20 63 68 61 72 20 2a 66 74 73 35 43 6f  nst char *fts5Co
2830: 6e 66 69 67 53 6b 69 70 42 61 72 65 77 6f 72 64  nfigSkipBareword
2840: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e  (const char *pIn
2850: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2860: 2a 70 20 3d 20 70 49 6e 3b 0a 20 20 77 68 69 6c  *p = pIn;.  whil
2870: 65 28 20 2a 70 20 20 20 20 20 20 26 26 20 2a 70  e( *p      && *p
2880: 21 3d 27 20 27 20 26 26 20 2a 70 21 3d 27 3a 27  !=' ' && *p!=':'
2890: 20 26 26 20 2a 70 21 3d 27 21 27 20 26 26 20 2a   && *p!='!' && *
28a0: 70 21 3d 27 40 27 20 0a 20 20 20 20 20 20 26 26  p!='@' .      &&
28b0: 20 2a 70 21 3d 27 23 27 20 26 26 20 2a 70 21 3d   *p!='#' && *p!=
28c0: 27 24 27 20 26 26 20 2a 70 21 3d 27 25 27 20 26  '$' && *p!='%' &
28d0: 26 20 2a 70 21 3d 27 5e 27 20 26 26 20 2a 70 21  & *p!='^' && *p!
28e0: 3d 27 26 27 20 0a 20 20 20 20 20 20 26 26 20 2a  ='&' .      && *
28f0: 70 21 3d 27 2a 27 20 26 26 20 2a 70 21 3d 27 28  p!='*' && *p!='(
2900: 27 20 26 26 20 2a 70 21 3d 27 29 27 20 0a 20 20  ' && *p!=')' .  
2910: 29 7b 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a  ){.    p++;.  }.
2920: 20 20 69 66 28 20 70 3d 3d 70 49 6e 20 29 20 70    if( p==pIn ) p
2930: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
2940: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
2950: 66 74 73 35 5f 69 73 64 69 67 69 74 28 63 68 61  fts5_isdigit(cha
2960: 72 20 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  r a){.  return (
2970: 61 3e 3d 27 30 27 20 26 26 20 61 3c 3d 27 39 27  a>='0' && a<='9'
2980: 29 3b 0a 7d 0a 0a 0a 0a 73 74 61 74 69 63 20 63  );.}....static c
2990: 6f 6e 73 74 20 63 68 61 72 20 2a 66 74 73 35 43  onst char *fts5C
29a0: 6f 6e 66 69 67 53 6b 69 70 4c 69 74 65 72 61 6c  onfigSkipLiteral
29b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e  (const char *pIn
29c0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
29d0: 2a 70 20 3d 20 70 49 6e 3b 0a 20 20 69 66 28 20  *p = pIn;.  if( 
29e0: 70 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  p ){.    switch(
29f0: 20 2a 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73   *p ){.      cas
2a00: 65 20 27 6e 27 3a 20 63 61 73 65 20 27 4e 27 3a  e 'n': case 'N':
2a10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2a20: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 6e  ite3_strnicmp("n
2a30: 75 6c 6c 22 2c 20 70 2c 20 34 29 3d 3d 30 20 29  ull", p, 4)==0 )
2a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 20 3d 20  {.          p = 
2a50: 26 70 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 7d  &p[4];.        }
2a60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a70: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
2a80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a90: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 63          .      c
2aa0: 61 73 65 20 27 78 27 3a 20 63 61 73 65 20 27 58  ase 'x': case 'X
2ab0: 27 3a 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a  ':.        p++;.
2ac0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d          if( *p==
2ad0: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
2ae0: 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    p++;.         
2af0: 20 77 68 69 6c 65 28 20 28 2a 70 3e 3d 27 61 27   while( (*p>='a'
2b00: 20 26 26 20 2a 70 3c 3d 27 66 27 29 20 0a 20 20   && *p<='f') .  
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2b20: 2a 70 3e 3d 27 41 27 20 26 26 20 2a 70 3c 3d 27  *p>='A' && *p<='
2b30: 46 27 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  F') .           
2b40: 20 20 20 7c 7c 20 28 2a 70 3e 3d 27 30 27 20 26     || (*p>='0' &
2b50: 26 20 2a 70 3c 3d 27 39 27 29 20 0a 20 20 20 20  & *p<='9') .    
2b60: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2b70: 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20       p++;.      
2b80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b90: 69 66 28 20 2a 70 3d 3d 27 5c 27 27 20 26 26 20  if( *p=='\'' && 
2ba0: 30 3d 3d 28 28 70 2d 70 49 6e 29 25 32 29 20 29  0==((p-pIn)%2) )
2bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2b  {.            p+
2bc0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
2bd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2be0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  p = 0;.         
2bf0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2c00: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 20 3d 20  {.          p = 
2c10: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2c30: 20 20 20 63 61 73 65 20 27 5c 27 27 3a 0a 20 20     case '\'':.  
2c40: 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20        p++;.     
2c50: 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20     while( p ){. 
2c60: 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d           if( *p=
2c70: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
2c80: 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20       p++;.      
2c90: 20 20 20 20 20 20 69 66 28 20 2a 70 21 3d 27 5c        if( *p!='\
2ca0: 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  '' ) break;.    
2cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cc0: 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    p++;.         
2cd0: 20 69 66 28 20 2a 70 3d 3d 30 20 29 20 70 20 3d   if( *p==0 ) p =
2ce0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2cf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2d00: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2d10: 20 20 20 20 20 2f 2a 20 6d 61 79 62 65 20 61 20       /* maybe a 
2d20: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
2d30: 20 20 69 66 28 20 2a 70 3d 3d 27 2b 27 20 7c 7c    if( *p=='+' ||
2d40: 20 2a 70 3d 3d 27 2d 27 20 29 20 70 2b 2b 3b 0a   *p=='-' ) p++;.
2d50: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 66          while( f
2d60: 74 73 35 5f 69 73 64 69 67 69 74 28 2a 70 29 20  ts5_isdigit(*p) 
2d70: 29 20 70 2b 2b 3b 0a 0a 20 20 20 20 20 20 20 20  ) p++;..        
2d80: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
2d90: 2c 20 69 66 20 74 68 65 20 6c 69 74 65 72 61 6c  , if the literal
2da0: 20 77 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2c   was an integer,
2db0: 20 74 68 65 20 70 61 72 73 65 20 69 73 20 0a 20   the parse is . 
2dc0: 20 20 20 20 20 20 20 2a 2a 20 66 69 6e 69 73 68         ** finish
2dd0: 65 64 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73  ed. Or, if it is
2de0: 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e   a floating poin
2df0: 74 20 76 61 6c 75 65 2c 20 69 74 20 6d 61 79 20  t value, it may 
2e00: 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 20  continue.       
2e10: 20 2a 2a 20 77 69 74 68 20 65 69 74 68 65 72 20   ** with either 
2e20: 61 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20  a decimal point 
2e30: 6f 72 20 61 6e 20 27 45 27 20 63 68 61 72 61 63  or an 'E' charac
2e40: 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ter. */.        
2e50: 69 66 28 20 2a 70 3d 3d 27 2e 27 20 26 26 20 66  if( *p=='.' && f
2e60: 74 73 35 5f 69 73 64 69 67 69 74 28 70 5b 31 5d  ts5_isdigit(p[1]
2e70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
2e80: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
2e90: 20 77 68 69 6c 65 28 20 66 74 73 35 5f 69 73 64   while( fts5_isd
2ea0: 69 67 69 74 28 2a 70 29 20 29 20 70 2b 2b 3b 0a  igit(*p) ) p++;.
2eb0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2ed0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b    }..  return p;
2ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
2ef0: 6e 74 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f  nt pIn points to
2f00: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
2f10: 63 74 65 72 20 69 6e 20 77 68 61 74 20 69 73 20  cter in what is 
2f20: 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 0a 2a  expected to be.*
2f30: 2a 20 61 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61  * a comma-separa
2f40: 74 65 64 20 6c 69 73 74 20 6f 66 20 53 51 4c 20  ted list of SQL 
2f50: 6c 69 74 65 72 61 6c 73 20 66 6f 6c 6c 6f 77 65  literals followe
2f60: 64 20 62 79 20 61 20 27 29 27 20 63 68 61 72 61  d by a ')' chara
2f70: 63 74 65 72 2e 0a 2a 2a 20 49 66 20 69 74 20 61  cter..** If it a
2f80: 63 74 75 61 6c 6c 79 20 69 73 20 74 68 69 73 2c  ctually is this,
2f90: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
2fa0: 72 20 74 6f 20 74 68 65 20 27 29 27 2e 20 4f 74  r to the ')'. Ot
2fb0: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a  herwise, return.
2fc0: 2a 2a 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63  ** NULL to indic
2fd0: 61 74 65 20 61 20 70 61 72 73 65 20 65 72 72 6f  ate a parse erro
2fe0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  r..*/.static con
2ff0: 73 74 20 63 68 61 72 20 2a 66 74 73 35 43 6f 6e  st char *fts5Con
3000: 66 69 67 53 6b 69 70 41 72 67 73 28 63 6f 6e 73  figSkipArgs(cons
3010: 74 20 63 68 61 72 20 2a 70 49 6e 29 7b 0a 20 20  t char *pIn){.  
3020: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
3030: 70 49 6e 3b 0a 20 20 0a 20 20 77 68 69 6c 65 28  pIn;.  .  while(
3040: 20 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 66 74   1 ){.    p = ft
3050: 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74  s5ConfigSkipWhit
3060: 65 73 70 61 63 65 28 70 29 3b 0a 20 20 20 20 70  espace(p);.    p
3070: 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69   = fts5ConfigSki
3080: 70 4c 69 74 65 72 61 6c 28 70 29 3b 0a 20 20 20  pLiteral(p);.   
3090: 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53   p = fts5ConfigS
30a0: 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29  kipWhitespace(p)
30b0: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 7c  ;.    if( p==0 |
30c0: 7c 20 2a 70 3d 3d 27 29 27 20 29 20 62 72 65 61  | *p==')' ) brea
30d0: 6b 3b 0a 20 20 20 20 69 66 28 20 2a 70 21 3d 27  k;.    if( *p!='
30e0: 2c 27 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  ,' ){.      p = 
30f0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
3100: 20 20 20 20 7d 0a 20 20 20 20 70 2b 2b 3b 0a 20      }.    p++;. 
3110: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   }..  return p;.
3120: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
3130: 65 72 20 7a 49 6e 20 63 6f 6e 74 61 69 6e 73 20  er zIn contains 
3140: 61 20 72 61 6e 6b 28 29 20 66 75 6e 63 74 69 6f  a rank() functio
3150: 6e 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 2e  n specification.
3160: 20 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 0a   The format of .
3170: 2a 2a 20 74 68 69 73 20 69 73 3a 0a 2a 2a 0a 2a  ** this is:.**.*
3180: 2a 20 20 20 2b 20 42 61 72 65 77 6f 72 64 20 28  *   + Bareword (
3190: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 29 0a 2a  function name).*
31a0: 2a 20 20 20 2b 20 4f 70 65 6e 20 70 61 72 65 6e  *   + Open paren
31b0: 74 68 65 73 69 73 20 2d 20 22 28 22 0a 2a 2a 20  thesis - "(".** 
31c0: 20 20 2b 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65    + Zero or more
31d0: 20 53 51 4c 20 6c 69 74 65 72 61 6c 73 20 69 6e   SQL literals in
31e0: 20 61 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74   a comma separat
31f0: 65 64 20 6c 69 73 74 0a 2a 2a 20 20 20 2b 20 43  ed list.**   + C
3200: 6c 6f 73 65 20 70 61 72 65 6e 74 68 65 73 69 73  lose parenthesis
3210: 20 2d 20 22 29 22 0a 2a 2f 0a 73 74 61 74 69 63   - ")".*/.static
3220: 20 69 6e 74 20 66 74 73 35 43 6f 6e 66 69 67 50   int fts5ConfigP
3230: 61 72 73 65 52 61 6e 6b 28 0a 20 20 63 6f 6e 73  arseRank(.  cons
3240: 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 20 20 20  t char *zIn,    
3250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3260: 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  nput string */. 
3270: 20 63 68 61 72 20 2a 2a 70 7a 52 61 6e 6b 2c 20   char **pzRank, 
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 4f 55 54 3a 20 52 61 6e 6b 20 66 75   /* OUT: Rank fu
32a0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
32b0: 20 63 68 61 72 20 2a 2a 70 7a 52 61 6e 6b 41 72   char **pzRankAr
32c0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
32d0: 20 2f 2a 20 4f 55 54 3a 20 52 61 6e 6b 20 66 75   /* OUT: Rank fu
32e0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
32f0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
3300: 68 61 72 20 2a 70 20 3d 20 7a 49 6e 3b 0a 20 20  har *p = zIn;.  
3310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 52 61 6e  const char *pRan
3320: 6b 3b 0a 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b  k;.  char *zRank
3330: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52   = 0;.  char *zR
3340: 61 6e 6b 41 72 67 73 20 3d 20 30 3b 0a 20 20 69  ankArgs = 0;.  i
3350: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
3360: 4b 3b 0a 0a 20 20 2a 70 7a 52 61 6e 6b 20 3d 20  K;..  *pzRank = 
3370: 30 3b 0a 20 20 2a 70 7a 52 61 6e 6b 41 72 67 73  0;.  *pzRankArgs
3380: 20 3d 20 30 3b 0a 0a 20 20 70 20 3d 20 66 74 73   = 0;..  p = fts
3390: 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65  5ConfigSkipWhite
33a0: 73 70 61 63 65 28 70 29 3b 0a 20 20 70 52 61 6e  space(p);.  pRan
33b0: 6b 20 3d 20 70 3b 0a 20 20 70 20 3d 20 66 74 73  k = p;.  p = fts
33c0: 35 43 6f 6e 66 69 67 53 6b 69 70 42 61 72 65 77  5ConfigSkipBarew
33d0: 6f 72 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ord(p);..  if( p
33e0: 20 29 7b 0a 20 20 20 20 7a 52 61 6e 6b 20 3d 20   ){.    zRank = 
33f0: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
3400: 63 5a 65 72 6f 28 26 72 63 2c 20 31 20 2b 20 70  cZero(&rc, 1 + p
3410: 20 2d 20 70 52 61 6e 6b 29 3b 0a 20 20 20 20 69   - pRank);.    i
3420: 66 28 20 7a 52 61 6e 6b 20 29 20 6d 65 6d 63 70  f( zRank ) memcp
3430: 79 28 7a 52 61 6e 6b 2c 20 70 52 61 6e 6b 2c 20  y(zRank, pRank, 
3440: 70 2d 70 52 61 6e 6b 29 3b 0a 20 20 7d 65 6c 73  p-pRank);.  }els
3450: 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
3460: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
3470: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3480: 4f 4b 20 29 7b 0a 20 20 20 20 70 20 3d 20 66 74  OK ){.    p = ft
3490: 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74  s5ConfigSkipWhit
34a0: 65 73 70 61 63 65 28 70 29 3b 0a 20 20 20 20 69  espace(p);.    i
34b0: 66 28 20 2a 70 21 3d 27 28 27 20 29 20 72 63 20  f( *p!='(' ) rc 
34c0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
34d0: 20 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 20 20 69      p++;.  }.  i
34e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34f0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
3500: 61 72 20 2a 70 41 72 67 73 3b 20 0a 20 20 20 20  ar *pArgs; .    
3510: 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  p = fts5ConfigSk
3520: 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b  ipWhitespace(p);
3530: 0a 20 20 20 20 70 41 72 67 73 20 3d 20 70 3b 0a  .    pArgs = p;.
3540: 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66      p = fts5Conf
3550: 69 67 53 6b 69 70 41 72 67 73 28 70 29 3b 0a 20  igSkipArgs(p);. 
3560: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
3570: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3580: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
3590: 65 20 69 66 28 20 70 21 3d 70 41 72 67 73 20 29  e if( p!=pArgs )
35a0: 7b 0a 20 20 20 20 20 20 7a 52 61 6e 6b 41 72 67  {.      zRankArg
35b0: 73 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  s = sqlite3Fts5M
35c0: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 31  allocZero(&rc, 1
35d0: 20 2b 20 70 20 2d 20 70 41 72 67 73 29 3b 0a 20   + p - pArgs);. 
35e0: 20 20 20 20 20 69 66 28 20 7a 52 61 6e 6b 41 72       if( zRankAr
35f0: 67 73 20 29 20 6d 65 6d 63 70 79 28 7a 52 61 6e  gs ) memcpy(zRan
3600: 6b 41 72 67 73 2c 20 70 41 72 67 73 2c 20 70 2d  kArgs, pArgs, p-
3610: 70 41 72 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  pArgs);.    }.  
3620: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
3630: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
3640: 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 61 6e 6b  lite3_free(zRank
3650: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  );.    assert( z
3660: 52 61 6e 6b 41 72 67 73 3d 3d 30 20 29 3b 0a 20  RankArgs==0 );. 
3670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 52   }else{.    *pzR
3680: 61 6e 6b 20 3d 20 7a 52 61 6e 6b 3b 0a 20 20 20  ank = zRank;.   
3690: 20 2a 70 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a   *pzRankArgs = z
36a0: 52 61 6e 6b 41 72 67 73 3b 0a 20 20 7d 0a 20 20  RankArgs;.  }.  
36b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
36c0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  t sqlite3Fts5Con
36d0: 66 69 67 53 65 74 56 61 6c 75 65 28 0a 20 20 46  figSetValue(.  F
36e0: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
36f0: 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  ig, .  const cha
3700: 72 20 2a 7a 4b 65 79 2c 20 0a 20 20 73 71 6c 69  r *zKey, .  sqli
3710: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c  te3_value *pVal,
3720: 0a 20 20 69 6e 74 20 2a 70 62 42 61 64 6b 65 79  .  int *pbBadkey
3730: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
3740: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
3750: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f       0==sqlite3_
3760: 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22 63  stricmp(zKey, "c
3770: 6f 6f 6b 69 65 22 29 20 29 7b 0a 20 20 20 20 70  ookie") ){.    p
3780: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 20  Config->iCookie 
3790: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
37a0: 69 6e 74 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 0a  int(pVal);.  }..
37b0: 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71    else if( 0==sq
37c0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b  lite3_stricmp(zK
37d0: 65 79 2c 20 22 70 67 73 7a 22 29 20 29 7b 0a 20  ey, "pgsz") ){. 
37e0: 20 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30 3b     int pgsz = 0;
37f0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
3800: 49 4e 54 45 47 45 52 3d 3d 73 71 6c 69 74 65 33  INTEGER==sqlite3
3810: 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74  _value_numeric_t
3820: 79 70 65 28 70 56 61 6c 29 20 29 7b 0a 20 20 20  ype(pVal) ){.   
3830: 20 20 20 70 67 73 7a 20 3d 20 73 71 6c 69 74 65     pgsz = sqlite
3840: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
3850: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3860: 20 70 67 73 7a 3c 3d 30 20 7c 7c 20 70 67 73 7a   pgsz<=0 || pgsz
3870: 3e 46 54 53 35 5f 4d 41 58 5f 50 41 47 45 5f 53  >FTS5_MAX_PAGE_S
3880: 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  IZE ){.      if(
3890: 20 70 62 42 61 64 6b 65 79 20 29 20 2a 70 62 42   pbBadkey ) *pbB
38a0: 61 64 6b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  adkey = 1;.    }
38b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 6f 6e  else{.      pCon
38c0: 66 69 67 2d 3e 70 67 73 7a 20 3d 20 70 67 73 7a  fig->pgsz = pgsz
38d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
38e0: 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  lse if( 0==sqlit
38f0: 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c  e3_stricmp(zKey,
3900: 20 22 61 75 74 6f 6d 65 72 67 65 22 29 20 29 7b   "automerge") ){
3910: 0a 20 20 20 20 69 6e 74 20 6e 41 75 74 6f 6d 65  .    int nAutome
3920: 72 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  rge = -1;.    if
3930: 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ( SQLITE_INTEGER
3940: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
3950: 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56 61  numeric_type(pVa
3960: 6c 29 20 29 7b 0a 20 20 20 20 20 20 6e 41 75 74  l) ){.      nAut
3970: 6f 6d 65 72 67 65 20 3d 20 73 71 6c 69 74 65 33  omerge = sqlite3
3980: 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29  _value_int(pVal)
3990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
39a0: 6e 41 75 74 6f 6d 65 72 67 65 3c 30 20 7c 7c 20  nAutomerge<0 || 
39b0: 6e 41 75 74 6f 6d 65 72 67 65 3e 36 34 20 29 7b  nAutomerge>64 ){
39c0: 0a 20 20 20 20 20 20 69 66 28 20 70 62 42 61 64  .      if( pbBad
39d0: 6b 65 79 20 29 20 2a 70 62 42 61 64 6b 65 79 20  key ) *pbBadkey 
39e0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
39f0: 20 20 20 20 20 20 69 66 28 20 6e 41 75 74 6f 6d        if( nAutom
3a00: 65 72 67 65 3d 3d 31 20 29 20 6e 41 75 74 6f 6d  erge==1 ) nAutom
3a10: 65 72 67 65 20 3d 20 46 54 53 35 5f 44 45 46 41  erge = FTS5_DEFA
3a20: 55 4c 54 5f 41 55 54 4f 4d 45 52 47 45 3b 0a 20  ULT_AUTOMERGE;. 
3a30: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 41       pConfig->nA
3a40: 75 74 6f 6d 65 72 67 65 20 3d 20 6e 41 75 74 6f  utomerge = nAuto
3a50: 6d 65 72 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  merge;.    }.  }
3a60: 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d  ..  else if( 0==
3a70: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
3a80: 7a 4b 65 79 2c 20 22 72 61 6e 6b 22 29 20 29 7b  zKey, "rank") ){
3a90: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
3aa0: 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zIn = (const ch
3ab0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
3ac0: 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20  e_text(pVal);.  
3ad0: 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 3b 0a 20    char *zRank;. 
3ae0: 20 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72     char *zRankAr
3af0: 67 73 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  gs;.    rc = fts
3b00: 35 43 6f 6e 66 69 67 50 61 72 73 65 52 61 6e 6b  5ConfigParseRank
3b10: 28 7a 49 6e 2c 20 26 7a 52 61 6e 6b 2c 20 26 7a  (zIn, &zRank, &z
3b20: 52 61 6e 6b 41 72 67 73 29 3b 0a 20 20 20 20 69  RankArgs);.    i
3b30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3b40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3b50: 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e  3_free(pConfig->
3b60: 7a 52 61 6e 6b 29 3b 0a 20 20 20 20 20 20 73 71  zRank);.      sq
3b70: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
3b80: 69 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 29 3b 0a  ig->zRankArgs);.
3b90: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
3ba0: 52 61 6e 6b 20 3d 20 7a 52 61 6e 6b 3b 0a 20 20  Rank = zRank;.  
3bb0: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 52 61      pConfig->zRa
3bc0: 6e 6b 41 72 67 73 20 3d 20 7a 52 61 6e 6b 41 72  nkArgs = zRankAr
3bd0: 67 73 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  gs;.    }else if
3be0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
3bf0: 4f 52 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OR ){.      rc =
3c00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3c10: 20 20 69 66 28 20 70 62 42 61 64 6b 65 79 20 29    if( pbBadkey )
3c20: 20 2a 70 62 42 61 64 6b 65 79 20 3d 20 31 3b 0a   *pbBadkey = 1;.
3c30: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
3c40: 20 20 20 69 66 28 20 70 62 42 61 64 6b 65 79 20     if( pbBadkey 
3c50: 29 20 2a 70 62 42 61 64 6b 65 79 20 3d 20 31 3b  ) *pbBadkey = 1;
3c60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
3c80: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3c90: 74 68 65 20 25 5f 63 6f 6e 66 69 67 20 74 61 62  the %_config tab
3ca0: 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  le into memory..
3cb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
3cc0: 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 46 74 73  s5ConfigLoad(Fts
3cd0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
3ce0: 2c 20 69 6e 74 20 69 43 6f 6f 6b 69 65 29 7b 0a  , int iCookie){.
3cf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
3d00: 65 6c 65 63 74 20 3d 20 22 53 45 4c 45 43 54 20  elect = "SELECT 
3d10: 6b 2c 20 76 20 46 52 4f 4d 20 25 51 2e 27 25 71  k, v FROM %Q.'%q
3d20: 5f 63 6f 6e 66 69 67 27 22 3b 0a 20 20 63 68 61  _config'";.  cha
3d30: 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74  r *zSql;.  sqlit
3d40: 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 30 3b 0a  e3_stmt *p = 0;.
3d50: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
3d60: 53 65 74 20 64 65 66 61 75 6c 74 20 76 61 6c 75  Set default valu
3d70: 65 73 20 2a 2f 0a 20 20 70 43 6f 6e 66 69 67 2d  es */.  pConfig-
3d80: 3e 70 67 73 7a 20 3d 20 46 54 53 35 5f 44 45 46  >pgsz = FTS5_DEF
3d90: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
3da0: 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f    pConfig->nAuto
3db0: 6d 65 72 67 65 20 3d 20 46 54 53 35 5f 44 45 46  merge = FTS5_DEF
3dc0: 41 55 4c 54 5f 41 55 54 4f 4d 45 52 47 45 3b 0a  AULT_AUTOMERGE;.
3dd0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
3de0: 33 5f 6d 70 72 69 6e 74 66 28 7a 53 65 6c 65 63  3_mprintf(zSelec
3df0: 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c  t, pConfig->zDb,
3e00: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29   pConfig->zName)
3e10: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
3e20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
3e30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
3e40: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
3e50: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
3e60: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c  Config->db, zSql
3e70: 2c 20 2d 31 2c 20 26 70 2c 20 30 29 3b 0a 20 20  , -1, &p, 0);.  
3e80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3e90: 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Sql);.  }..  ass
3ea0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
3eb0: 4f 4b 20 7c 7c 20 70 3d 3d 30 20 29 3b 0a 20 20  OK || p==0 );.  
3ec0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3ed0: 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  K ){.    while( 
3ee0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
3ef0: 74 65 33 5f 73 74 65 70 28 70 29 20 29 7b 0a 20  te3_step(p) ){. 
3f00: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
3f10: 2a 7a 4b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  *zK = (const cha
3f20: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
3f30: 6e 5f 74 65 78 74 28 70 2c 20 30 29 3b 0a 20 20  n_text(p, 0);.  
3f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
3f50: 65 20 2a 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  e *pVal = sqlite
3f60: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
3f70: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
3f80: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74  te3Fts5ConfigSet
3f90: 56 61 6c 75 65 28 70 43 6f 6e 66 69 67 2c 20 7a  Value(pConfig, z
3fa0: 4b 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  K, pVal, 0);.   
3fb0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
3fc0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 29 3b  te3_finalize(p);
3fd0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
3fe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3ff0: 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69   pConfig->iCooki
4000: 65 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 7d  e = iCookie;.  }
4010: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4020: 0a                                               .