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

Artifact 11f969ed711a0a8b611d47431d74c372ad78c713:


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 66 64 65 66 20 53  ch..*/..#ifdef S
01c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
01d0: 35 0a 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 74  5...#include "ft
01e0: 73 35 49 6e 74 2e 68 22 0a 0a 23 64 65 66 69 6e  s5Int.h"..#defin
01f0: 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 50  e FTS5_DEFAULT_P
0200: 41 47 45 5f 53 49 5a 45 20 20 20 31 30 30 30 0a  AGE_SIZE   1000.
0210: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46  #define FTS5_DEF
0220: 41 55 4c 54 5f 41 55 54 4f 4d 45 52 47 45 20 20  AULT_AUTOMERGE  
0230: 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 46 54      4.#define FT
0240: 53 35 5f 44 45 46 41 55 4c 54 5f 43 52 49 53 49  S5_DEFAULT_CRISI
0250: 53 4d 45 52 47 45 20 20 20 31 36 0a 0a 2f 2a 20  SMERGE   16../* 
0260: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
0270: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 23 64 65  page size */.#de
0280: 66 69 6e 65 20 46 54 53 35 5f 4d 41 58 5f 50 41  fine FTS5_MAX_PA
0290: 47 45 5f 53 49 5a 45 20 28 31 32 38 2a 31 30 32  GE_SIZE (128*102
02a0: 34 29 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  4)..static int f
02b0: 74 73 35 5f 69 73 77 68 69 74 65 73 70 61 63 65  ts5_iswhitespace
02c0: 28 63 68 61 72 20 78 29 7b 0a 20 20 72 65 74 75  (char x){.  retu
02d0: 72 6e 20 28 78 3d 3d 27 20 27 29 3b 0a 7d 0a 0a  rn (x==' ');.}..
02e0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 5f  static int fts5_
02f0: 69 73 6f 70 65 6e 71 75 6f 74 65 28 63 68 61 72  isopenquote(char
0300: 20 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 78   x){.  return (x
0310: 3d 3d 27 22 27 20 7c 7c 20 78 3d 3d 27 5c 27 27  =='"' || x=='\''
0320: 20 7c 7c 20 78 3d 3d 27 5b 27 20 7c 7c 20 78 3d   || x=='[' || x=
0330: 3d 27 60 27 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ='`');.}../*.** 
0340: 41 72 67 75 6d 65 6e 74 20 70 49 6e 20 70 6f 69  Argument pIn poi
0350: 6e 74 73 20 74 6f 20 61 20 63 68 61 72 61 63 74  nts to a charact
0360: 65 72 20 74 68 61 74 20 69 73 20 70 61 72 74 20  er that is part 
0370: 6f 66 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  of a nul-termina
0380: 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e 67 2e 20  ted .** string. 
0390: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
03a0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68   to the first ch
03b0: 61 72 61 63 74 65 72 20 66 6f 6c 6c 6f 77 69 6e  aracter followin
03c0: 67 20 2a 70 49 6e 20 69 6e 20 0a 2a 2a 20 74 68  g *pIn in .** th
03d0: 65 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  e string that is
03e0: 20 6e 6f 74 20 61 20 77 68 69 74 65 2d 73 70 61   not a white-spa
03f0: 63 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  ce character..*/
0400: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
0410: 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b  ar *fts5ConfigSk
0420: 69 70 57 68 69 74 65 73 70 61 63 65 28 63 6f 6e  ipWhitespace(con
0430: 73 74 20 63 68 61 72 20 2a 70 49 6e 29 7b 0a 20  st char *pIn){. 
0440: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d   const char *p =
0450: 20 70 49 6e 3b 0a 20 20 69 66 28 20 70 20 29 7b   pIn;.  if( p ){
0460: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
0470: 5f 69 73 77 68 69 74 65 73 70 61 63 65 28 2a 70  _iswhitespace(*p
0480: 29 20 29 7b 20 70 2b 2b 3b 20 7d 0a 20 20 7d 0a  ) ){ p++; }.  }.
0490: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
04a0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49  *.** Argument pI
04b0: 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 63 68  n points to a ch
04c0: 61 72 61 63 74 65 72 20 74 68 61 74 20 69 73 20  aracter that is 
04d0: 70 61 72 74 20 6f 66 20 61 20 6e 75 6c 2d 74 65  part of a nul-te
04e0: 72 6d 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74 72  rminated .** str
04f0: 69 6e 67 2e 20 52 65 74 75 72 6e 20 61 20 70 6f  ing. Return a po
0500: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
0510: 73 74 20 63 68 61 72 61 63 74 65 72 20 66 6f 6c  st character fol
0520: 6c 6f 77 69 6e 67 20 2a 70 49 6e 20 69 6e 20 0a  lowing *pIn in .
0530: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 74 68  ** the string th
0540: 61 74 20 69 73 20 6e 6f 74 20 61 20 22 62 61 72  at is not a "bar
0550: 65 77 6f 72 64 22 20 63 68 61 72 61 63 74 65 72  eword" character
0560: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
0570: 74 20 63 68 61 72 20 2a 66 74 73 35 43 6f 6e 66  t char *fts5Conf
0580: 69 67 53 6b 69 70 42 61 72 65 77 6f 72 64 28 63  igSkipBareword(c
0590: 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 29 7b  onst char *pIn){
05a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
05b0: 20 3d 20 70 49 6e 3b 0a 20 20 77 68 69 6c 65 20   = pIn;.  while 
05c0: 28 20 73 71 6c 69 74 65 33 46 74 73 35 49 73 42  ( sqlite3Fts5IsB
05d0: 61 72 65 77 6f 72 64 28 2a 70 29 20 29 20 70 2b  areword(*p) ) p+
05e0: 2b 3b 0a 20 20 69 66 28 20 70 3d 3d 70 49 6e 20  +;.  if( p==pIn 
05f0: 29 20 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ) p = 0;.  retur
0600: 6e 20 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n p;.}..static i
0610: 6e 74 20 66 74 73 35 5f 69 73 64 69 67 69 74 28  nt fts5_isdigit(
0620: 63 68 61 72 20 61 29 7b 0a 20 20 72 65 74 75 72  char a){.  retur
0630: 6e 20 28 61 3e 3d 27 30 27 20 26 26 20 61 3c 3d  n (a>='0' && a<=
0640: 27 39 27 29 3b 0a 7d 0a 0a 0a 0a 73 74 61 74 69  '9');.}....stati
0650: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 74  c const char *ft
0660: 73 35 43 6f 6e 66 69 67 53 6b 69 70 4c 69 74 65  s5ConfigSkipLite
0670: 72 61 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ral(const char *
0680: 70 49 6e 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  pIn){.  const ch
0690: 61 72 20 2a 70 20 3d 20 70 49 6e 3b 0a 20 20 73  ar *p = pIn;.  s
06a0: 77 69 74 63 68 28 20 2a 70 20 29 7b 0a 20 20 20  witch( *p ){.   
06b0: 20 63 61 73 65 20 27 6e 27 3a 20 63 61 73 65 20   case 'n': case 
06c0: 27 4e 27 3a 0a 20 20 20 20 20 20 69 66 28 20 73  'N':.      if( s
06d0: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
06e0: 22 6e 75 6c 6c 22 2c 20 70 2c 20 34 29 3d 3d 30  "null", p, 4)==0
06f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20   ){.        p = 
0700: 26 70 5b 34 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  &p[4];.      }el
0710: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  se{.        p = 
0720: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
0730: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
0740: 65 20 27 78 27 3a 20 63 61 73 65 20 27 58 27 3a  e 'x': case 'X':
0750: 0a 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20  .      p++;.    
0760: 20 20 69 66 28 20 2a 70 3d 3d 27 5c 27 27 20 29    if( *p=='\'' )
0770: 7b 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20  {.        p++;. 
0780: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 2a         while( (*
0790: 70 3e 3d 27 61 27 20 26 26 20 2a 70 3c 3d 27 66  p>='a' && *p<='f
07a0: 27 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ') .            
07b0: 7c 7c 20 28 2a 70 3e 3d 27 41 27 20 26 26 20 2a  || (*p>='A' && *
07c0: 70 3c 3d 27 46 27 29 20 0a 20 20 20 20 20 20 20  p<='F') .       
07d0: 20 20 20 20 20 7c 7c 20 28 2a 70 3e 3d 27 30 27       || (*p>='0'
07e0: 20 26 26 20 2a 70 3c 3d 27 39 27 29 20 0a 20 20   && *p<='9') .  
07f0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
0800: 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20         p++;.    
0810: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
0820: 28 20 2a 70 3d 3d 27 5c 27 27 20 26 26 20 30 3d  ( *p=='\'' && 0=
0830: 3d 28 28 70 2d 70 49 6e 29 25 32 29 20 29 7b 0a  =((p-pIn)%2) ){.
0840: 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20            p++;. 
0850: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
0860: 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b 0a 20          p = 0;. 
0870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
0880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20  else{.        p 
0890: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
08a0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
08b0: 61 73 65 20 27 5c 27 27 3a 0a 20 20 20 20 20 20  ase '\'':.      
08c0: 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  p++;.      while
08d0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ( p ){.        i
08e0: 66 28 20 2a 70 3d 3d 27 5c 27 27 20 29 7b 0a 20  f( *p=='\'' ){. 
08f0: 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20           p++;.  
0900: 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 21 3d          if( *p!=
0910: 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  '\'' ) break;.  
0920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0930: 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  p++;.        if(
0940: 20 2a 70 3d 3d 30 20 29 20 70 20 3d 20 30 3b 0a   *p==0 ) p = 0;.
0950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
0960: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
0970: 74 3a 0a 20 20 20 20 20 20 2f 2a 20 6d 61 79 62  t:.      /* mayb
0980: 65 20 61 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  e a number */.  
0990: 20 20 20 20 69 66 28 20 2a 70 3d 3d 27 2b 27 20      if( *p=='+' 
09a0: 7c 7c 20 2a 70 3d 3d 27 2d 27 20 29 20 70 2b 2b  || *p=='-' ) p++
09b0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 66  ;.      while( f
09c0: 74 73 35 5f 69 73 64 69 67 69 74 28 2a 70 29 20  ts5_isdigit(*p) 
09d0: 29 20 70 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  ) p++;..      /*
09e0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
09f0: 69 66 20 74 68 65 20 6c 69 74 65 72 61 6c 20 77  if the literal w
0a00: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  as an integer, t
0a10: 68 65 20 70 61 72 73 65 20 69 73 20 0a 20 20 20  he parse is .   
0a20: 20 20 20 2a 2a 20 66 69 6e 69 73 68 65 64 2e 20     ** finished. 
0a30: 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61 20 66  Or, if it is a f
0a40: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
0a50: 6c 75 65 2c 20 69 74 20 6d 61 79 20 63 6f 6e 74  lue, it may cont
0a60: 69 6e 75 65 0a 20 20 20 20 20 20 2a 2a 20 77 69  inue.      ** wi
0a70: 74 68 20 65 69 74 68 65 72 20 61 20 64 65 63 69  th either a deci
0a80: 6d 61 6c 20 70 6f 69 6e 74 20 6f 72 20 61 6e 20  mal point or an 
0a90: 27 45 27 20 63 68 61 72 61 63 74 65 72 2e 20 2a  'E' character. *
0aa0: 2f 0a 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d  /.      if( *p==
0ab0: 27 2e 27 20 26 26 20 66 74 73 35 5f 69 73 64 69  '.' && fts5_isdi
0ac0: 67 69 74 28 70 5b 31 5d 29 20 29 7b 0a 20 20 20  git(p[1]) ){.   
0ad0: 20 20 20 20 20 70 20 2b 3d 20 32 3b 0a 20 20 20       p += 2;.   
0ae0: 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35       while( fts5
0af0: 5f 69 73 64 69 67 69 74 28 2a 70 29 20 29 20 70  _isdigit(*p) ) p
0b00: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
0b10: 20 20 69 66 28 20 70 3d 3d 70 49 6e 20 29 20 70    if( p==pIn ) p
0b20: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 62 72 65   = 0;..      bre
0b30: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
0b40: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n p;.}../*.** Th
0b50: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
0b60: 72 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  r of the string 
0b70: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72  pointed to by ar
0b80: 67 75 6d 65 6e 74 20 7a 20 69 73 20 67 75 61 72  gument z is guar
0b90: 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
0ba0: 61 6e 20 6f 70 65 6e 2d 71 75 6f 74 65 20 63 68  an open-quote ch
0bb0: 61 72 61 63 74 65 72 20 28 73 65 65 20 66 75 6e  aracter (see fun
0bc0: 63 74 69 6f 6e 20 66 74 73 35 5f 69 73 6f 70 65  ction fts5_isope
0bd0: 6e 71 75 6f 74 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  nquote())..**.**
0be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
0bf0: 65 61 72 63 68 65 73 20 66 6f 72 20 74 68 65 20  earches for the 
0c00: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6c  corresponding cl
0c10: 6f 73 65 2d 71 75 6f 74 65 20 63 68 61 72 61 63  ose-quote charac
0c20: 74 65 72 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  ter within.** th
0c30: 65 20 73 74 72 69 6e 67 20 61 6e 64 2c 20 69 66  e string and, if
0c40: 20 66 6f 75 6e 64 2c 20 64 65 71 75 6f 74 65 73   found, dequotes
0c50: 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 70   the string in p
0c60: 6c 61 63 65 20 61 6e 64 20 61 64 64 73 20 61 20  lace and adds a 
0c70: 6e 65 77 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  new.** nul-termi
0c80: 6e 61 74 6f 72 20 62 79 74 65 2e 0a 2a 2a 0a 2a  nator byte..**.*
0c90: 2a 20 49 66 20 74 68 65 20 63 6c 6f 73 65 2d 71  * If the close-q
0ca0: 75 6f 74 65 20 69 73 20 66 6f 75 6e 64 2c 20 74  uote is found, t
0cb0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
0cc0: 64 20 69 73 20 74 68 65 20 62 79 74 65 20 6f 66  d is the byte of
0cd0: 66 73 65 74 20 6f 66 0a 2a 2a 20 74 68 65 20 63  fset of.** the c
0ce0: 68 61 72 61 63 74 65 72 20 69 6d 6d 65 64 69 61  haracter immedia
0cf0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tely following i
0d00: 74 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6c  t. Or, if the cl
0d10: 6f 73 65 2d 71 75 6f 74 65 20 69 73 20 6e 6f 74  ose-quote is not
0d20: 20 0a 2a 2a 20 66 6f 75 6e 64 2c 20 2d 31 20 69   .** found, -1 i
0d30: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 2d  s returned. If -
0d40: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  1 is returned, t
0d50: 68 65 20 62 75 66 66 65 72 20 69 73 20 6c 65 66  he buffer is lef
0d60: 74 20 69 6e 20 61 6e 20 0a 2a 2a 20 75 6e 64 65  t in an .** unde
0d70: 66 69 6e 65 64 20 73 74 61 74 65 2e 0a 2a 2f 0a  fined state..*/.
0d80: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
0d90: 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b  equote(char *z){
0da0: 0a 20 20 63 68 61 72 20 71 3b 0a 20 20 69 6e 74  .  char q;.  int
0db0: 20 69 49 6e 20 3d 20 31 3b 0a 20 20 69 6e 74 20   iIn = 1;.  int 
0dc0: 69 4f 75 74 20 3d 20 30 3b 0a 20 20 71 20 3d 20  iOut = 0;.  q = 
0dd0: 7a 5b 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  z[0];..  /* Set 
0de0: 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 71  stack variable q
0df0: 20 74 6f 20 74 68 65 20 63 6c 6f 73 65 2d 71 75   to the close-qu
0e00: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 2a 2f  ote character */
0e10: 0a 20 20 61 73 73 65 72 74 28 20 71 3d 3d 27 5b  .  assert( q=='[
0e20: 27 20 7c 7c 20 71 3d 3d 27 5c 27 27 20 7c 7c 20  ' || q=='\'' || 
0e30: 71 3d 3d 27 22 27 20 7c 7c 20 71 3d 3d 27 60 27  q=='"' || q=='`'
0e40: 20 29 3b 0a 20 20 69 66 28 20 71 3d 3d 27 5b 27   );.  if( q=='['
0e50: 20 29 20 71 20 3d 20 27 5d 27 3b 20 20 0a 0a 20   ) q = ']';  .. 
0e60: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 7a   while( ALWAYS(z
0e70: 5b 69 49 6e 5d 29 20 29 7b 0a 20 20 20 20 69 66  [iIn]) ){.    if
0e80: 28 20 7a 5b 69 49 6e 5d 3d 3d 71 20 29 7b 0a 20  ( z[iIn]==q ){. 
0e90: 20 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 2b 31       if( z[iIn+1
0ea0: 5d 21 3d 71 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=q ){.        
0eb0: 2f 2a 20 43 68 61 72 61 63 74 65 72 20 69 49 6e  /* Character iIn
0ec0: 20 77 61 73 20 74 68 65 20 63 6c 6f 73 65 20 71   was the close q
0ed0: 75 6f 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uote. */.       
0ee0: 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
0ef0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
0f00: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  se{.        /* C
0f10: 68 61 72 61 63 74 65 72 20 69 49 6e 20 61 6e 64  haracter iIn and
0f20: 20 69 49 6e 2b 31 20 66 6f 72 6d 20 61 6e 20 65   iIn+1 form an e
0f30: 73 63 61 70 65 64 20 71 75 6f 74 65 20 63 68 61  scaped quote cha
0f40: 72 61 63 74 65 72 2e 20 53 6b 69 70 0a 20 20 20  racter. Skip.   
0f50: 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 70 75       ** the inpu
0f60: 74 20 63 75 72 73 6f 72 20 70 61 73 74 20 62 6f  t cursor past bo
0f70: 74 68 20 61 6e 64 20 63 6f 70 79 20 61 20 73 69  th and copy a si
0f80: 6e 67 6c 65 20 71 75 6f 74 65 20 63 68 61 72 61  ngle quote chara
0f90: 63 74 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  cter .        **
0fa0: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
0fb0: 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  uffer. */.      
0fc0: 20 20 69 49 6e 20 2b 3d 20 32 3b 0a 20 20 20 20    iIn += 2;.    
0fd0: 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20      z[iOut++] = 
0fe0: 71 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  q;.      }.    }
0ff0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 69 4f  else{.      z[iO
1000: 75 74 2b 2b 5d 20 3d 20 7a 5b 69 49 6e 2b 2b 5d  ut++] = z[iIn++]
1010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 7a  ;.    }.  }..  z
1020: 5b 69 4f 75 74 5d 20 3d 20 27 5c 30 27 3b 0a 20  [iOut] = '\0';. 
1030: 20 72 65 74 75 72 6e 20 69 49 6e 3b 0a 7d 0a 0a   return iIn;.}..
1040: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
1050: 20 53 51 4c 2d 73 74 79 6c 65 20 71 75 6f 74 65   SQL-style quote
1060: 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  d string into a 
1070: 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67 20 62 79  normal string by
1080: 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74 68 65   removing.** the
1090: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
10a0: 73 2e 20 20 54 68 65 20 63 6f 6e 76 65 72 73 69  s.  The conversi
10b0: 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c  on is done in-pl
10c0: 61 63 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ace.  If the.** 
10d0: 69 6e 70 75 74 20 64 6f 65 73 20 6e 6f 74 20 62  input does not b
10e0: 65 67 69 6e 20 77 69 74 68 20 61 20 71 75 6f 74  egin with a quot
10f0: 65 20 63 68 61 72 61 63 74 65 72 2c 20 74 68 65  e character, the
1100: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1110: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  * is a no-op..**
1120: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  .** Examples:.**
1130: 0a 2a 2a 20 20 20 20 20 22 61 62 63 22 20 20 20  .**     "abc"   
1140: 62 65 63 6f 6d 65 73 20 20 20 61 62 63 0a 2a 2a  becomes   abc.**
1150: 20 20 20 20 20 27 78 79 7a 27 20 20 20 62 65 63       'xyz'   bec
1160: 6f 6d 65 73 20 20 20 78 79 7a 0a 2a 2a 20 20 20  omes   xyz.**   
1170: 20 20 5b 70 71 72 5d 20 20 20 62 65 63 6f 6d 65    [pqr]   become
1180: 73 20 20 20 70 71 72 0a 2a 2a 20 20 20 20 20 60  s   pqr.**     `
1190: 6d 6e 6f 60 20 20 20 62 65 63 6f 6d 65 73 20 20  mno`   becomes  
11a0: 20 6d 6e 6f 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   mno.*/.void sql
11b0: 69 74 65 33 46 74 73 35 44 65 71 75 6f 74 65 28  ite3Fts5Dequote(
11c0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72  char *z){.  char
11d0: 20 71 75 6f 74 65 3b 20 20 20 20 20 20 20 20 20   quote;         
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
11f0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 28  uote character (
1200: 69 66 20 61 6e 79 20 29 20 2a 2f 0a 0a 20 20 61  if any ) */..  a
1210: 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 5f 69  ssert( 0==fts5_i
1220: 73 77 68 69 74 65 73 70 61 63 65 28 7a 5b 30 5d  swhitespace(z[0]
1230: 29 20 29 3b 0a 20 20 71 75 6f 74 65 20 3d 20 7a  ) );.  quote = z
1240: 5b 30 5d 3b 0a 20 20 69 66 28 20 71 75 6f 74 65  [0];.  if( quote
1250: 3d 3d 27 5b 27 20 7c 7c 20 71 75 6f 74 65 3d 3d  =='[' || quote==
1260: 27 5c 27 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27  '\'' || quote=='
1270: 22 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 60 27  "' || quote=='`'
1280: 20 29 7b 0a 20 20 20 20 66 74 73 35 44 65 71 75   ){.    fts5Dequ
1290: 6f 74 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ote(z);.  }.}../
12a0: 2a 0a 2a 2a 20 50 61 72 73 65 20 74 68 65 20 22  *.** Parse the "
12b0: 73 70 65 63 69 61 6c 22 20 43 52 45 41 54 45 20  special" CREATE 
12c0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 69  VIRTUAL TABLE di
12d0: 72 65 63 74 69 76 65 20 61 6e 64 20 75 70 64 61  rective and upda
12e0: 74 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74  te.** configurat
12f0: 69 6f 6e 20 6f 62 6a 65 63 74 20 70 43 6f 6e 66  ion object pConf
1300: 69 67 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ig as appropriat
1310: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
1320: 65 73 73 66 75 6c 2c 20 6f 62 6a 65 63 74 20 70  essful, object p
1330: 43 6f 6e 66 69 67 20 69 73 20 75 70 64 61 74 65  Config is update
1340: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1350: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
1360: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1370: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1380: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1390: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
13a0: 65 73 73 61 67 65 0a 2a 2a 20 6d 61 79 20 62 65  essage.** may be
13b0: 20 6c 65 66 74 20 69 6e 20 2a 70 7a 45 72 72 2e   left in *pzErr.
13c0: 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
13d0: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
13e0: 20 63 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76   caller to.** ev
13f0: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 61 6e  entually free an
1400: 79 20 73 75 63 68 20 65 72 72 6f 72 20 6d 65 73  y such error mes
1410: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
1420: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
1430: 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e  atic int fts5Con
1440: 66 69 67 50 61 72 73 65 53 70 65 63 69 61 6c 28  figParseSpecial(
1450: 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  .  Fts5Global *p
1460: 47 6c 6f 62 61 6c 2c 0a 20 20 46 74 73 35 43 6f  Global,.  Fts5Co
1470: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20  nfig *pConfig,  
1480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1490: 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63  figuration objec
14a0: 74 20 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20  t to update */. 
14b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
14c0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
14d0: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d   /* Special comm
14e0: 61 6e 64 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  and to parse */.
14f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
1500: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
1510: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
1520: 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 68 61 72   parse */.  char
1530: 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20   **pzErr        
1540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1550: 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  UT: Error messag
1560: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  e */.){.  int nC
1570: 6d 64 20 3d 20 73 74 72 6c 65 6e 28 7a 43 6d 64  md = strlen(zCmd
1580: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1590: 5f 73 74 72 6e 69 63 6d 70 28 22 70 72 65 66 69  _strnicmp("prefi
15a0: 78 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d  x", zCmd, nCmd)=
15b0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
15c0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
15d0: 6f 66 28 69 6e 74 29 20 2a 20 46 54 53 35 5f 4d  of(int) * FTS5_M
15e0: 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45  AX_PREFIX_INDEXE
15f0: 53 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  S;.    int rc = 
1600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 63  SQLITE_OK;.    c
1610: 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a 20 20  onst char *p;.  
1620: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
1630: 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
1640: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
1650: 5f 6d 70 72 69 6e 74 66 28 22 6d 75 6c 74 69 70  _mprintf("multip
1660: 6c 65 20 70 72 65 66 69 78 3d 2e 2e 2e 20 64 69  le prefix=... di
1670: 72 65 63 74 69 76 65 73 22 29 3b 0a 20 20 20 20  rectives");.    
1680: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1690: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
16a0: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 61        pConfig->a
16b0: 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33  Prefix = sqlite3
16c0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
16d0: 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
16e0: 7d 0a 20 20 20 20 70 20 3d 20 7a 41 72 67 3b 0a  }.    p = zArg;.
16f0: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
1700: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 5b 30 5d  QLITE_OK && p[0]
1710: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1720: 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  re = 0;.      wh
1730: 69 6c 65 28 20 70 5b 30 5d 3d 3d 27 20 27 20 29  ile( p[0]==' ' )
1740: 20 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c   p++;.      whil
1750: 65 28 20 70 5b 30 5d 3e 3d 27 30 27 20 26 26 20  e( p[0]>='0' && 
1760: 70 5b 30 5d 3c 3d 27 39 27 20 26 26 20 6e 50 72  p[0]<='9' && nPr
1770: 65 3c 31 30 30 30 20 29 7b 0a 20 20 20 20 20 20  e<1000 ){.      
1780: 20 20 6e 50 72 65 20 3d 20 6e 50 72 65 2a 31 30    nPre = nPre*10
1790: 20 2b 20 28 70 5b 30 5d 20 2d 20 27 30 27 29 3b   + (p[0] - '0');
17a0: 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20  .        p++;.  
17b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
17c0: 65 28 20 70 5b 30 5d 3d 3d 27 20 27 20 29 20 70  e( p[0]==' ' ) p
17d0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 5b  ++;.      if( p[
17e0: 30 5d 3d 3d 27 2c 27 20 29 7b 0a 20 20 20 20 20  0]==',' ){.     
17f0: 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 65     p++;.      }e
1800: 6c 73 65 20 69 66 28 20 70 5b 30 5d 20 29 7b 0a  lse if( p[0] ){.
1810: 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d          *pzErr =
1820: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1830: 28 22 6d 61 6c 66 6f 72 6d 65 64 20 70 72 65 66  ("malformed pref
1840: 69 78 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65  ix=... directive
1850: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
1860: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1880: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1890: 26 20 28 6e 50 72 65 3d 3d 30 20 7c 7c 20 6e 50  & (nPre==0 || nP
18a0: 72 65 3e 3d 31 30 30 30 29 20 29 7b 0a 20 20 20  re>=1000) ){.   
18b0: 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
18c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 70  lite3_mprintf("p
18d0: 72 65 66 69 78 20 6c 65 6e 67 74 68 20 6f 75 74  refix length out
18e0: 20 6f 66 20 72 61 6e 67 65 3a 20 25 64 22 2c 20   of range: %d", 
18f0: 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 20 20 72  nPre);.        r
1900: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1920: 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
1930: 5b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  [pConfig->nPrefi
1940: 78 5d 20 3d 20 6e 50 72 65 3b 0a 20 20 20 20 20  x] = nPre;.     
1950: 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69   pConfig->nPrefi
1960: 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  x++;.    }.    r
1970: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1980: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1990: 6e 69 63 6d 70 28 22 74 6f 6b 65 6e 69 7a 65 22  nicmp("tokenize"
19a0: 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30  , zCmd, nCmd)==0
19b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
19c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
19e0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 41 72  (const char*)zAr
19f0: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20  g;.    int nArg 
1a00: 3d 20 73 74 72 6c 65 6e 28 7a 41 72 67 29 20 2b  = strlen(zArg) +
1a10: 20 31 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   1;.    char **a
1a20: 7a 41 72 67 20 3d 20 73 71 6c 69 74 65 33 46 74  zArg = sqlite3Ft
1a30: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
1a40: 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  , sizeof(char*) 
1a50: 2a 20 6e 41 72 67 29 3b 0a 20 20 20 20 63 68 61  * nArg);.    cha
1a60: 72 20 2a 70 44 65 6c 20 3d 20 73 71 6c 69 74 65  r *pDel = sqlite
1a70: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
1a80: 26 72 63 2c 20 6e 41 72 67 20 2a 20 32 29 3b 0a  &rc, nArg * 2);.
1a90: 20 20 20 20 63 68 61 72 20 2a 70 53 70 61 63 65      char *pSpace
1aa0: 20 3d 20 70 44 65 6c 3b 0a 0a 20 20 20 20 69 66   = pDel;..    if
1ab0: 28 20 61 7a 41 72 67 20 26 26 20 70 53 70 61 63  ( azArg && pSpac
1ac0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
1ad0: 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 20 29 7b 0a  Config->pTok ){.
1ae0: 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d          *pzErr =
1af0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1b00: 28 22 6d 75 6c 74 69 70 6c 65 20 74 6f 6b 65 6e  ("multiple token
1b10: 69 7a 65 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76  ize=... directiv
1b20: 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  es");.        rc
1b30: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1b40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b50: 20 20 20 20 20 20 66 6f 72 28 6e 41 72 67 3d 30        for(nArg=0
1b60: 3b 20 70 20 26 26 20 2a 70 3b 20 6e 41 72 67 2b  ; p && *p; nArg+
1b70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  +){.          co
1b80: 6e 73 74 20 63 68 61 72 20 2a 70 32 20 3d 20 66  nst char *p2 = f
1b90: 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69  ts5ConfigSkipWhi
1ba0: 74 65 73 70 61 63 65 28 70 29 3b 0a 20 20 20 20  tespace(p);.    
1bb0: 20 20 20 20 20 20 69 66 28 20 2a 70 32 3d 3d 27        if( *p2=='
1bc0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \'' ){.         
1bd0: 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69     p = fts5Confi
1be0: 67 53 6b 69 70 4c 69 74 65 72 61 6c 28 70 32 29  gSkipLiteral(p2)
1bf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1c00: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
1c10: 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69   = fts5ConfigSki
1c20: 70 42 61 72 65 77 6f 72 64 28 70 32 29 3b 0a 20  pBareword(p2);. 
1c30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c40: 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20       if( p ){.  
1c50: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1c60: 28 70 53 70 61 63 65 2c 20 70 32 2c 20 70 2d 70  (pSpace, p2, p-p
1c70: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
1c80: 61 7a 41 72 67 5b 6e 41 72 67 5d 20 3d 20 70 53  azArg[nArg] = pS
1c90: 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 20 20  pace;.          
1ca0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71    sqlite3Fts5Deq
1cb0: 75 6f 74 65 28 70 53 70 61 63 65 29 3b 0a 20 20  uote(pSpace);.  
1cc0: 20 20 20 20 20 20 20 20 20 20 70 53 70 61 63 65            pSpace
1cd0: 20 2b 3d 20 28 70 20 2d 20 70 32 29 20 2b 20 31   += (p - p2) + 1
1ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 20  ;.            p 
1cf0: 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70  = fts5ConfigSkip
1d00: 57 68 69 74 65 73 70 61 63 65 28 70 29 3b 0a 20  Whitespace(p);. 
1d10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1d30: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   p==0 ){.       
1d40: 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
1d50: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 70 61 72  te3_mprintf("par
1d60: 73 65 20 65 72 72 6f 72 20 69 6e 20 74 6f 6b 65  se error in toke
1d70: 6e 69 7a 65 20 64 69 72 65 63 74 69 76 65 22 29  nize directive")
1d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1d90: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1da0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1db0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1dc0: 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b 65 6e  ite3Fts5GetToken
1dd0: 69 7a 65 72 28 70 47 6c 6f 62 61 6c 2c 20 0a 20  izer(pGlobal, . 
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
1df0: 6e 73 74 20 63 68 61 72 2a 2a 29 61 7a 41 72 67  nst char**)azArg
1e00: 2c 20 6e 41 72 67 2c 20 26 70 43 6f 6e 66 69 67  , nArg, &pConfig
1e10: 2d 3e 70 54 6f 6b 2c 20 26 70 43 6f 6e 66 69 67  ->pTok, &pConfig
1e20: 2d 3e 70 54 6f 6b 41 70 69 2c 0a 20 20 20 20 20  ->pTokApi,.     
1e30: 20 20 20 20 20 20 20 20 20 70 7a 45 72 72 0a 20           pzErr. 
1e40: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e60: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
1e70: 5f 66 72 65 65 28 61 7a 41 72 67 29 3b 0a 20 20  _free(azArg);.  
1e80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e90: 44 65 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Del);.    return
1ea0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
1eb0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
1ec0: 28 22 63 6f 6e 74 65 6e 74 22 2c 20 7a 43 6d 64  ("content", zCmd
1ed0: 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b 0a 20 20  , nCmd)==0 ){.  
1ee0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ef0: 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 70 43  E_OK;.    if( pC
1f00: 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 21  onfig->eContent!
1f10: 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f  =FTS5_CONTENT_NO
1f20: 52 4d 41 4c 20 29 7b 0a 20 20 20 20 20 20 2a 70  RMAL ){.      *p
1f30: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
1f40: 70 72 69 6e 74 66 28 22 6d 75 6c 74 69 70 6c 65  printf("multiple
1f50: 20 63 6f 6e 74 65 6e 74 3d 2e 2e 2e 20 64 69 72   content=... dir
1f60: 65 63 74 69 76 65 73 22 29 3b 0a 20 20 20 20 20  ectives");.     
1f70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1f80: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
1f90: 20 20 20 20 20 69 66 28 20 7a 41 72 67 5b 30 5d       if( zArg[0]
1fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
1fb0: 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 20 3d 20  fig->eContent = 
1fc0: 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 45 58 54  FTS5_CONTENT_EXT
1fd0: 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 70  ERNAL;.        p
1fe0: 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74  Config->zContent
1ff0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2000: 74 66 28 22 25 51 2e 25 51 22 2c 20 70 43 6f 6e  tf("%Q.%Q", pCon
2010: 66 69 67 2d 3e 7a 44 62 2c 20 7a 41 72 67 29 3b  fig->zDb, zArg);
2020: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2030: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 65        pConfig->e
2040: 43 6f 6e 74 65 6e 74 20 3d 20 46 54 53 35 5f 43  Content = FTS5_C
2050: 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 3b 0a 20 20 20  ONTENT_NONE;.   
2060: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 43       pConfig->zC
2070: 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  ontent = sqlite3
2080: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
2090: 20 20 20 20 20 20 22 25 51 2e 27 25 71 5f 64 6f        "%Q.'%q_do
20a0: 63 73 69 7a 65 27 22 2c 20 70 43 6f 6e 66 69 67  csize'", pConfig
20b0: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
20c0: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  zName.        );
20d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20e0: 66 28 20 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e  f( pConfig->zCon
20f0: 74 65 6e 74 3d 3d 30 20 29 20 72 63 20 3d 20 53  tent==0 ) rc = S
2100: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2110: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
2120: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c  ;.  }..  if( sql
2130: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 63  ite3_strnicmp("c
2140: 6f 6e 74 65 6e 74 5f 72 6f 77 69 64 22 2c 20 7a  ontent_rowid", z
2150: 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b  Cmd, nCmd)==0 ){
2160: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
2170: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28  LITE_OK;.    if(
2180: 20 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65   pConfig->zConte
2190: 6e 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  ntRowid ){.     
21a0: 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
21b0: 33 5f 6d 70 72 69 6e 74 66 28 22 6d 75 6c 74 69  3_mprintf("multi
21c0: 70 6c 65 20 63 6f 6e 74 65 6e 74 5f 72 6f 77 69  ple content_rowi
21d0: 64 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 73  d=... directives
21e0: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ");.      rc = S
21f0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
2210: 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 52  onfig->zContentR
2220: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74  owid = sqlite3Ft
2230: 73 35 53 74 72 6e 64 75 70 28 26 72 63 2c 20 7a  s5Strndup(&rc, z
2240: 41 72 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  Arg, -1);.    }.
2250: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2260: 20 7d 0a 0a 20 20 2a 70 7a 45 72 72 20 3d 20 73   }..  *pzErr = s
2270: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2280: 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
2290: 69 6f 6e 3a 20 5c 22 25 2e 2a 73 5c 22 22 2c 20  ion: \"%.*s\"", 
22a0: 6e 43 6d 64 2c 20 7a 43 6d 64 29 3b 0a 20 20 72  nCmd, zCmd);.  r
22b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
22c0: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OR;.}../*.** All
22d0: 6f 63 61 74 65 20 61 6e 20 69 6e 73 74 61 6e 63  ocate an instanc
22e0: 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  e of the default
22f0: 20 74 6f 6b 65 6e 69 7a 65 72 20 28 22 73 69 6d   tokenizer ("sim
2300: 70 6c 65 22 29 20 61 74 20 0a 2a 2a 20 46 74 73  ple") at .** Fts
2310: 35 43 6f 6e 66 69 67 2e 70 54 6f 6b 65 6e 69 7a  5Config.pTokeniz
2320: 65 72 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  er. Return SQLIT
2330: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2340: 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
2350: 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
2360: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2370: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2380: 20 66 74 73 35 43 6f 6e 66 69 67 44 65 66 61 75   fts5ConfigDefau
2390: 6c 74 54 6f 6b 65 6e 69 7a 65 72 28 46 74 73 35  ltTokenizer(Fts5
23a0: 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c  Global *pGlobal,
23b0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
23c0: 6e 66 69 67 29 7b 0a 20 20 61 73 73 65 72 74 28  nfig){.  assert(
23d0: 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 3d 3d   pConfig->pTok==
23e0: 30 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e 70 54  0 && pConfig->pT
23f0: 6f 6b 41 70 69 3d 3d 30 20 29 3b 0a 20 20 72 65  okApi==0 );.  re
2400: 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35  turn sqlite3Fts5
2410: 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20  GetTokenizer(.  
2420: 20 20 20 20 70 47 6c 6f 62 61 6c 2c 20 30 2c 20      pGlobal, 0, 
2430: 30 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 70 54 6f  0, &pConfig->pTo
2440: 6b 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 70 54 6f  k, &pConfig->pTo
2450: 6b 41 70 69 2c 20 30 0a 20 20 29 3b 0a 7d 0a 0a  kApi, 0.  );.}..
2460: 2f 2a 0a 2a 2a 20 47 6f 62 62 6c 65 20 75 70 20  /*.** Gobble up 
2470: 74 68 65 20 66 69 72 73 74 20 62 61 72 65 77 6f  the first barewo
2480: 72 64 20 6f 72 20 71 75 6f 74 65 64 20 77 6f 72  rd or quoted wor
2490: 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
24a0: 20 62 75 66 66 65 72 20 7a 49 6e 2e 0a 2a 2a 20   buffer zIn..** 
24b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24c0: 20 74 6f 20 74 68 65 20 63 68 61 72 61 63 74 65   to the characte
24d0: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
24e0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
24f0: 20 69 6e 0a 2a 2a 20 74 68 65 20 67 6f 62 62 6c   in.** the gobbl
2500: 65 64 20 77 6f 72 64 20 69 66 20 73 75 63 63 65  ed word if succe
2510: 73 73 66 75 6c 2c 20 6f 72 20 61 20 4e 55 4c 4c  ssful, or a NULL
2520: 20 70 6f 69 6e 74 65 72 20 6f 74 68 65 72 77 69   pointer otherwi
2530: 73 65 20 28 66 61 69 6c 65 64 0a 2a 2a 20 74 6f  se (failed.** to
2540: 20 66 69 6e 64 20 63 6c 6f 73 65 2d 71 75 6f 74   find close-quot
2550: 65 20 63 68 61 72 61 63 74 65 72 29 2e 0a 2a 2a  e character)..**
2560: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
2570: 6e 69 6e 67 2c 20 73 65 74 20 70 7a 4f 75 74 20  ning, set pzOut 
2580: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e 65  to point to a ne
2590: 77 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  w buffer contain
25a0: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
25b0: 6d 69 6e 61 74 65 64 2c 20 64 65 71 75 6f 74 65  minated, dequote
25c0: 64 20 63 6f 70 79 20 6f 66 20 74 68 65 20 67 6f  d copy of the go
25d0: 62 62 6c 65 64 20 77 6f 72 64 2e 20 49 66 20 74  bbled word. If t
25e0: 68 65 20 77 6f 72 64 20 77 61 73 0a 2a 2a 20 71  he word was.** q
25f0: 75 6f 74 65 64 2c 20 2a 70 62 51 75 6f 74 65 64  uoted, *pbQuoted
2600: 20 69 73 20 61 6c 73 6f 20 73 65 74 20 74 6f 20   is also set to 
2610: 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  1 before returni
2620: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  ng..**.** If *pR
2630: 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20  c is other than 
2640: 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
2650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2660: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 0a 2a 2a  called, it is.**
2670: 20 61 20 6e 6f 2d 6f 70 20 28 4e 55 4c 4c 20 69   a no-op (NULL i
2680: 73 20 72 65 74 75 72 6e 65 64 29 2e 20 4f 74 68  s returned). Oth
2690: 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f  erwise, if an OO
26a0: 4d 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  M occurs within 
26b0: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
26c0: 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  , *pRc is set to
26d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65   SQLITE_NOMEM be
26e0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
26f0: 2a 70 52 63 20 69 73 20 2a 6e 6f 74 2a 0a 2a 2a  *pRc is *not*.**
2700: 20 73 65 74 20 69 66 20 61 20 70 61 72 73 65 20   set if a parse 
2710: 65 72 72 6f 72 20 28 66 61 69 6c 65 64 20 74 6f  error (failed to
2720: 20 66 69 6e 64 20 63 6c 6f 73 65 20 71 75 6f 74   find close quot
2730: 65 29 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  e) occurs..*/.st
2740: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2750: 2a 66 74 73 35 43 6f 6e 66 69 67 47 6f 62 62 6c  *fts5ConfigGobbl
2760: 65 57 6f 72 64 28 0a 20 20 69 6e 74 20 2a 70 52  eWord(.  int *pR
2770: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2780: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2790: 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
27a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
27b0: 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  zIn,            
27c0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
27d0: 20 67 6f 62 62 6c 65 20 73 74 72 69 6e 67 2f 62   gobble string/b
27e0: 61 72 65 77 6f 72 64 20 66 72 6f 6d 20 2a 2f 0a  areword from */.
27f0: 20 20 63 68 61 72 20 2a 2a 70 7a 4f 75 74 2c 20    char **pzOut, 
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 2f 2a 20 4f 55 54 3a 20 6d 61 6c 6c 6f 63    /* OUT: malloc
2820: 27 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  'd buffer contai
2830: 6e 69 6e 67 20 73 74 72 2f 62 77 20 2a 2f 0a 20  ning str/bw */. 
2840: 20 69 6e 74 20 2a 70 62 51 75 6f 74 65 64 20 20   int *pbQuoted  
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
2870: 74 72 75 65 20 69 66 20 64 65 71 75 6f 74 69 6e  true if dequotin
2880: 67 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 29 7b  g required */.){
2890: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28a0: 52 65 74 20 3d 20 30 3b 0a 0a 20 20 69 6e 74 20  Ret = 0;..  int 
28b0: 6e 49 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49 6e  nIn = strlen(zIn
28c0: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  );.  char *zOut 
28d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
28e0: 28 6e 49 6e 2b 31 29 3b 0a 0a 20 20 61 73 73 65  (nIn+1);..  asse
28f0: 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  rt( *pRc==SQLITE
2900: 5f 4f 4b 20 29 3b 0a 20 20 2a 70 62 51 75 6f 74  _OK );.  *pbQuot
2910: 65 64 20 3d 20 30 3b 0a 20 20 2a 70 7a 4f 75 74  ed = 0;.  *pzOut
2920: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 4f 75   = 0;..  if( zOu
2930: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 63  t==0 ){.    *pRc
2940: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
2960: 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 49 6e 2c 20  mcpy(zOut, zIn, 
2970: 6e 49 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  nIn+1);.    if( 
2980: 66 74 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65  fts5_isopenquote
2990: 28 7a 4f 75 74 5b 30 5d 29 20 29 7b 0a 20 20 20  (zOut[0]) ){.   
29a0: 20 20 20 69 6e 74 20 69 69 20 3d 20 66 74 73 35     int ii = fts5
29b0: 44 65 71 75 6f 74 65 28 7a 4f 75 74 29 3b 0a 20  Dequote(zOut);. 
29c0: 20 20 20 20 20 7a 52 65 74 20 3d 20 26 7a 49 6e       zRet = &zIn
29d0: 5b 69 69 5d 3b 0a 20 20 20 20 20 20 2a 70 62 51  [ii];.      *pbQ
29e0: 75 6f 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  uoted = 1;.    }
29f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52 65 74  else{.      zRet
2a00: 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69   = fts5ConfigSki
2a10: 70 42 61 72 65 77 6f 72 64 28 7a 49 6e 29 3b 0a  pBareword(zIn);.
2a20: 20 20 20 20 20 20 7a 4f 75 74 5b 7a 52 65 74 2d        zOut[zRet-
2a30: 7a 49 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  zIn] = '\0';.   
2a40: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 52   }.  }..  if( zR
2a50: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  et==0 ){.    sql
2a60: 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2a70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2a80: 7a 4f 75 74 20 3d 20 7a 4f 75 74 3b 0a 20 20 7d  zOut = zOut;.  }
2a90: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
2aa0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
2ab0: 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 43 6f  ts5ConfigParseCo
2ac0: 6c 75 6d 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66  lumn(.  Fts5Conf
2ad0: 69 67 20 2a 70 2c 20 0a 20 20 63 68 61 72 20 2a  ig *p, .  char *
2ae0: 7a 43 6f 6c 2c 20 0a 20 20 63 68 61 72 20 2a 7a  zCol, .  char *z
2af0: 41 72 67 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  Arg, .  char **p
2b00: 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
2b10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b20: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
2b30: 74 72 69 63 6d 70 28 7a 43 6f 6c 2c 20 46 54 53  tricmp(zCol, FTS
2b40: 35 5f 52 41 4e 4b 5f 4e 41 4d 45 29 20 0a 20 20  5_RANK_NAME) .  
2b50: 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   || 0==sqlite3_s
2b60: 74 72 69 63 6d 70 28 7a 43 6f 6c 2c 20 46 54 53  tricmp(zCol, FTS
2b70: 35 5f 52 4f 57 49 44 5f 4e 41 4d 45 29 20 0a 20  5_ROWID_NAME) . 
2b80: 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d   ){.    *pzErr =
2b90: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2ba0: 28 22 72 65 73 65 72 76 65 64 20 66 74 73 35 20  ("reserved fts5 
2bb0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
2bc0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 63 20  , zCol);.    rc 
2bd0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2be0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 72 67    }else if( zArg
2bf0: 20 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73   ){.    if( 0==s
2c00: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2c10: 41 72 67 2c 20 22 75 6e 69 6e 64 65 78 65 64 22  Arg, "unindexed"
2c20: 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 62  ) ){.      p->ab
2c30: 55 6e 69 6e 64 65 78 65 64 5b 70 2d 3e 6e 43 6f  Unindexed[p->nCo
2c40: 6c 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  l] = 1;.    }els
2c50: 65 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20  e{.      *pzErr 
2c60: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2c70: 66 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  f("unrecognized 
2c80: 63 6f 6c 75 6d 6e 20 6f 70 74 69 6f 6e 3a 20 25  column option: %
2c90: 73 22 2c 20 7a 41 72 67 29 3b 0a 20 20 20 20 20  s", zArg);.     
2ca0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2cb0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
2cc0: 20 70 2d 3e 61 7a 43 6f 6c 5b 70 2d 3e 6e 43 6f   p->azCol[p->nCo
2cd0: 6c 2b 2b 5d 20 3d 20 7a 43 6f 6c 3b 0a 20 20 72  l++] = zCol;.  r
2ce0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2cf0: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
2d00: 46 74 73 35 43 6f 6e 66 69 67 2e 7a 43 6f 6e 74  Fts5Config.zCont
2d10: 65 6e 74 45 78 70 72 6c 69 73 74 20 73 74 72 69  entExprlist stri
2d20: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
2d30: 74 20 66 74 73 35 43 6f 6e 66 69 67 4d 61 6b 65  t fts5ConfigMake
2d40: 45 78 70 72 6c 69 73 74 28 46 74 73 35 43 6f 6e  Exprlist(Fts5Con
2d50: 66 69 67 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  fig *p){.  int i
2d60: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2d70: 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75  ITE_OK;.  Fts5Bu
2d80: 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30  ffer buf = {0, 0
2d90: 2c 20 30 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  , 0};..  sqlite3
2da0: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2db0: 50 72 69 6e 74 66 28 26 72 63 2c 20 26 62 75 66  Printf(&rc, &buf
2dc0: 2c 20 22 54 2e 25 51 22 2c 20 70 2d 3e 7a 43 6f  , "T.%Q", p->zCo
2dd0: 6e 74 65 6e 74 52 6f 77 69 64 29 3b 0a 20 20 69  ntentRowid);.  i
2de0: 66 28 20 70 2d 3e 65 43 6f 6e 74 65 6e 74 21 3d  f( p->eContent!=
2df0: 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e  FTS5_CONTENT_NON
2e00: 45 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  E ){.    for(i=0
2e10: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
2e20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2e30: 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43  eContent==FTS5_C
2e40: 4f 4e 54 45 4e 54 5f 45 58 54 45 52 4e 41 4c 20  ONTENT_EXTERNAL 
2e50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e60: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2e70: 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 62  ndPrintf(&rc, &b
2e80: 75 66 2c 20 22 2c 20 54 2e 25 51 22 2c 20 70 2d  uf, ", T.%Q", p-
2e90: 3e 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20  >azCol[i]);.    
2ea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2eb0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2ec0: 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
2ed0: 72 63 2c 20 26 62 75 66 2c 20 22 2c 20 54 2e 63  rc, &buf, ", T.c
2ee0: 25 64 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  %d", i);.      }
2ef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
2f00: 73 65 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e  sert( p->zConten
2f10: 74 45 78 70 72 6c 69 73 74 3d 3d 30 20 29 3b 0a  tExprlist==0 );.
2f20: 20 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 45 78 70    p->zContentExp
2f30: 72 6c 69 73 74 20 3d 20 28 63 68 61 72 2a 29 62  rlist = (char*)b
2f40: 75 66 2e 70 3b 0a 20 20 72 65 74 75 72 6e 20 72  uf.p;.  return r
2f50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  c;.}../*.** Argu
2f60: 6d 65 6e 74 73 20 6e 41 72 67 2f 61 7a 41 72 67  ments nArg/azArg
2f70: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 74 72   contain the str
2f80: 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 70 61  ing arguments pa
2f90: 73 73 65 64 20 74 6f 20 74 68 65 20 78 43 72 65  ssed to the xCre
2fa0: 61 74 65 0a 2a 2a 20 6f 72 20 78 43 6f 6e 6e 65  ate.** or xConne
2fb0: 63 74 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ct method of the
2fc0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
2fd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
2fe0: 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 6c  tempts to .** al
2ff0: 6c 6f 63 61 74 65 20 61 6e 20 69 6e 73 74 61 6e  locate an instan
3000: 63 65 20 6f 66 20 46 74 73 35 43 6f 6e 66 69 67  ce of Fts5Config
3010: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
3020: 72 65 73 75 6c 74 73 20 6f 66 20 70 61 72 73 69  results of parsi
3030: 6e 67 0a 2a 2a 20 74 68 6f 73 65 20 61 72 67 75  ng.** those argu
3040: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
3050: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
3060: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
3070: 64 20 61 6e 64 20 2a 70 70 4f 75 74 20 69 73 20  d and *ppOut is 
3080: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
3090: 74 68 65 0a 2a 2a 20 6e 65 77 20 46 74 73 35 43  the.** new Fts5C
30a0: 6f 6e 66 69 67 20 6f 62 6a 65 63 74 2e 20 49 66  onfig object. If
30b0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
30c0: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
30d0: 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
30e0: 74 75 72 6e 65 64 2c 20 2a 70 70 4f 75 74 20 69  turned, *ppOut i
30f0: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
3100: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
3110: 67 65 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  ge may be left i
3120: 6e 0a 2a 2a 20 2a 70 7a 45 72 72 2e 20 49 74 20  n.** *pzErr. It 
3130: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
3140: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
3150: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
3160: 79 20 66 72 65 65 20 61 6e 79 20 0a 2a 2a 20 73  y free any .** s
3170: 75 63 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67  uch error messag
3180: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
3190: 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  free()..*/.int s
31a0: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
31b0: 50 61 72 73 65 28 0a 20 20 46 74 73 35 47 6c 6f  Parse(.  Fts5Glo
31c0: 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 0a 20 20  bal *pGlobal,.  
31d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
31e0: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3200: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
3210: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
3220: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
3230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
3240: 72 61 79 20 6f 66 20 6e 41 72 67 20 43 52 45 41  ray of nArg CREA
3250: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
3260: 20 61 72 67 73 20 2a 2f 0a 20 20 46 74 73 35 43   args */.  Fts5C
3270: 6f 6e 66 69 67 20 2a 2a 70 70 4f 75 74 2c 20 20  onfig **ppOut,  
3280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
3290: 54 3a 20 52 65 73 75 6c 74 73 20 6f 66 20 70 61  T: Results of pa
32a0: 72 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  rse */.  char **
32b0: 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20  pzErr           
32c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
32d0: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   Error message *
32e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
32f0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
3300: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
3310: 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43   code */.  Fts5C
3320: 6f 6e 66 69 67 20 2a 70 52 65 74 3b 20 20 20 20  onfig *pRet;    
3330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
3340: 77 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75  w object to retu
3350: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  rn */.  int i;. 
3360: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 2a   int nByte;..  *
3370: 70 70 4f 75 74 20 3d 20 70 52 65 74 20 3d 20 28  ppOut = pRet = (
3380: 46 74 73 35 43 6f 6e 66 69 67 2a 29 73 71 6c 69  Fts5Config*)sqli
3390: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
33a0: 66 28 46 74 73 35 43 6f 6e 66 69 67 29 29 3b 0a  f(Fts5Config));.
33b0: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 20    if( pRet==0 ) 
33c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
33d0: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 52  MEM;.  memset(pR
33e0: 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  et, 0, sizeof(Ft
33f0: 73 35 43 6f 6e 66 69 67 29 29 3b 0a 20 20 70 52  s5Config));.  pR
3400: 65 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70  et->db = db;.  p
3410: 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 2d  Ret->iCookie = -
3420: 31 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6e 41  1;..  nByte = nA
3430: 72 67 20 2a 20 28 73 69 7a 65 6f 66 28 63 68 61  rg * (sizeof(cha
3440: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 75 38 29  r*) + sizeof(u8)
3450: 29 3b 0a 20 20 70 52 65 74 2d 3e 61 7a 43 6f 6c  );.  pRet->azCol
3460: 20 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c 69 74   = (char**)sqlit
3470: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
3480: 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  (&rc, nByte);.  
3490: 70 52 65 74 2d 3e 61 62 55 6e 69 6e 64 65 78 65  pRet->abUnindexe
34a0: 64 20 3d 20 28 75 38 2a 29 26 70 52 65 74 2d 3e  d = (u8*)&pRet->
34b0: 61 7a 43 6f 6c 5b 6e 41 72 67 5d 3b 0a 20 20 70  azCol[nArg];.  p
34c0: 52 65 74 2d 3e 7a 44 62 20 3d 20 73 71 6c 69 74  Ret->zDb = sqlit
34d0: 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26 72  e3Fts5Strndup(&r
34e0: 63 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d 31 29  c, azArg[1], -1)
34f0: 3b 0a 20 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 20  ;.  pRet->zName 
3500: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 72  = sqlite3Fts5Str
3510: 6e 64 75 70 28 26 72 63 2c 20 61 7a 41 72 67 5b  ndup(&rc, azArg[
3520: 32 5d 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 72  2], -1);.  if( r
3530: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
3540: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
3550: 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c 20 46 54 53  pRet->zName, FTS
3560: 35 5f 52 41 4e 4b 5f 4e 41 4d 45 29 3d 3d 30 20  5_RANK_NAME)==0 
3570: 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  ){.    *pzErr = 
3580: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3590: 22 72 65 73 65 72 76 65 64 20 66 74 73 35 20 74  "reserved fts5 t
35a0: 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20  able name: %s", 
35b0: 70 52 65 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pRet->zName);.  
35c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
35d0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ROR;.  }..  for(
35e0: 69 3d 33 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=3; rc==SQLITE_
35f0: 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b  OK && i<nArg; i+
3600: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
3610: 61 72 20 2a 7a 4f 72 69 67 20 3d 20 61 7a 41 72  ar *zOrig = azAr
3620: 67 5b 69 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  g[i];.    const 
3630: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 63 68 61  char *z;.    cha
3640: 72 20 2a 7a 4f 6e 65 20 3d 20 30 3b 0a 20 20 20  r *zOne = 0;.   
3650: 20 63 68 61 72 20 2a 7a 54 77 6f 20 3d 20 30 3b   char *zTwo = 0;
3660: 0a 20 20 20 20 69 6e 74 20 62 4f 70 74 69 6f 6e  .    int bOption
3670: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 4d   = 0;.    int bM
3680: 75 73 74 42 65 43 6f 6c 20 3d 20 30 3b 0a 0a 20  ustBeCol = 0;.. 
3690: 20 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69     z = fts5Confi
36a0: 67 47 6f 62 62 6c 65 57 6f 72 64 28 26 72 63 2c  gGobbleWord(&rc,
36b0: 20 7a 4f 72 69 67 2c 20 26 7a 4f 6e 65 2c 20 26   zOrig, &zOne, &
36c0: 62 4d 75 73 74 42 65 43 6f 6c 29 3b 0a 20 20 20  bMustBeCol);.   
36d0: 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53   z = fts5ConfigS
36e0: 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 7a 29  kipWhitespace(z)
36f0: 3b 0a 20 20 20 20 69 66 28 20 7a 20 26 26 20 2a  ;.    if( z && *
3700: 7a 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20  z=='=' ){.      
3710: 62 4f 70 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20  bOption = 1;.   
3720: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66     z++;.      if
3730: 28 20 62 4d 75 73 74 42 65 43 6f 6c 20 29 20 7a  ( bMustBeCol ) z
3740: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
3750: 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  z = fts5ConfigSk
3760: 69 70 57 68 69 74 65 73 70 61 63 65 28 7a 29 3b  ipWhitespace(z);
3770: 0a 20 20 20 20 69 66 28 20 7a 20 26 26 20 7a 5b  .    if( z && z[
3780: 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
3790: 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 7a 20  bDummy;.      z 
37a0: 3d 20 66 74 73 35 43 6f 6e 66 69 67 47 6f 62 62  = fts5ConfigGobb
37b0: 6c 65 57 6f 72 64 28 26 72 63 2c 20 7a 2c 20 26  leWord(&rc, z, &
37c0: 7a 54 77 6f 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  zTwo, &bDummy);.
37d0: 20 20 20 20 20 20 69 66 28 20 7a 20 26 26 20 7a        if( z && z
37e0: 5b 30 5d 20 29 20 7a 20 3d 20 30 3b 0a 20 20 20  [0] ) z = 0;.   
37f0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
3800: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3810: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
3820: 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
3830: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3840: 22 70 61 72 73 65 20 65 72 72 6f 72 20 69 6e 20  "parse error in 
3850: 5c 22 25 73 5c 22 22 2c 20 7a 4f 72 69 67 29 3b  \"%s\"", zOrig);
3860: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
3870: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3890: 20 69 66 28 20 62 4f 70 74 69 6f 6e 20 29 7b 0a   if( bOption ){.
38a0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
38b0: 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 53 70  ts5ConfigParseSp
38c0: 65 63 69 61 6c 28 70 47 6c 6f 62 61 6c 2c 20 70  ecial(pGlobal, p
38d0: 52 65 74 2c 20 7a 4f 6e 65 2c 20 7a 54 77 6f 3f  Ret, zOne, zTwo?
38e0: 7a 54 77 6f 3a 22 22 2c 20 70 7a 45 72 72 29 3b  zTwo:"", pzErr);
38f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3900: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
3910: 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 43 6f  ts5ConfigParseCo
3920: 6c 75 6d 6e 28 70 52 65 74 2c 20 7a 4f 6e 65 2c  lumn(pRet, zOne,
3930: 20 7a 54 77 6f 2c 20 70 7a 45 72 72 29 3b 0a 20   zTwo, pzErr);. 
3940: 20 20 20 20 20 20 20 20 20 7a 4f 6e 65 20 3d 20           zOne = 
3950: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
3960: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3970: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6e  sqlite3_free(zOn
3980: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
3990: 66 72 65 65 28 7a 54 77 6f 29 3b 0a 20 20 7d 0a  free(zTwo);.  }.
39a0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 6f 6b 65 6e  .  /* If a token
39b0: 69 7a 65 72 3d 20 6f 70 74 69 6f 6e 20 77 61 73  izer= option was
39c0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 70 61   successfully pa
39d0: 72 73 65 64 2c 20 74 68 65 20 74 6f 6b 65 6e 69  rsed, the tokeni
39e0: 7a 65 72 20 68 61 73 0a 20 20 2a 2a 20 61 6c 72  zer has.  ** alr
39f0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
3a00: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
3a10: 61 6c 6c 6f 63 61 74 65 20 61 6e 20 69 6e 73 74  allocate an inst
3a20: 61 6e 63 65 20 6f 66 20 74 68 65 20 64 65 66 61  ance of the defa
3a30: 75 6c 74 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a  ult.  ** tokeniz
3a40: 65 72 20 28 75 6e 69 63 6f 64 65 36 31 29 20 6e  er (unicode61) n
3a50: 6f 77 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  ow.  */.  if( rc
3a60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
3a70: 52 65 74 2d 3e 70 54 6f 6b 3d 3d 30 20 29 7b 0a  Ret->pTok==0 ){.
3a80: 20 20 20 20 72 63 20 3d 20 66 74 73 35 43 6f 6e      rc = fts5Con
3a90: 66 69 67 44 65 66 61 75 6c 74 54 6f 6b 65 6e 69  figDefaultTokeni
3aa0: 7a 65 72 28 70 47 6c 6f 62 61 6c 2c 20 70 52 65  zer(pGlobal, pRe
3ab0: 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
3ac0: 20 6e 6f 20 7a 43 6f 6e 74 65 6e 74 20 6f 70 74   no zContent opt
3ad0: 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66 69 65  ion was specifie
3ae0: 64 2c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 64  d, fill in the d
3af0: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2e 20 2a  efault values. *
3b00: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
3b10: 54 45 5f 4f 4b 20 26 26 20 70 52 65 74 2d 3e 65  TE_OK && pRet->e
3b20: 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f  Content==FTS5_CO
3b30: 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0a  NTENT_NORMAL ){.
3b40: 20 20 20 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65      pRet->zConte
3b50: 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  nt = sqlite3_mpr
3b60: 69 6e 74 66 28 22 25 51 2e 27 25 71 5f 63 6f 6e  intf("%Q.'%q_con
3b70: 74 65 6e 74 27 22 2c 20 70 52 65 74 2d 3e 7a 44  tent'", pRet->zD
3b80: 62 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 29 3b  b, pRet->zName);
3b90: 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 7a  .    if( pRet->z
3ba0: 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  Content==0 ){.  
3bb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3bc0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
3bd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
3be0: 66 72 65 65 28 70 52 65 74 2d 3e 7a 43 6f 6e 74  free(pRet->zCont
3bf0: 65 6e 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  entRowid);.     
3c00: 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 52   pRet->zContentR
3c10: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  owid = 0;.    }.
3c20: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
3c30: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 65 74 2d  LITE_OK && pRet-
3c40: 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3d 3d  >zContentRowid==
3c50: 30 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 7a  0 ){.    pRet->z
3c60: 43 6f 6e 74 65 6e 74 52 6f 77 69 64 20 3d 20 73  ContentRowid = s
3c70: 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75  qlite3Fts5Strndu
3c80: 70 28 26 72 63 2c 20 22 72 6f 77 69 64 22 2c 20  p(&rc, "rowid", 
3c90: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  -1);.  }..  /* F
3ca0: 6f 72 6d 75 6c 61 74 65 20 74 68 65 20 7a 43 6f  ormulate the zCo
3cb0: 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 20 74 65  ntentExprlist te
3cc0: 78 74 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  xt */.  if( rc==
3cd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3ce0: 20 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67   rc = fts5Config
3cf0: 4d 61 6b 65 45 78 70 72 6c 69 73 74 28 70 52 65  MakeExprlist(pRe
3d00: 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  t);.  }..  if( r
3d10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3d20: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 43      sqlite3Fts5C
3d30: 6f 6e 66 69 67 46 72 65 65 28 70 52 65 74 29 3b  onfigFree(pRet);
3d40: 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b  .    *ppOut = 0;
3d50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
3d70: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
3d80: 6e 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  n object passed 
3d90: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
3da0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
3db0: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 46  lite3Fts5ConfigF
3dc0: 72 65 65 28 46 74 73 35 43 6f 6e 66 69 67 20 2a  ree(Fts5Config *
3dd0: 70 43 6f 6e 66 69 67 29 7b 0a 20 20 69 66 28 20  pConfig){.  if( 
3de0: 70 43 6f 6e 66 69 67 20 29 7b 0a 20 20 20 20 69  pConfig ){.    i
3df0: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 70 43  nt i;.    if( pC
3e00: 6f 6e 66 69 67 2d 3e 70 54 6f 6b 20 29 7b 0a 20  onfig->pTok ){. 
3e10: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70 54       pConfig->pT
3e20: 6f 6b 41 70 69 2d 3e 78 44 65 6c 65 74 65 28 70  okApi->xDelete(p
3e30: 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 29 3b 0a 20  Config->pTok);. 
3e40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3e50: 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a  _free(pConfig->z
3e60: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
3e70: 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a  _free(pConfig->z
3e80: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Name);.    for(i
3e90: 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
3ea0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
3eb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
3ec0: 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29  onfig->azCol[i])
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3ee0: 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67  te3_free(pConfig
3ef0: 2d 3e 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 73 71  ->azCol);.    sq
3f00: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
3f10: 69 67 2d 3e 61 50 72 65 66 69 78 29 3b 0a 20 20  ig->aPrefix);.  
3f20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3f30: 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 29 3b 0a  Config->zRank);.
3f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3f50: 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41  (pConfig->zRankA
3f60: 72 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rgs);.    sqlite
3f70: 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e  3_free(pConfig->
3f80: 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 73  zContent);.    s
3f90: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e  qlite3_free(pCon
3fa0: 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77  fig->zContentRow
3fb0: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
3fc0: 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a  _free(pConfig->z
3fd0: 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 29  ContentExprlist)
3fe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
3ff0: 65 65 28 70 43 6f 6e 66 69 67 29 3b 0a 20 20 7d  ee(pConfig);.  }
4000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
4010: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
4020: 74 61 62 28 29 20 62 61 73 65 64 20 6f 6e 20 74  tab() based on t
4030: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4040: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
4050: 0a 2a 2a 20 6f 62 6a 65 63 74 20 70 61 73 73 65  .** object passe
4060: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
4070: 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 53  gument. Return S
4080: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
4090: 65 73 73 66 75 6c 2c 20 6f 72 0a 2a 2a 20 61 6e  essful, or.** an
40a0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
40b0: 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  de if an error o
40c0: 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
40d0: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 44  lite3Fts5ConfigD
40e0: 65 63 6c 61 72 65 56 74 61 62 28 46 74 73 35 43  eclareVtab(Fts5C
40f0: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 29 7b  onfig *pConfig){
4100: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4110: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  rc;.  char *zSql
4120: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 6c 64 3b 0a  ;.  char *zOld;.
4130: 0a 20 20 7a 53 71 6c 20 3d 20 28 63 68 61 72 2a  .  zSql = (char*
4140: 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  )sqlite3_mprintf
4150: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  ("CREATE TABLE x
4160: 28 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  (");.  for(i=0; 
4170: 7a 53 71 6c 20 26 26 20 69 3c 70 43 6f 6e 66 69  zSql && i<pConfi
4180: 67 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  g->nCol; i++){. 
4190: 20 20 20 7a 4f 6c 64 20 3d 20 7a 53 71 6c 3b 0a     zOld = zSql;.
41a0: 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
41b0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 25 73  e3_mprintf("%s%s
41c0: 25 51 22 2c 20 7a 4f 6c 64 2c 20 28 69 3d 3d 30  %Q", zOld, (i==0
41d0: 3f 22 22 3a 22 2c 20 22 29 2c 20 70 43 6f 6e 66  ?"":", "), pConf
41e0: 69 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ig->azCol[i]);. 
41f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4200: 7a 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  zOld);.  }..  if
4210: 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 4f  ( zSql ){.    zO
4220: 6c 64 20 3d 20 7a 53 71 6c 3b 0a 20 20 20 20 7a  ld = zSql;.    z
4230: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
4240: 72 69 6e 74 66 28 22 25 73 2c 20 25 51 20 48 49  rintf("%s, %Q HI
4250: 44 44 45 4e 2c 20 25 73 20 48 49 44 44 45 4e 29  DDEN, %s HIDDEN)
4260: 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 4f 6c 64  ", .        zOld
4270: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
4280: 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45  , FTS5_RANK_NAME
4290: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
42a0: 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a  te3_free(zOld);.
42b0: 20 20 7d 0a 0a 20 20 69 66 28 20 7a 53 71 6c 3d    }..  if( zSql=
42c0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
42d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
42e0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
42f0: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
4300: 74 61 62 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  tab(pConfig->db,
4310: 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69   zSql);.    sqli
4320: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
4330: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
4340: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b  rc;.}../*.** Tok
4350: 65 6e 69 7a 65 20 74 68 65 20 74 65 78 74 20 70  enize the text p
4360: 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
4370: 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
4380: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  rguments..**.** 
4390: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  The callback is 
43a0: 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72  invoked once for
43b0: 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
43c0: 68 65 20 69 6e 70 75 74 20 74 65 78 74 2e 20 54  he input text. T
43d0: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
43e0: 70 61 73 73 65 64 20 74 6f 20 69 74 20 61 72 65  passed to it are
43f0: 2c 20 69 6e 20 6f 72 64 65 72 3a 0a 2a 2a 0a 2a  , in order:.**.*
4400: 2a 20 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78  *     void *pCtx
4410: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43 6f 70            // Cop
4420: 79 20 6f 66 20 34 74 68 20 61 72 67 75 6d 65 6e  y of 4th argumen
4430: 74 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  t to sqlite3Fts5
4440: 54 6f 6b 65 6e 69 7a 65 28 29 0a 2a 2a 20 20 20  Tokenize().**   
4450: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
4460: 6f 6b 65 6e 20 20 2f 2f 20 50 6f 69 6e 74 65 72  oken  // Pointer
4470: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
4480: 69 6e 69 6e 67 20 74 6f 6b 65 6e 0a 2a 2a 20 20  ining token.**  
4490: 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 20     int nToken   
44a0: 20 20 20 20 20 20 20 2f 2f 20 53 69 7a 65 20 6f         // Size o
44b0: 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73  f token in bytes
44c0: 0a 2a 2a 20 20 20 20 20 69 6e 74 20 69 53 74 61  .**     int iSta
44d0: 72 74 20 20 20 20 20 20 20 20 20 20 2f 2f 20 42  rt          // B
44e0: 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 73 74  yte offset of st
44f0: 61 72 74 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  art of token wit
4500: 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 0a 2a  hin input text.*
4510: 2a 20 20 20 20 20 69 6e 74 20 69 45 6e 64 20 20  *     int iEnd  
4520: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 42 79 74            // Byt
4530: 65 20 6f 66 66 73 65 74 20 6f 66 20 65 6e 64 20  e offset of end 
4540: 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
4550: 69 6e 70 75 74 20 74 65 78 74 0a 2a 2a 20 20 20  input text.**   
4560: 20 20 69 6e 74 20 69 50 6f 73 20 20 20 20 20 20    int iPos      
4570: 20 20 20 20 20 20 2f 2f 20 50 6f 73 69 74 69 6f        // Positio
4580: 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 69 6e  n of token in in
4590: 70 75 74 20 28 66 69 72 73 74 20 74 6f 6b 65 6e  put (first token
45a0: 20 69 73 20 30 29 0a 2a 2a 0a 2a 2a 20 49 66 20   is 0).**.** If 
45b0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  the callback ret
45c0: 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  urns a non-zero 
45d0: 76 61 6c 75 65 20 74 68 65 20 74 6f 6b 65 6e 69  value the tokeni
45e0: 7a 61 74 69 6f 6e 20 69 73 20 61 62 61 6e 64 6f  zation is abando
45f0: 6e 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 66 75  ned.** and no fu
4600: 72 74 68 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  rther callbacks 
4610: 61 72 65 20 69 73 73 75 65 64 2e 20 0a 2a 2a 0a  are issued. .**.
4620: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4630: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4640: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
4650: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
4660: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 66 20 61  ror code.** if a
4670: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
4680: 49 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74  If the tokenizat
4690: 69 6f 6e 20 77 61 73 20 61 62 61 6e 64 6f 6e 65  ion was abandone
46a0: 64 20 65 61 72 6c 79 20 62 65 63 61 75 73 65 0a  d early because.
46b0: 2a 2a 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** the callback 
46c0: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
46d0: 44 4f 4e 45 2c 20 74 68 69 73 20 69 73 20 6e 6f  DONE, this is no
46e0: 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 74  t an error and t
46f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
4700: 73 74 69 6c 6c 20 72 65 74 75 72 6e 73 20 53 51  still returns SQ
4710: 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20  LITE_OK. Or, if 
4720: 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e  the tokenization
4730: 20 77 61 73 20 61 62 61 6e 64 6f 6e 65 64 20 65   was abandoned e
4740: 61 72 6c 79 0a 2a 2a 20 62 65 63 61 75 73 65 20  arly.** because 
4750: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  the callback ret
4760: 75 72 6e 65 64 20 61 6e 6f 74 68 65 72 20 6e 6f  urned another no
4770: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 74  n-zero value, it
4780: 20 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74   is assumed.** t
4790: 6f 20 62 65 20 61 6e 20 53 51 4c 69 74 65 20 65  o be an SQLite e
47a0: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
47b0: 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
47c0: 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
47d0: 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ite3Fts5Tokenize
47e0: 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
47f0: 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20  pConfig,        
4800: 20 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66      /* FTS5 Conf
4810: 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74  iguration object
4820: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4830: 20 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65   *pText, int nTe
4840: 78 74 2c 20 20 20 2f 2a 20 54 65 78 74 20 74 6f  xt,   /* Text to
4850: 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 20 20 76   tokenize */.  v
4860: 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4880: 2a 20 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64  * Context passed
4890: 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20 2a 2f 0a   to xToken() */.
48a0: 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28    int (*xToken)(
48b0: 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 63 68 61  void*, const cha
48c0: 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e  r*, int, int, in
48d0: 74 29 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  t)    /* Callbac
48e0: 6b 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  k */.){.  return
48f0: 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70   pConfig->pTokAp
4900: 69 2d 3e 78 54 6f 6b 65 6e 69 7a 65 28 70 43 6f  i->xTokenize(pCo
4910: 6e 66 69 67 2d 3e 70 54 6f 6b 2c 20 70 43 74 78  nfig->pTok, pCtx
4920: 2c 20 70 54 65 78 74 2c 20 6e 54 65 78 74 2c 20  , pText, nText, 
4930: 78 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  xToken);.}../*.*
4940: 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 6e 20 70  * Argument pIn p
4950: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
4960: 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  st character in 
4970: 77 68 61 74 20 69 73 20 65 78 70 65 63 74 65 64  what is expected
4980: 20 74 6f 20 62 65 0a 2a 2a 20 61 20 63 6f 6d 6d   to be.** a comm
4990: 61 2d 73 65 70 61 72 61 74 65 64 20 6c 69 73 74  a-separated list
49a0: 20 6f 66 20 53 51 4c 20 6c 69 74 65 72 61 6c 73   of SQL literals
49b0: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 27   followed by a '
49c0: 29 27 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  )' character..**
49d0: 20 49 66 20 69 74 20 61 63 74 75 61 6c 6c 79 20   If it actually 
49e0: 69 73 20 74 68 69 73 2c 20 72 65 74 75 72 6e 20  is this, return 
49f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4a00: 20 27 29 27 2e 20 4f 74 68 65 72 77 69 73 65 2c   ')'. Otherwise,
4a10: 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20   return.** NULL 
4a20: 74 6f 20 69 6e 64 69 63 61 74 65 20 61 20 70 61  to indicate a pa
4a30: 72 73 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  rse error..*/.st
4a40: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4a50: 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 41  *fts5ConfigSkipA
4a60: 72 67 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  rgs(const char *
4a70: 70 49 6e 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  pIn){.  const ch
4a80: 61 72 20 2a 70 20 3d 20 70 49 6e 3b 0a 20 20 0a  ar *p = pIn;.  .
4a90: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
4aa0: 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67    p = fts5Config
4ab0: 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70  SkipWhitespace(p
4ac0: 29 3b 0a 20 20 20 20 70 20 3d 20 66 74 73 35 43  );.    p = fts5C
4ad0: 6f 6e 66 69 67 53 6b 69 70 4c 69 74 65 72 61 6c  onfigSkipLiteral
4ae0: 28 70 29 3b 0a 20 20 20 20 70 20 3d 20 66 74 73  (p);.    p = fts
4af0: 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65  5ConfigSkipWhite
4b00: 73 70 61 63 65 28 70 29 3b 0a 20 20 20 20 69 66  space(p);.    if
4b10: 28 20 70 3d 3d 30 20 7c 7c 20 2a 70 3d 3d 27 29  ( p==0 || *p==')
4b20: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  ' ) break;.    i
4b30: 66 28 20 2a 70 21 3d 27 2c 27 20 29 7b 0a 20 20  f( *p!=',' ){.  
4b40: 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20      p = 0;.     
4b50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4b60: 20 20 70 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65    p++;.  }..  re
4b70: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
4b80: 20 50 61 72 61 6d 65 74 65 72 20 7a 49 6e 20 63   Parameter zIn c
4b90: 6f 6e 74 61 69 6e 73 20 61 20 72 61 6e 6b 28 29  ontains a rank()
4ba0: 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66   function specif
4bb0: 69 63 61 74 69 6f 6e 2e 20 54 68 65 20 66 6f 72  ication. The for
4bc0: 6d 61 74 20 6f 66 20 0a 2a 2a 20 74 68 69 73 20  mat of .** this 
4bd0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 42 61  is:.**.**   + Ba
4be0: 72 65 77 6f 72 64 20 28 66 75 6e 63 74 69 6f 6e  reword (function
4bf0: 20 6e 61 6d 65 29 0a 2a 2a 20 20 20 2b 20 4f 70   name).**   + Op
4c00: 65 6e 20 70 61 72 65 6e 74 68 65 73 69 73 20 2d  en parenthesis -
4c10: 20 22 28 22 0a 2a 2a 20 20 20 2b 20 5a 65 72 6f   "(".**   + Zero
4c20: 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20 6c 69 74   or more SQL lit
4c30: 65 72 61 6c 73 20 69 6e 20 61 20 63 6f 6d 6d 61  erals in a comma
4c40: 20 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 0a   separated list.
4c50: 2a 2a 20 20 20 2b 20 43 6c 6f 73 65 20 70 61 72  **   + Close par
4c60: 65 6e 74 68 65 73 69 73 20 2d 20 22 29 22 0a 2a  enthesis - ")".*
4c70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
4c80: 35 43 6f 6e 66 69 67 50 61 72 73 65 52 61 6e 6b  5ConfigParseRank
4c90: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
4ca0: 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  zIn,            
4cb0: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72      /* Input str
4cc0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ing */.  char **
4cd0: 70 7a 52 61 6e 6b 2c 20 20 20 20 20 20 20 20 20  pzRank,         
4ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4cf0: 20 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 6e   Rank function n
4d00: 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ame */.  char **
4d10: 70 7a 52 61 6e 6b 41 72 67 73 20 20 20 20 20 20  pzRankArgs      
4d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4d30: 20 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 61   Rank function a
4d40: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
4d50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d   const char *p =
4d60: 20 7a 49 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68   zIn;.  const ch
4d70: 61 72 20 2a 70 52 61 6e 6b 3b 0a 20 20 63 68 61  ar *pRank;.  cha
4d80: 72 20 2a 7a 52 61 6e 6b 20 3d 20 30 3b 0a 20 20  r *zRank = 0;.  
4d90: 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73 20  char *zRankArgs 
4da0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
4db0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2a 70  SQLITE_OK;..  *p
4dc0: 7a 52 61 6e 6b 20 3d 20 30 3b 0a 20 20 2a 70 7a  zRank = 0;.  *pz
4dd0: 52 61 6e 6b 41 72 67 73 20 3d 20 30 3b 0a 0a 20  RankArgs = 0;.. 
4de0: 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53   p = fts5ConfigS
4df0: 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29  kipWhitespace(p)
4e00: 3b 0a 20 20 70 52 61 6e 6b 20 3d 20 70 3b 0a 20  ;.  pRank = p;. 
4e10: 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53   p = fts5ConfigS
4e20: 6b 69 70 42 61 72 65 77 6f 72 64 28 70 29 3b 0a  kipBareword(p);.
4e30: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
4e40: 7a 52 61 6e 6b 20 3d 20 73 71 6c 69 74 65 33 46  zRank = sqlite3F
4e50: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
4e60: 63 2c 20 31 20 2b 20 70 20 2d 20 70 52 61 6e 6b  c, 1 + p - pRank
4e70: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 61 6e 6b  );.    if( zRank
4e80: 20 29 20 6d 65 6d 63 70 79 28 7a 52 61 6e 6b 2c   ) memcpy(zRank,
4e90: 20 70 52 61 6e 6b 2c 20 70 2d 70 52 61 6e 6b 29   pRank, p-pRank)
4ea0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4eb0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
4ec0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
4ed0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4ee0: 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67    p = fts5Config
4ef0: 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70  SkipWhitespace(p
4f00: 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 21 3d 27  );.    if( *p!='
4f10: 28 27 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  (' ) rc = SQLITE
4f20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 2b 2b 3b  _ERROR;.    p++;
4f30: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
4f40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 41 72 67  const char *pArg
4f60: 73 3b 20 0a 20 20 20 20 70 20 3d 20 66 74 73 35  s; .    p = fts5
4f70: 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73  ConfigSkipWhites
4f80: 70 61 63 65 28 70 29 3b 0a 20 20 20 20 70 41 72  pace(p);.    pAr
4f90: 67 73 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20  gs = p;.    if( 
4fa0: 2a 70 21 3d 27 29 27 20 29 7b 0a 20 20 20 20 20  *p!=')' ){.     
4fb0: 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53   p = fts5ConfigS
4fc0: 6b 69 70 41 72 67 73 28 70 29 3b 0a 20 20 20 20  kipArgs(p);.    
4fd0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
4fe0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4ff0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
5000: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52  else{.        zR
5010: 61 6e 6b 41 72 67 73 20 3d 20 73 71 6c 69 74 65  ankArgs = sqlite
5020: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
5030: 26 72 63 2c 20 31 20 2b 20 70 20 2d 20 70 41 72  &rc, 1 + p - pAr
5040: 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  gs);.        if(
5050: 20 7a 52 61 6e 6b 41 72 67 73 20 29 20 6d 65 6d   zRankArgs ) mem
5060: 63 70 79 28 7a 52 61 6e 6b 41 72 67 73 2c 20 70  cpy(zRankArgs, p
5070: 41 72 67 73 2c 20 70 2d 70 41 72 67 73 29 3b 0a  Args, p-pArgs);.
5080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5090: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
50a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
50b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 61 6e 6b  lite3_free(zRank
50c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  );.    assert( z
50d0: 52 61 6e 6b 41 72 67 73 3d 3d 30 20 29 3b 0a 20  RankArgs==0 );. 
50e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 52   }else{.    *pzR
50f0: 61 6e 6b 20 3d 20 7a 52 61 6e 6b 3b 0a 20 20 20  ank = zRank;.   
5100: 20 2a 70 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a   *pzRankArgs = z
5110: 52 61 6e 6b 41 72 67 73 3b 0a 20 20 7d 0a 20 20  RankArgs;.  }.  
5120: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
5130: 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  t sqlite3Fts5Con
5140: 66 69 67 53 65 74 56 61 6c 75 65 28 0a 20 20 46  figSetValue(.  F
5150: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
5160: 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  ig, .  const cha
5170: 72 20 2a 7a 4b 65 79 2c 20 0a 20 20 73 71 6c 69  r *zKey, .  sqli
5180: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c  te3_value *pVal,
5190: 0a 20 20 69 6e 74 20 2a 70 62 42 61 64 6b 65 79  .  int *pbBadkey
51a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
51b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
51c0: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
51d0: 63 6d 70 28 7a 4b 65 79 2c 20 22 70 67 73 7a 22  cmp(zKey, "pgsz"
51e0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 67 73  ) ){.    int pgs
51f0: 7a 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 53  z = 0;.    if( S
5200: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3d 3d 73  QLITE_INTEGER==s
5210: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
5220: 65 72 69 63 5f 74 79 70 65 28 70 56 61 6c 29 20  eric_type(pVal) 
5230: 29 7b 0a 20 20 20 20 20 20 70 67 73 7a 20 3d 20  ){.      pgsz = 
5240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
5250: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
5260: 20 20 20 69 66 28 20 70 67 73 7a 3c 3d 30 20 7c     if( pgsz<=0 |
5270: 7c 20 70 67 73 7a 3e 46 54 53 35 5f 4d 41 58 5f  | pgsz>FTS5_MAX_
5280: 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
5290: 20 20 20 2a 70 62 42 61 64 6b 65 79 20 3d 20 31     *pbBadkey = 1
52a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
52b0: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a     pConfig->pgsz
52c0: 20 3d 20 70 67 73 7a 3b 0a 20 20 20 20 7d 0a 20   = pgsz;.    }. 
52d0: 20 7d 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 30   }..  else if( 0
52e0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
52f0: 70 28 7a 4b 65 79 2c 20 22 61 75 74 6f 6d 65 72  p(zKey, "automer
5300: 67 65 22 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ge") ){.    int 
5310: 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 2d 31 3b  nAutomerge = -1;
5320: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
5330: 49 4e 54 45 47 45 52 3d 3d 73 71 6c 69 74 65 33  INTEGER==sqlite3
5340: 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74  _value_numeric_t
5350: 79 70 65 28 70 56 61 6c 29 20 29 7b 0a 20 20 20  ype(pVal) ){.   
5360: 20 20 20 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20     nAutomerge = 
5370: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
5380: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
5390: 20 20 20 69 66 28 20 6e 41 75 74 6f 6d 65 72 67     if( nAutomerg
53a0: 65 3c 30 20 7c 7c 20 6e 41 75 74 6f 6d 65 72 67  e<0 || nAutomerg
53b0: 65 3e 36 34 20 29 7b 0a 20 20 20 20 20 20 2a 70  e>64 ){.      *p
53c0: 62 42 61 64 6b 65 79 20 3d 20 31 3b 0a 20 20 20  bBadkey = 1;.   
53d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
53e0: 28 20 6e 41 75 74 6f 6d 65 72 67 65 3d 3d 31 20  ( nAutomerge==1 
53f0: 29 20 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 46  ) nAutomerge = F
5400: 54 53 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  TS5_DEFAULT_AUTO
5410: 4d 45 52 47 45 3b 0a 20 20 20 20 20 20 70 43 6f  MERGE;.      pCo
5420: 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
5430: 20 3d 20 6e 41 75 74 6f 6d 65 72 67 65 3b 0a 20   = nAutomerge;. 
5440: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 6c 73 65     }.  }..  else
5450: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
5460: 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22 63  stricmp(zKey, "c
5470: 72 69 73 69 73 6d 65 72 67 65 22 29 20 29 7b 0a  risismerge") ){.
5480: 20 20 20 20 69 6e 74 20 6e 43 72 69 73 69 73 4d      int nCrisisM
5490: 65 72 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69  erge = -1;.    i
54a0: 66 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  f( SQLITE_INTEGE
54b0: 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  R==sqlite3_value
54c0: 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56  _numeric_type(pV
54d0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 6e 43 72  al) ){.      nCr
54e0: 69 73 69 73 4d 65 72 67 65 20 3d 20 73 71 6c 69  isisMerge = sqli
54f0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56  te3_value_int(pV
5500: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
5510: 66 28 20 6e 43 72 69 73 69 73 4d 65 72 67 65 3c  f( nCrisisMerge<
5520: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 42 61  0 ){.      *pbBa
5530: 64 6b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  dkey = 1;.    }e
5540: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  lse{.      if( n
5550: 43 72 69 73 69 73 4d 65 72 67 65 3c 3d 31 20 29  CrisisMerge<=1 )
5560: 20 6e 43 72 69 73 69 73 4d 65 72 67 65 20 3d 20   nCrisisMerge = 
5570: 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 43 52 49  FTS5_DEFAULT_CRI
5580: 53 49 53 4d 45 52 47 45 3b 0a 20 20 20 20 20 20  SISMERGE;.      
5590: 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73  pConfig->nCrisis
55a0: 4d 65 72 67 65 20 3d 20 6e 43 72 69 73 69 73 4d  Merge = nCrisisM
55b0: 65 72 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erge;.    }.  }.
55c0: 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
55d0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
55e0: 4b 65 79 2c 20 22 72 61 6e 6b 22 29 20 29 7b 0a  Key, "rank") ){.
55f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5600: 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zIn = (const cha
5610: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5620: 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20  _text(pVal);.   
5630: 20 63 68 61 72 20 2a 7a 52 61 6e 6b 3b 0a 20 20   char *zRank;.  
5640: 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67    char *zRankArg
5650: 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
5660: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72  te3Fts5ConfigPar
5670: 73 65 52 61 6e 6b 28 7a 49 6e 2c 20 26 7a 52 61  seRank(zIn, &zRa
5680: 6e 6b 2c 20 26 7a 52 61 6e 6b 41 72 67 73 29 3b  nk, &zRankArgs);
5690: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
56a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
56b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
56c0: 6e 66 69 67 2d 3e 7a 52 61 6e 6b 29 3b 0a 20 20  nfig->zRank);.  
56d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
56e0: 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41  (pConfig->zRankA
56f0: 72 67 73 29 3b 0a 20 20 20 20 20 20 70 43 6f 6e  rgs);.      pCon
5700: 66 69 67 2d 3e 7a 52 61 6e 6b 20 3d 20 7a 52 61  fig->zRank = zRa
5710: 6e 6b 3b 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  nk;.      pConfi
5720: 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a  g->zRankArgs = z
5730: 52 61 6e 6b 41 72 67 73 3b 0a 20 20 20 20 7d 65  RankArgs;.    }e
5740: 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
5750: 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  TE_ERROR ){.    
5760: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
5770: 3b 0a 20 20 20 20 20 20 2a 70 62 42 61 64 6b 65  ;.      *pbBadke
5780: 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 1;.    }.  }
5790: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 62 42 61 64  else{.    *pbBad
57a0: 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  key = 1;.  }.  r
57b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
57c0: 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74  ** Load the cont
57d0: 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f  ents of the %_co
57e0: 6e 66 69 67 20 74 61 62 6c 65 20 69 6e 74 6f 20  nfig table into 
57f0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  memory..*/.int s
5800: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
5810: 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66 69 67 20  Load(Fts5Config 
5820: 2a 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20 69 43  *pConfig, int iC
5830: 6f 6f 6b 69 65 29 7b 0a 20 20 63 6f 6e 73 74 20  ookie){.  const 
5840: 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 20 3d 20  char *zSelect = 
5850: 22 53 45 4c 45 43 54 20 6b 2c 20 76 20 46 52 4f  "SELECT k, v FRO
5860: 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 66 69 67 27  M %Q.'%q_config'
5870: 22 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ";.  char *zSql;
5880: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5890: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  *p = 0;.  int rc
58a0: 3b 0a 20 20 69 6e 74 20 69 56 65 72 73 69 6f 6e  ;.  int iVersion
58b0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20   = 0;..  /* Set 
58c0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 2a  default values *
58d0: 2f 0a 20 20 70 43 6f 6e 66 69 67 2d 3e 70 67 73  /.  pConfig->pgs
58e0: 7a 20 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54  z = FTS5_DEFAULT
58f0: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 43  _PAGE_SIZE;.  pC
5900: 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
5910: 65 20 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54  e = FTS5_DEFAULT
5920: 5f 41 55 54 4f 4d 45 52 47 45 3b 0a 20 20 70 43  _AUTOMERGE;.  pC
5930: 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65  onfig->nCrisisMe
5940: 72 67 65 20 3d 20 46 54 53 35 5f 44 45 46 41 55  rge = FTS5_DEFAU
5950: 4c 54 5f 43 52 49 53 49 53 4d 45 52 47 45 3b 0a  LT_CRISISMERGE;.
5960: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
5970: 33 5f 6d 70 72 69 6e 74 66 28 7a 53 65 6c 65 63  3_mprintf(zSelec
5980: 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c  t, pConfig->zDb,
5990: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29   pConfig->zName)
59a0: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
59b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
59c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
59d0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
59e0: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
59f0: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c  Config->db, zSql
5a00: 2c 20 2d 31 2c 20 26 70 2c 20 30 29 3b 0a 20 20  , -1, &p, 0);.  
5a10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
5a20: 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Sql);.  }..  ass
5a30: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
5a40: 4f 4b 20 7c 7c 20 70 3d 3d 30 20 29 3b 0a 20 20  OK || p==0 );.  
5a50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5a60: 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  K ){.    while( 
5a70: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
5a80: 74 65 33 5f 73 74 65 70 28 70 29 20 29 7b 0a 20  te3_step(p) ){. 
5a90: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5aa0: 2a 7a 4b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  *zK = (const cha
5ab0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5ac0: 6e 5f 74 65 78 74 28 70 2c 20 30 29 3b 0a 20 20  n_text(p, 0);.  
5ad0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5ae0: 65 20 2a 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  e *pVal = sqlite
5af0: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
5b00: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
5b10: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
5b20: 6d 70 28 7a 4b 2c 20 22 76 65 72 73 69 6f 6e 22  mp(zK, "version"
5b30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 56 65  ) ){.        iVe
5b40: 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  rsion = sqlite3_
5b50: 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b  value_int(pVal);
5b60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5b70: 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
5b80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
5b90: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 53  lite3Fts5ConfigS
5ba0: 65 74 56 61 6c 75 65 28 70 43 6f 6e 66 69 67 2c  etValue(pConfig,
5bb0: 20 7a 4b 2c 20 70 56 61 6c 2c 20 26 62 44 75 6d   zK, pVal, &bDum
5bc0: 6d 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  my);.      }.   
5bd0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
5be0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 29 3b  te3_finalize(p);
5bf0: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
5c00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
5c10: 56 65 72 73 69 6f 6e 21 3d 46 54 53 35 5f 43 55  Version!=FTS5_CU
5c20: 52 52 45 4e 54 5f 56 45 52 53 49 4f 4e 20 29 7b  RRENT_VERSION ){
5c30: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5c40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
5c50: 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73  pConfig->pzErrms
5c60: 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
5c70: 74 28 20 30 3d 3d 2a 70 43 6f 6e 66 69 67 2d 3e  t( 0==*pConfig->
5c80: 70 7a 45 72 72 6d 73 67 20 29 3b 0a 20 20 20 20  pzErrmsg );.    
5c90: 20 20 2a 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72    *pConfig->pzEr
5ca0: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
5cb0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
5cc0: 20 20 22 69 6e 76 61 6c 69 64 20 66 74 73 35 20    "invalid fts5 
5cd0: 66 69 6c 65 20 66 6f 72 6d 61 74 20 28 66 6f 75  file format (fou
5ce0: 6e 64 20 25 64 2c 20 65 78 70 65 63 74 65 64 20  nd %d, expected 
5cf0: 25 64 29 20 2d 20 72 75 6e 20 27 72 65 62 75 69  %d) - run 'rebui
5d00: 6c 64 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld'",.          
5d10: 69 56 65 72 73 69 6f 6e 2c 20 46 54 53 35 5f 43  iVersion, FTS5_C
5d20: 55 52 52 45 4e 54 5f 56 45 52 53 49 4f 4e 0a 20  URRENT_VERSION. 
5d30: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
5d40: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
5d50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
5d60: 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 20 3d  onfig->iCookie =
5d70: 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 7d 0a 20 20   iCookie;.  }.  
5d80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
5d90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
5da0: 4e 41 42 4c 45 5f 46 54 53 35 20 2a 2f 0a        NABLE_FTS5 */.