/ Hex Artifact Content
Login

Artifact 6fc92c0b1bda5244c28a54c9ba740736bd5513d9:


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 0a 0a 23 69 6e 63 6c 75  ch..*/....#inclu
01c0: 64 65 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a  de "fts5Int.h"..
01d0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46  #define FTS5_DEF
01e0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 20  AULT_PAGE_SIZE  
01f0: 20 34 30 35 30 0a 23 64 65 66 69 6e 65 20 46 54   4050.#define FT
0200: 53 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  S5_DEFAULT_AUTOM
0210: 45 52 47 45 20 20 20 20 20 20 34 0a 23 64 65 66  ERGE      4.#def
0220: 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54  ine FTS5_DEFAULT
0230: 5f 43 52 49 53 49 53 4d 45 52 47 45 20 20 20 31  _CRISISMERGE   1
0240: 36 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  6.#define FTS5_D
0250: 45 46 41 55 4c 54 5f 48 41 53 48 53 49 5a 45 20  EFAULT_HASHSIZE 
0260: 20 20 20 28 31 30 32 34 2a 31 30 32 34 29 0a 0a     (1024*1024)..
0270: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
0280: 65 64 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  ed page size */.
0290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
02a0: 5f 50 41 47 45 5f 53 49 5a 45 20 28 31 32 38 2a  _PAGE_SIZE (128*
02b0: 31 30 32 34 29 0a 0a 73 74 61 74 69 63 20 69 6e  1024)..static in
02c0: 74 20 66 74 73 35 5f 69 73 77 68 69 74 65 73 70  t fts5_iswhitesp
02d0: 61 63 65 28 63 68 61 72 20 78 29 7b 0a 20 20 72  ace(char x){.  r
02e0: 65 74 75 72 6e 20 28 78 3d 3d 27 20 27 29 3b 0a  eturn (x==' ');.
02f0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
0300: 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65 28 63  s5_isopenquote(c
0310: 68 61 72 20 78 29 7b 0a 20 20 72 65 74 75 72 6e  har x){.  return
0320: 20 28 78 3d 3d 27 22 27 20 7c 7c 20 78 3d 3d 27   (x=='"' || x=='
0330: 5c 27 27 20 7c 7c 20 78 3d 3d 27 5b 27 20 7c 7c  \'' || x=='[' ||
0340: 20 78 3d 3d 27 60 27 29 3b 0a 7d 0a 0a 2f 2a 0a   x=='`');.}../*.
0350: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 6e 20  ** Argument pIn 
0360: 70 6f 69 6e 74 73 20 74 6f 20 61 20 63 68 61 72  points to a char
0370: 61 63 74 65 72 20 74 68 61 74 20 69 73 20 70 61  acter that is pa
0380: 72 74 20 6f 66 20 61 20 6e 75 6c 2d 74 65 72 6d  rt of a nul-term
0390: 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e  inated .** strin
03a0: 67 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  g. Return a poin
03b0: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
03c0: 20 63 68 61 72 61 63 74 65 72 20 66 6f 6c 6c 6f   character follo
03d0: 77 69 6e 67 20 2a 70 49 6e 20 69 6e 20 0a 2a 2a  wing *pIn in .**
03e0: 20 74 68 65 20 73 74 72 69 6e 67 20 74 68 61 74   the string that
03f0: 20 69 73 20 6e 6f 74 20 61 20 77 68 69 74 65 2d   is not a white-
0400: 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72 2e  space character.
0410: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
0420: 20 63 68 61 72 20 2a 66 74 73 35 43 6f 6e 66 69   char *fts5Confi
0430: 67 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28  gSkipWhitespace(
0440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 29  const char *pIn)
0450: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
0460: 70 20 3d 20 70 49 6e 3b 0a 20 20 69 66 28 20 70  p = pIn;.  if( p
0470: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 66   ){.    while( f
0480: 74 73 35 5f 69 73 77 68 69 74 65 73 70 61 63 65  ts5_iswhitespace
0490: 28 2a 70 29 20 29 7b 20 70 2b 2b 3b 20 7d 0a 20  (*p) ){ p++; }. 
04a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
04b0: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
04c0: 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61   pIn points to a
04d0: 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20   character that 
04e0: 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e 75 6c  is part of a nul
04f0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 0a 2a 2a 20  -terminated .** 
0500: 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 61  string. Return a
0510: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
0520: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
0530: 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 49 6e 20 69  following *pIn i
0540: 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  n .** the string
0550: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 22   that is not a "
0560: 62 61 72 65 77 6f 72 64 22 20 63 68 61 72 61 63  bareword" charac
0570: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ter..*/.static c
0580: 6f 6e 73 74 20 63 68 61 72 20 2a 66 74 73 35 43  onst char *fts5C
0590: 6f 6e 66 69 67 53 6b 69 70 42 61 72 65 77 6f 72  onfigSkipBarewor
05a0: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49  d(const char *pI
05b0: 6e 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  n){.  const char
05c0: 20 2a 70 20 3d 20 70 49 6e 3b 0a 20 20 77 68 69   *p = pIn;.  whi
05d0: 6c 65 20 28 20 73 71 6c 69 74 65 33 46 74 73 35  le ( sqlite3Fts5
05e0: 49 73 42 61 72 65 77 6f 72 64 28 2a 70 29 20 29  IsBareword(*p) )
05f0: 20 70 2b 2b 3b 0a 20 20 69 66 28 20 70 3d 3d 70   p++;.  if( p==p
0600: 49 6e 20 29 20 70 20 3d 20 30 3b 0a 20 20 72 65  In ) p = 0;.  re
0610: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 73 74 61 74 69  turn p;.}..stati
0620: 63 20 69 6e 74 20 66 74 73 35 5f 69 73 64 69 67  c int fts5_isdig
0630: 69 74 28 63 68 61 72 20 61 29 7b 0a 20 20 72 65  it(char a){.  re
0640: 74 75 72 6e 20 28 61 3e 3d 27 30 27 20 26 26 20  turn (a>='0' && 
0650: 61 3c 3d 27 39 27 29 3b 0a 7d 0a 0a 0a 0a 73 74  a<='9');.}....st
0660: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0670: 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 4c  *fts5ConfigSkipL
0680: 69 74 65 72 61 6c 28 63 6f 6e 73 74 20 63 68 61  iteral(const cha
0690: 72 20 2a 70 49 6e 29 7b 0a 20 20 63 6f 6e 73 74  r *pIn){.  const
06a0: 20 63 68 61 72 20 2a 70 20 3d 20 70 49 6e 3b 0a   char *p = pIn;.
06b0: 20 20 73 77 69 74 63 68 28 20 2a 70 20 29 7b 0a    switch( *p ){.
06c0: 20 20 20 20 63 61 73 65 20 27 6e 27 3a 20 63 61      case 'n': ca
06d0: 73 65 20 27 4e 27 3a 0a 20 20 20 20 20 20 69 66  se 'N':.      if
06e0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
06f0: 6d 70 28 22 6e 75 6c 6c 22 2c 20 70 2c 20 34 29  mp("null", p, 4)
0700: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
0710: 20 3d 20 26 70 5b 34 5d 3b 0a 20 20 20 20 20 20   = &p[4];.      
0720: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
0730: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
0740: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
0750: 63 61 73 65 20 27 78 27 3a 20 63 61 73 65 20 27  case 'x': case '
0760: 58 27 3a 0a 20 20 20 20 20 20 70 2b 2b 3b 0a 20  X':.      p++;. 
0770: 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27 5c 27       if( *p=='\'
0780: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2b 2b  ' ){.        p++
0790: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
07a0: 20 28 2a 70 3e 3d 27 61 27 20 26 26 20 2a 70 3c   (*p>='a' && *p<
07b0: 3d 27 66 27 29 20 0a 20 20 20 20 20 20 20 20 20  ='f') .         
07c0: 20 20 20 7c 7c 20 28 2a 70 3e 3d 27 41 27 20 26     || (*p>='A' &
07d0: 26 20 2a 70 3c 3d 27 46 27 29 20 0a 20 20 20 20  & *p<='F') .    
07e0: 20 20 20 20 20 20 20 20 7c 7c 20 28 2a 70 3e 3d          || (*p>=
07f0: 27 30 27 20 26 26 20 2a 70 3c 3d 27 39 27 29 20  '0' && *p<='9') 
0800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
0810: 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20            p++;. 
0820: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0830: 20 69 66 28 20 2a 70 3d 3d 27 5c 27 27 20 26 26   if( *p=='\'' &&
0840: 20 30 3d 3d 28 28 70 2d 70 49 6e 29 25 32 29 20   0==((p-pIn)%2) 
0850: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b  ){.          p++
0860: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
0870: 0a 20 20 20 20 20 20 20 20 20 20 70 20 3d 20 30  .          p = 0
0880: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
08a0: 20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a   p = 0;.      }.
08b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
08c0: 20 20 63 61 73 65 20 27 5c 27 27 3a 0a 20 20 20    case '\'':.   
08d0: 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68     p++;.      wh
08e0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20  ile( p ){.      
08f0: 20 20 69 66 28 20 2a 70 3d 3d 27 5c 27 27 20 29    if( *p=='\'' )
0900: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b  {.          p++;
0910: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a  .          if( *
0920: 70 21 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b  p!='\'' ) break;
0930: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0940: 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20     p++;.        
0950: 69 66 28 20 2a 70 3d 3d 30 20 29 20 70 20 3d 20  if( *p==0 ) p = 
0960: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
0970: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
0980: 61 75 6c 74 3a 0a 20 20 20 20 20 20 2f 2a 20 6d  ault:.      /* m
0990: 61 79 62 65 20 61 20 6e 75 6d 62 65 72 20 2a 2f  aybe a number */
09a0: 0a 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27  .      if( *p=='
09b0: 2b 27 20 7c 7c 20 2a 70 3d 3d 27 2d 27 20 29 20  +' || *p=='-' ) 
09c0: 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  p++;.      while
09d0: 28 20 66 74 73 35 5f 69 73 64 69 67 69 74 28 2a  ( fts5_isdigit(*
09e0: 70 29 20 29 20 70 2b 2b 3b 0a 0a 20 20 20 20 20  p) ) p++;..     
09f0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
0a00: 74 2c 20 69 66 20 74 68 65 20 6c 69 74 65 72 61  t, if the litera
0a10: 6c 20 77 61 73 20 61 6e 20 69 6e 74 65 67 65 72  l was an integer
0a20: 2c 20 74 68 65 20 70 61 72 73 65 20 69 73 20 0a  , the parse is .
0a30: 20 20 20 20 20 20 2a 2a 20 66 69 6e 69 73 68 65        ** finishe
0a40: 64 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20  d. Or, if it is 
0a50: 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  a floating point
0a60: 20 76 61 6c 75 65 2c 20 69 74 20 6d 61 79 20 63   value, it may c
0a70: 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 2a 2a  ontinue.      **
0a80: 20 77 69 74 68 20 65 69 74 68 65 72 20 61 20 64   with either a d
0a90: 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 6f 72 20  ecimal point or 
0aa0: 61 6e 20 27 45 27 20 63 68 61 72 61 63 74 65 72  an 'E' character
0ab0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 2a  . */.      if( *
0ac0: 70 3d 3d 27 2e 27 20 26 26 20 66 74 73 35 5f 69  p=='.' && fts5_i
0ad0: 73 64 69 67 69 74 28 70 5b 31 5d 29 20 29 7b 0a  sdigit(p[1]) ){.
0ae0: 20 20 20 20 20 20 20 20 70 20 2b 3d 20 32 3b 0a          p += 2;.
0af0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 66          while( f
0b00: 74 73 35 5f 69 73 64 69 67 69 74 28 2a 70 29 20  ts5_isdigit(*p) 
0b10: 29 20 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ) p++;.      }. 
0b20: 20 20 20 20 20 69 66 28 20 70 3d 3d 70 49 6e 20       if( p==pIn 
0b30: 29 20 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ) p = 0;..      
0b40: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
0b50: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0b60: 20 54 68 65 20 66 69 72 73 74 20 63 68 61 72 61   The first chara
0b70: 63 74 65 72 20 6f 66 20 74 68 65 20 73 74 72 69  cter of the stri
0b80: 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ng pointed to by
0b90: 20 61 72 67 75 6d 65 6e 74 20 7a 20 69 73 20 67   argument z is g
0ba0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
0bb0: 62 65 20 61 6e 20 6f 70 65 6e 2d 71 75 6f 74 65  be an open-quote
0bc0: 20 63 68 61 72 61 63 74 65 72 20 28 73 65 65 20   character (see 
0bd0: 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 69 73  function fts5_is
0be0: 6f 70 65 6e 71 75 6f 74 65 28 29 29 2e 0a 2a 2a  openquote())..**
0bf0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
0c00: 6e 20 73 65 61 72 63 68 65 73 20 66 6f 72 20 74  n searches for t
0c10: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
0c20: 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63 68 61   close-quote cha
0c30: 72 61 63 74 65 72 20 77 69 74 68 69 6e 0a 2a 2a  racter within.**
0c40: 20 74 68 65 20 73 74 72 69 6e 67 20 61 6e 64 2c   the string and,
0c50: 20 69 66 20 66 6f 75 6e 64 2c 20 64 65 71 75 6f   if found, dequo
0c60: 74 65 73 20 74 68 65 20 73 74 72 69 6e 67 20 69  tes the string i
0c70: 6e 20 70 6c 61 63 65 20 61 6e 64 20 61 64 64 73  n place and adds
0c80: 20 61 20 6e 65 77 0a 2a 2a 20 6e 75 6c 2d 74 65   a new.** nul-te
0c90: 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 2e 0a 2a  rminator byte..*
0ca0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6c 6f 73  *.** If the clos
0cb0: 65 2d 71 75 6f 74 65 20 69 73 20 66 6f 75 6e 64  e-quote is found
0cc0: 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  , the value retu
0cd0: 72 6e 65 64 20 69 73 20 74 68 65 20 62 79 74 65  rned is the byte
0ce0: 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20 74 68   offset of.** th
0cf0: 65 20 63 68 61 72 61 63 74 65 72 20 69 6d 6d 65  e character imme
0d00: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
0d10: 67 20 69 74 2e 20 4f 72 2c 20 69 66 20 74 68 65  g it. Or, if the
0d20: 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20 69 73 20   close-quote is 
0d30: 6e 6f 74 20 0a 2a 2a 20 66 6f 75 6e 64 2c 20 2d  not .** found, -
0d40: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  1 is returned. I
0d50: 66 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  f -1 is returned
0d60: 2c 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  , the buffer is 
0d70: 6c 65 66 74 20 69 6e 20 61 6e 20 0a 2a 2a 20 75  left in an .** u
0d80: 6e 64 65 66 69 6e 65 64 20 73 74 61 74 65 2e 0a  ndefined state..
0d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
0da0: 73 35 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a  s5Dequote(char *
0db0: 7a 29 7b 0a 20 20 63 68 61 72 20 71 3b 0a 20 20  z){.  char q;.  
0dc0: 69 6e 74 20 69 49 6e 20 3d 20 31 3b 0a 20 20 69  int iIn = 1;.  i
0dd0: 6e 74 20 69 4f 75 74 20 3d 20 30 3b 0a 20 20 71  nt iOut = 0;.  q
0de0: 20 3d 20 7a 5b 30 5d 3b 0a 0a 20 20 2f 2a 20 53   = z[0];..  /* S
0df0: 65 74 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  et stack variabl
0e00: 65 20 71 20 74 6f 20 74 68 65 20 63 6c 6f 73 65  e q to the close
0e10: 2d 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72  -quote character
0e20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 71 3d   */.  assert( q=
0e30: 3d 27 5b 27 20 7c 7c 20 71 3d 3d 27 5c 27 27 20  ='[' || q=='\'' 
0e40: 7c 7c 20 71 3d 3d 27 22 27 20 7c 7c 20 71 3d 3d  || q=='"' || q==
0e50: 27 60 27 20 29 3b 0a 20 20 69 66 28 20 71 3d 3d  '`' );.  if( q==
0e60: 27 5b 27 20 29 20 71 20 3d 20 27 5d 27 3b 20 20  '[' ) q = ']';  
0e70: 0a 0a 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59  ..  while( ALWAY
0e80: 53 28 7a 5b 69 49 6e 5d 29 20 29 7b 0a 20 20 20  S(z[iIn]) ){.   
0e90: 20 69 66 28 20 7a 5b 69 49 6e 5d 3d 3d 71 20 29   if( z[iIn]==q )
0ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 49  {.      if( z[iI
0eb0: 6e 2b 31 5d 21 3d 71 20 29 7b 0a 20 20 20 20 20  n+1]!=q ){.     
0ec0: 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20     /* Character 
0ed0: 69 49 6e 20 77 61 73 20 74 68 65 20 63 6c 6f 73  iIn was the clos
0ee0: 65 20 71 75 6f 74 65 2e 20 2a 2f 0a 20 20 20 20  e quote. */.    
0ef0: 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
0f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
0f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
0f20: 2a 20 43 68 61 72 61 63 74 65 72 20 69 49 6e 20  * Character iIn 
0f30: 61 6e 64 20 69 49 6e 2b 31 20 66 6f 72 6d 20 61  and iIn+1 form a
0f40: 6e 20 65 73 63 61 70 65 64 20 71 75 6f 74 65 20  n escaped quote 
0f50: 63 68 61 72 61 63 74 65 72 2e 20 53 6b 69 70 0a  character. Skip.
0f60: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69          ** the i
0f70: 6e 70 75 74 20 63 75 72 73 6f 72 20 70 61 73 74  nput cursor past
0f80: 20 62 6f 74 68 20 61 6e 64 20 63 6f 70 79 20 61   both and copy a
0f90: 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 20 63 68   single quote ch
0fa0: 61 72 61 63 74 65 72 20 0a 20 20 20 20 20 20 20  aracter .       
0fb0: 20 2a 2a 20 74 6f 20 74 68 65 20 6f 75 74 70 75   ** to the outpu
0fc0: 74 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20  t buffer. */.   
0fd0: 20 20 20 20 20 69 49 6e 20 2b 3d 20 32 3b 0a 20       iIn += 2;. 
0fe0: 20 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d         z[iOut++]
0ff0: 20 3d 20 71 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = q;.      }.  
1000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1010: 5b 69 4f 75 74 2b 2b 5d 20 3d 20 7a 5b 69 49 6e  [iOut++] = z[iIn
1020: 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ++];.    }.  }..
1030: 20 20 7a 5b 69 4f 75 74 5d 20 3d 20 27 5c 30 27    z[iOut] = '\0'
1040: 3b 0a 20 20 72 65 74 75 72 6e 20 69 49 6e 3b 0a  ;.  return iIn;.
1050: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1060: 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71 75   an SQL-style qu
1070: 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74 6f  oted string into
1080: 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67   a normal string
1090: 20 62 79 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20   by removing.** 
10a0: 74 68 65 20 71 75 6f 74 65 20 63 68 61 72 61 63  the quote charac
10b0: 74 65 72 73 2e 20 20 54 68 65 20 63 6f 6e 76 65  ters.  The conve
10c0: 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e  rsion is done in
10d0: 2d 70 6c 61 63 65 2e 20 20 49 66 20 74 68 65 0a  -place.  If the.
10e0: 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73 20 6e 6f  ** input does no
10f0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 71  t begin with a q
1100: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 2c 20  uote character, 
1110: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1120: 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  e.** is a no-op.
1130: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a  .**.** Examples:
1140: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 61 62 63 22  .**.**     "abc"
1150: 20 20 20 62 65 63 6f 6d 65 73 20 20 20 61 62 63     becomes   abc
1160: 0a 2a 2a 20 20 20 20 20 27 78 79 7a 27 20 20 20  .**     'xyz'   
1170: 62 65 63 6f 6d 65 73 20 20 20 78 79 7a 0a 2a 2a  becomes   xyz.**
1180: 20 20 20 20 20 5b 70 71 72 5d 20 20 20 62 65 63       [pqr]   bec
1190: 6f 6d 65 73 20 20 20 70 71 72 0a 2a 2a 20 20 20  omes   pqr.**   
11a0: 20 20 60 6d 6e 6f 60 20 20 20 62 65 63 6f 6d 65    `mno`   become
11b0: 73 20 20 20 6d 6e 6f 0a 2a 2f 0a 76 6f 69 64 20  s   mno.*/.void 
11c0: 73 71 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f  sqlite3Fts5Dequo
11d0: 74 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  te(char *z){.  c
11e0: 68 61 72 20 71 75 6f 74 65 3b 20 20 20 20 20 20  har quote;      
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1200: 2a 20 51 75 6f 74 65 20 63 68 61 72 61 63 74 65  * Quote characte
1210: 72 20 28 69 66 20 61 6e 79 20 29 20 2a 2f 0a 0a  r (if any ) */..
1220: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73    assert( 0==fts
1230: 35 5f 69 73 77 68 69 74 65 73 70 61 63 65 28 7a  5_iswhitespace(z
1240: 5b 30 5d 29 20 29 3b 0a 20 20 71 75 6f 74 65 20  [0]) );.  quote 
1250: 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 28 20 71 75  = z[0];.  if( qu
1260: 6f 74 65 3d 3d 27 5b 27 20 7c 7c 20 71 75 6f 74  ote=='[' || quot
1270: 65 3d 3d 27 5c 27 27 20 7c 7c 20 71 75 6f 74 65  e=='\'' || quote
1280: 3d 3d 27 22 27 20 7c 7c 20 71 75 6f 74 65 3d 3d  =='"' || quote==
1290: 27 60 27 20 29 7b 0a 20 20 20 20 66 74 73 35 44  '`' ){.    fts5D
12a0: 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7d 0a 7d  equote(z);.  }.}
12b0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
12c0: 22 73 70 65 63 69 61 6c 22 20 43 52 45 41 54 45  "special" CREATE
12d0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
12e0: 69 72 65 63 74 69 76 65 20 61 6e 64 20 75 70 64  irective and upd
12f0: 61 74 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61  ate.** configura
1300: 74 69 6f 6e 20 6f 62 6a 65 63 74 20 70 43 6f 6e  tion object pCon
1310: 66 69 67 20 61 73 20 61 70 70 72 6f 70 72 69 61  fig as appropria
1320: 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  te..**.** If suc
1330: 63 65 73 73 66 75 6c 2c 20 6f 62 6a 65 63 74 20  cessful, object 
1340: 70 43 6f 6e 66 69 67 20 69 73 20 75 70 64 61 74  pConfig is updat
1350: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1360: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
1370: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1380: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
1390: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
13a0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
13b0: 6d 65 73 73 61 67 65 0a 2a 2a 20 6d 61 79 20 62  message.** may b
13c0: 65 20 6c 65 66 74 20 69 6e 20 2a 70 7a 45 72 72  e left in *pzErr
13d0: 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
13e0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
13f0: 65 20 63 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65  e caller to.** e
1400: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 61  ventually free a
1410: 6e 79 20 73 75 63 68 20 65 72 72 6f 72 20 6d 65  ny such error me
1420: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
1430: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
1440: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f  tatic int fts5Co
1450: 6e 66 69 67 50 61 72 73 65 53 70 65 63 69 61 6c  nfigParseSpecial
1460: 28 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a  (.  Fts5Global *
1470: 70 47 6c 6f 62 61 6c 2c 0a 20 20 46 74 73 35 43  pGlobal,.  Fts5C
1480: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
1490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
14a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
14b0: 63 74 20 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a  ct to update */.
14c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
14d0: 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  md,             
14e0: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 6f 6d    /* Special com
14f0: 6d 61 6e 64 20 74 6f 20 70 61 72 73 65 20 2a 2f  mand to parse */
1500: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1510: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
1520: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
1530: 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 68 61  o parse */.  cha
1540: 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20  r **pzErr       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1560: 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
1570: 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
1580: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1590: 20 69 6e 74 20 6e 43 6d 64 20 3d 20 28 69 6e 74   int nCmd = (int
15a0: 29 73 74 72 6c 65 6e 28 7a 43 6d 64 29 3b 0a 20  )strlen(zCmd);. 
15b0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
15c0: 6e 69 63 6d 70 28 22 70 72 65 66 69 78 22 2c 20  nicmp("prefix", 
15d0: 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29  zCmd, nCmd)==0 )
15e0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
15f0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 69  nByte = sizeof(i
1600: 6e 74 29 20 2a 20 46 54 53 35 5f 4d 41 58 5f 50  nt) * FTS5_MAX_P
1610: 52 45 46 49 58 5f 49 4e 44 45 58 45 53 3b 0a 20  REFIX_INDEXES;. 
1620: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
1630: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69  ;.    if( pConfi
1640: 67 2d 3e 61 50 72 65 66 69 78 20 29 7b 0a 20 20  g->aPrefix ){.  
1650: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
1660: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 75  ite3_mprintf("mu
1670: 6c 74 69 70 6c 65 20 70 72 65 66 69 78 3d 2e 2e  ltiple prefix=..
1680: 2e 20 64 69 72 65 63 74 69 76 65 73 22 29 3b 0a  . directives");.
1690: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
16b0: 73 65 7b 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  se{.      pConfi
16c0: 67 2d 3e 61 50 72 65 66 69 78 20 3d 20 73 71 6c  g->aPrefix = sql
16d0: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
16e0: 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a  ro(&rc, nByte);.
16f0: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 7a 41      }.    p = zA
1700: 72 67 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  rg;.    while( r
1710: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1720: 70 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  p[0] ){.      in
1730: 74 20 6e 50 72 65 20 3d 20 30 3b 0a 20 20 20 20  t nPre = 0;.    
1740: 20 20 77 68 69 6c 65 28 20 70 5b 30 5d 3d 3d 27    while( p[0]=='
1750: 20 27 20 29 20 70 2b 2b 3b 0a 20 20 20 20 20 20   ' ) p++;.      
1760: 77 68 69 6c 65 28 20 70 5b 30 5d 3e 3d 27 30 27  while( p[0]>='0'
1770: 20 26 26 20 70 5b 30 5d 3c 3d 27 39 27 20 26 26   && p[0]<='9' &&
1780: 20 6e 50 72 65 3c 31 30 30 30 20 29 7b 0a 20 20   nPre<1000 ){.  
1790: 20 20 20 20 20 20 6e 50 72 65 20 3d 20 6e 50 72        nPre = nPr
17a0: 65 2a 31 30 20 2b 20 28 70 5b 30 5d 20 2d 20 27  e*10 + (p[0] - '
17b0: 30 27 29 3b 0a 20 20 20 20 20 20 20 20 70 2b 2b  0');.        p++
17c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17d0: 77 68 69 6c 65 28 20 70 5b 30 5d 3d 3d 27 20 27  while( p[0]==' '
17e0: 20 29 20 70 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) p++;.      if
17f0: 28 20 70 5b 30 5d 3d 3d 27 2c 27 20 29 7b 0a 20  ( p[0]==',' ){. 
1800: 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20         p++;.    
1810: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 5b 30 5d    }else if( p[0]
1820: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
1830: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
1840: 69 6e 74 66 28 22 6d 61 6c 66 6f 72 6d 65 64 20  intf("malformed 
1850: 70 72 65 66 69 78 3d 2e 2e 2e 20 64 69 72 65 63  prefix=... direc
1860: 74 69 76 65 22 29 3b 0a 20 20 20 20 20 20 20 20  tive");.        
1870: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1880: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
1890: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18a0: 4f 4b 20 26 26 20 28 6e 50 72 65 3d 3d 30 20 7c  OK && (nPre==0 |
18b0: 7c 20 6e 50 72 65 3e 3d 31 30 30 30 29 20 29 7b  | nPre>=1000) ){
18c0: 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20  .        *pzErr 
18d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18e0: 66 28 22 70 72 65 66 69 78 20 6c 65 6e 67 74 68  f("prefix length
18f0: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25   out of range: %
1900: 64 22 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20 20  d", nPre);.     
1910: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1920: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
1930: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72      pConfig->aPr
1940: 65 66 69 78 5b 70 43 6f 6e 66 69 67 2d 3e 6e 50  efix[pConfig->nP
1950: 72 65 66 69 78 5d 20 3d 20 6e 50 72 65 3b 0a 20  refix] = nPre;. 
1960: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 50       pConfig->nP
1970: 72 65 66 69 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20  refix++;.    }. 
1980: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1990: 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  }..  if( sqlite3
19a0: 5f 73 74 72 6e 69 63 6d 70 28 22 74 6f 6b 65 6e  _strnicmp("token
19b0: 69 7a 65 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64  ize", zCmd, nCmd
19c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
19d0: 74 20 63 68 61 72 20 2a 70 20 3d 20 28 63 6f 6e  t char *p = (con
19e0: 73 74 20 63 68 61 72 2a 29 7a 41 72 67 3b 0a 20  st char*)zArg;. 
19f0: 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 28 69     int nArg = (i
1a00: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 72 67 29 20  nt)strlen(zArg) 
1a10: 2b 20 31 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a  + 1;.    char **
1a20: 61 7a 41 72 67 20 3d 20 73 71 6c 69 74 65 33 46  azArg = sqlite3F
1a30: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
1a40: 63 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  c, sizeof(char*)
1a50: 20 2a 20 6e 41 72 67 29 3b 0a 20 20 20 20 63 68   * nArg);.    ch
1a60: 61 72 20 2a 70 44 65 6c 20 3d 20 73 71 6c 69 74  ar *pDel = sqlit
1a70: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1a80: 28 26 72 63 2c 20 6e 41 72 67 20 2a 20 32 29 3b  (&rc, nArg * 2);
1a90: 0a 20 20 20 20 63 68 61 72 20 2a 70 53 70 61 63  .    char *pSpac
1aa0: 65 20 3d 20 70 44 65 6c 3b 0a 0a 20 20 20 20 69  e = pDel;..    i
1ab0: 66 28 20 61 7a 41 72 67 20 26 26 20 70 53 70 61  f( azArg && pSpa
1ac0: 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ce ){.      if( 
1ad0: 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 20 29 7b  pConfig->pTok ){
1ae0: 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20  .        *pzErr 
1af0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1b00: 66 28 22 6d 75 6c 74 69 70 6c 65 20 74 6f 6b 65  f("multiple toke
1b10: 6e 69 7a 65 3d 2e 2e 2e 20 64 69 72 65 63 74 69  nize=... directi
1b20: 76 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ves");.        r
1b30: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1b40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b50: 20 20 20 20 20 20 20 66 6f 72 28 6e 41 72 67 3d         for(nArg=
1b60: 30 3b 20 70 20 26 26 20 2a 70 3b 20 6e 41 72 67  0; p && *p; nArg
1b70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
1b80: 6f 6e 73 74 20 63 68 61 72 20 2a 70 32 20 3d 20  onst char *p2 = 
1b90: 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68  fts5ConfigSkipWh
1ba0: 69 74 65 73 70 61 63 65 28 70 29 3b 0a 20 20 20  itespace(p);.   
1bb0: 20 20 20 20 20 20 20 69 66 28 20 2a 70 32 3d 3d         if( *p2==
1bc0: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
1bd0: 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66      p = fts5Conf
1be0: 69 67 53 6b 69 70 4c 69 74 65 72 61 6c 28 70 32  igSkipLiteral(p2
1bf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1c00: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1c10: 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  p = fts5ConfigSk
1c20: 69 70 42 61 72 65 77 6f 72 64 28 70 32 29 3b 0a  ipBareword(p2);.
1c30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c40: 20 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20        if( p ){. 
1c50: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1c60: 79 28 70 53 70 61 63 65 2c 20 70 32 2c 20 70 2d  y(pSpace, p2, p-
1c70: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p2);.           
1c80: 20 61 7a 41 72 67 5b 6e 41 72 67 5d 20 3d 20 70   azArg[nArg] = p
1c90: 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 20  Space;.         
1ca0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 44 65     sqlite3Fts5De
1cb0: 71 75 6f 74 65 28 70 53 70 61 63 65 29 3b 0a 20  quote(pSpace);. 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 70 53 70 61 63             pSpac
1cd0: 65 20 2b 3d 20 28 70 20 2d 20 70 32 29 20 2b 20  e += (p - p2) + 
1ce0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  1;.            p
1cf0: 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69   = fts5ConfigSki
1d00: 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b 0a  pWhitespace(p);.
1d10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1d30: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p==0 ){.      
1d40: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
1d50: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 70 61  ite3_mprintf("pa
1d60: 72 73 65 20 65 72 72 6f 72 20 69 6e 20 74 6f 6b  rse error in tok
1d70: 65 6e 69 7a 65 20 64 69 72 65 63 74 69 76 65 22  enize directive"
1d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1d90: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1da0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1db0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1dc0: 6c 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b 65  lite3Fts5GetToke
1dd0: 6e 69 7a 65 72 28 70 47 6c 6f 62 61 6c 2c 20 0a  nizer(pGlobal, .
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1df0: 6f 6e 73 74 20 63 68 61 72 2a 2a 29 61 7a 41 72  onst char**)azAr
1e00: 67 2c 20 6e 41 72 67 2c 20 26 70 43 6f 6e 66 69  g, nArg, &pConfi
1e10: 67 2d 3e 70 54 6f 6b 2c 20 26 70 43 6f 6e 66 69  g->pTok, &pConfi
1e20: 67 2d 3e 70 54 6f 6b 41 70 69 2c 0a 20 20 20 20  g->pTokApi,.    
1e30: 20 20 20 20 20 20 20 20 20 20 70 7a 45 72 72 0a            pzErr.
1e40: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e60: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
1e70: 33 5f 66 72 65 65 28 61 7a 41 72 67 29 3b 0a 20  3_free(azArg);. 
1e80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1e90: 70 44 65 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  pDel);.    retur
1ea0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
1eb0: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
1ec0: 70 28 22 63 6f 6e 74 65 6e 74 22 2c 20 7a 43 6d  p("content", zCm
1ed0: 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b 0a 20  d, nCmd)==0 ){. 
1ee0: 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
1ef0: 65 43 6f 6e 74 65 6e 74 21 3d 46 54 53 35 5f 43  eContent!=FTS5_C
1f00: 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b  ONTENT_NORMAL ){
1f10: 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  .      *pzErr = 
1f20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f30: 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 74 65 6e  "multiple conten
1f40: 74 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 73  t=... directives
1f50: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ");.      rc = S
1f60: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
1f80: 28 20 7a 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20  ( zArg[0] ){.   
1f90: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 65 43       pConfig->eC
1fa0: 6f 6e 74 65 6e 74 20 3d 20 46 54 53 35 5f 43 4f  ontent = FTS5_CO
1fb0: 4e 54 45 4e 54 5f 45 58 54 45 52 4e 41 4c 3b 0a  NTENT_EXTERNAL;.
1fc0: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
1fd0: 3e 7a 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69  >zContent = sqli
1fe0: 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26  te3Fts5Mprintf(&
1ff0: 72 63 2c 20 22 25 51 2e 25 51 22 2c 20 70 43 6f  rc, "%Q.%Q", pCo
2000: 6e 66 69 67 2d 3e 7a 44 62 2c 7a 41 72 67 29 3b  nfig->zDb,zArg);
2010: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2020: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 65        pConfig->e
2030: 43 6f 6e 74 65 6e 74 20 3d 20 46 54 53 35 5f 43  Content = FTS5_C
2040: 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 3b 0a 20 20 20  ONTENT_NONE;.   
2050: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2060: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2070: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2080: 6e 69 63 6d 70 28 22 63 6f 6e 74 65 6e 74 5f 72  nicmp("content_r
2090: 6f 77 69 64 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d  owid", zCmd, nCm
20a0: 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  d)==0 ){.    if(
20b0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65   pConfig->zConte
20c0: 6e 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  ntRowid ){.     
20d0: 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
20e0: 33 5f 6d 70 72 69 6e 74 66 28 22 6d 75 6c 74 69  3_mprintf("multi
20f0: 70 6c 65 20 63 6f 6e 74 65 6e 74 5f 72 6f 77 69  ple content_rowi
2100: 64 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 73  d=... directives
2110: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ");.      rc = S
2120: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2130: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
2140: 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 52  onfig->zContentR
2150: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74  owid = sqlite3Ft
2160: 73 35 53 74 72 6e 64 75 70 28 26 72 63 2c 20 7a  s5Strndup(&rc, z
2170: 41 72 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  Arg, -1);.    }.
2180: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2190: 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65   }..  if( sqlite
21a0: 33 5f 73 74 72 6e 69 63 6d 70 28 22 63 6f 6c 75  3_strnicmp("colu
21b0: 6d 6e 73 69 7a 65 22 2c 20 7a 43 6d 64 2c 20 6e  mnsize", zCmd, n
21c0: 43 6d 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Cmd)==0 ){.    i
21d0: 66 28 20 28 7a 41 72 67 5b 30 5d 21 3d 27 30 27  f( (zArg[0]!='0'
21e0: 20 26 26 20 7a 41 72 67 5b 30 5d 21 3d 27 31 27   && zArg[0]!='1'
21f0: 29 20 7c 7c 20 7a 41 72 67 5b 31 5d 21 3d 27 5c  ) || zArg[1]!='\
2200: 30 27 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45  0' ){.      *pzE
2210: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
2220: 69 6e 74 66 28 22 6d 61 6c 66 6f 72 6d 65 64 20  intf("malformed 
2230: 63 6f 6c 75 6d 6e 73 69 7a 65 3d 2e 2e 2e 20 64  columnsize=... d
2240: 69 72 65 63 74 69 76 65 22 29 3b 0a 20 20 20 20  irective");.    
2250: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2260: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
2270: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 62        pConfig->b
2280: 43 6f 6c 75 6d 6e 73 69 7a 65 20 3d 20 28 7a 41  Columnsize = (zA
2290: 72 67 5b 30 5d 3d 3d 27 31 27 29 3b 0a 20 20 20  rg[0]=='1');.   
22a0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
22b0: 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 45 72 72 20  ;.  }..  *pzErr 
22c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
22d0: 66 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  f("unrecognized 
22e0: 6f 70 74 69 6f 6e 3a 20 5c 22 25 2e 2a 73 5c 22  option: \"%.*s\"
22f0: 22 2c 20 6e 43 6d 64 2c 20 7a 43 6d 64 29 3b 0a  ", nCmd, zCmd);.
2300: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2310: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
2320: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 69 6e 73 74  Allocate an inst
2330: 61 6e 63 65 20 6f 66 20 74 68 65 20 64 65 66 61  ance of the defa
2340: 75 6c 74 20 74 6f 6b 65 6e 69 7a 65 72 20 28 22  ult tokenizer ("
2350: 73 69 6d 70 6c 65 22 29 20 61 74 20 0a 2a 2a 20  simple") at .** 
2360: 46 74 73 35 43 6f 6e 66 69 67 2e 70 54 6f 6b 65  Fts5Config.pToke
2370: 6e 69 7a 65 72 2e 20 52 65 74 75 72 6e 20 53 51  nizer. Return SQ
2380: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
2390: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
23a0: 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
23b0: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
23c0: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
23d0: 69 6e 74 20 66 74 73 35 43 6f 6e 66 69 67 44 65  int fts5ConfigDe
23e0: 66 61 75 6c 74 54 6f 6b 65 6e 69 7a 65 72 28 46  faultTokenizer(F
23f0: 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62  ts5Global *pGlob
2400: 61 6c 2c 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  al, Fts5Config *
2410: 70 43 6f 6e 66 69 67 29 7b 0a 20 20 61 73 73 65  pConfig){.  asse
2420: 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f  rt( pConfig->pTo
2430: 6b 3d 3d 30 20 26 26 20 70 43 6f 6e 66 69 67 2d  k==0 && pConfig-
2440: 3e 70 54 6f 6b 41 70 69 3d 3d 30 20 29 3b 0a 20  >pTokApi==0 );. 
2450: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
2460: 74 73 35 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28  ts5GetTokenizer(
2470: 0a 20 20 20 20 20 20 70 47 6c 6f 62 61 6c 2c 20  .      pGlobal, 
2480: 30 2c 20 30 2c 20 26 70 43 6f 6e 66 69 67 2d 3e  0, 0, &pConfig->
2490: 70 54 6f 6b 2c 20 26 70 43 6f 6e 66 69 67 2d 3e  pTok, &pConfig->
24a0: 70 54 6f 6b 41 70 69 2c 20 30 0a 20 20 29 3b 0a  pTokApi, 0.  );.
24b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 6f 62 62 6c 65 20  }../*.** Gobble 
24c0: 75 70 20 74 68 65 20 66 69 72 73 74 20 62 61 72  up the first bar
24d0: 65 77 6f 72 64 20 6f 72 20 71 75 6f 74 65 64 20  eword or quoted 
24e0: 77 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  word from the in
24f0: 70 75 74 20 62 75 66 66 65 72 20 7a 49 6e 2e 0a  put buffer zIn..
2500: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2510: 74 65 72 20 74 6f 20 74 68 65 20 63 68 61 72 61  ter to the chara
2520: 63 74 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  cter immediately
2530: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
2540: 61 73 74 20 69 6e 0a 2a 2a 20 74 68 65 20 67 6f  ast in.** the go
2550: 62 62 6c 65 64 20 77 6f 72 64 20 69 66 20 73 75  bbled word if su
2560: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 20 4e  ccessful, or a N
2570: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 74 68 65  ULL pointer othe
2580: 72 77 69 73 65 20 28 66 61 69 6c 65 64 0a 2a 2a  rwise (failed.**
2590: 20 74 6f 20 66 69 6e 64 20 63 6c 6f 73 65 2d 71   to find close-q
25a0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 29 2e  uote character).
25b0: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
25c0: 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 70 7a 4f  turning, set pzO
25d0: 75 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ut to point to a
25e0: 20 6e 65 77 20 62 75 66 66 65 72 20 63 6f 6e 74   new buffer cont
25f0: 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  aining a.** nul-
2600: 74 65 72 6d 69 6e 61 74 65 64 2c 20 64 65 71 75  terminated, dequ
2610: 6f 74 65 64 20 63 6f 70 79 20 6f 66 20 74 68 65  oted copy of the
2620: 20 67 6f 62 62 6c 65 64 20 77 6f 72 64 2e 20 49   gobbled word. I
2630: 66 20 74 68 65 20 77 6f 72 64 20 77 61 73 0a 2a  f the word was.*
2640: 2a 20 71 75 6f 74 65 64 2c 20 2a 70 62 51 75 6f  * quoted, *pbQuo
2650: 74 65 64 20 69 73 20 61 6c 73 6f 20 73 65 74 20  ted is also set 
2660: 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75  to 1 before retu
2670: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
2680: 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68  *pRc is other th
2690: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  an SQLITE_OK whe
26a0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26b0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
26c0: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 20 28 4e 55 4c  .** a no-op (NUL
26d0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 29 2e 20  L is returned). 
26e0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
26f0: 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77 69 74 68   OOM occurs with
2700: 69 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  in this.** funct
2710: 69 6f 6e 2c 20 2a 70 52 63 20 69 73 20 73 65 74  ion, *pRc is set
2720: 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
2730: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2740: 67 2e 20 2a 70 52 63 20 69 73 20 2a 6e 6f 74 2a  g. *pRc is *not*
2750: 0a 2a 2a 20 73 65 74 20 69 66 20 61 20 70 61 72  .** set if a par
2760: 73 65 20 65 72 72 6f 72 20 28 66 61 69 6c 65 64  se error (failed
2770: 20 74 6f 20 66 69 6e 64 20 63 6c 6f 73 65 20 71   to find close q
2780: 75 6f 74 65 29 20 6f 63 63 75 72 73 2e 0a 2a 2f  uote) occurs..*/
2790: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
27a0: 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 47 6f  ar *fts5ConfigGo
27b0: 62 62 6c 65 57 6f 72 64 28 0a 20 20 69 6e 74 20  bbleWord(.  int 
27c0: 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27e0: 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
27f0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2800: 72 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20 20 20  r *zIn,         
2810: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
2820: 20 74 6f 20 67 6f 62 62 6c 65 20 73 74 72 69 6e   to gobble strin
2830: 67 2f 62 61 72 65 77 6f 72 64 20 66 72 6f 6d 20  g/bareword from 
2840: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 4f 75  */.  char **pzOu
2850: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2860: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 6d 61 6c       /* OUT: mal
2870: 6c 6f 63 27 64 20 62 75 66 66 65 72 20 63 6f 6e  loc'd buffer con
2880: 74 61 69 6e 69 6e 67 20 73 74 72 2f 62 77 20 2a  taining str/bw *
2890: 2f 0a 20 20 69 6e 74 20 2a 70 62 51 75 6f 74 65  /.  int *pbQuote
28a0: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
28b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
28c0: 74 6f 20 74 72 75 65 20 69 66 20 64 65 71 75 6f  to true if dequo
28d0: 74 69 6e 67 20 72 65 71 75 69 72 65 64 20 2a 2f  ting required */
28e0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
28f0: 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20 69   *zRet = 0;..  i
2900: 6e 74 20 6e 49 6e 20 3d 20 28 69 6e 74 29 73 74  nt nIn = (int)st
2910: 72 6c 65 6e 28 7a 49 6e 29 3b 0a 20 20 63 68 61  rlen(zIn);.  cha
2920: 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
2930: 33 5f 6d 61 6c 6c 6f 63 28 6e 49 6e 2b 31 29 3b  3_malloc(nIn+1);
2940: 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 63  ..  assert( *pRc
2950: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2960: 20 2a 70 62 51 75 6f 74 65 64 20 3d 20 30 3b 0a   *pbQuoted = 0;.
2970: 20 20 2a 70 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20    *pzOut = 0;.. 
2980: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a   if( zOut==0 ){.
2990: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
29a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
29b0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75  {.    memcpy(zOu
29c0: 74 2c 20 7a 49 6e 2c 20 6e 49 6e 2b 31 29 3b 0a  t, zIn, nIn+1);.
29d0: 20 20 20 20 69 66 28 20 66 74 73 35 5f 69 73 6f      if( fts5_iso
29e0: 70 65 6e 71 75 6f 74 65 28 7a 4f 75 74 5b 30 5d  penquote(zOut[0]
29f0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
2a00: 69 20 3d 20 66 74 73 35 44 65 71 75 6f 74 65 28  i = fts5Dequote(
2a10: 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 7a 52 65  zOut);.      zRe
2a20: 74 20 3d 20 26 7a 49 6e 5b 69 69 5d 3b 0a 20 20  t = &zIn[ii];.  
2a30: 20 20 20 20 2a 70 62 51 75 6f 74 65 64 20 3d 20      *pbQuoted = 
2a40: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2a50: 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 43      zRet = fts5C
2a60: 6f 6e 66 69 67 53 6b 69 70 42 61 72 65 77 6f 72  onfigSkipBarewor
2a70: 64 28 7a 49 6e 29 3b 0a 20 20 20 20 20 20 7a 4f  d(zIn);.      zO
2a80: 75 74 5b 7a 52 65 74 2d 7a 49 6e 5d 20 3d 20 27  ut[zRet-zIn] = '
2a90: 5c 30 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  \0';.    }.  }..
2aa0: 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 7b    if( zRet==0 ){
2ab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2ac0: 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  e(zOut);.  }else
2ad0: 7b 0a 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20 7a  {.    *pzOut = z
2ae0: 4f 75 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Out;.  }..  retu
2af0: 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74  rn zRet;.}..stat
2b00: 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e 66 69  ic int fts5Confi
2b10: 67 50 61 72 73 65 43 6f 6c 75 6d 6e 28 0a 20 20  gParseColumn(.  
2b20: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 2c 20 0a  Fts5Config *p, .
2b30: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 0a 20    char *zCol, . 
2b40: 20 63 68 61 72 20 2a 7a 41 72 67 2c 20 0a 20 20   char *zArg, .  
2b50: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
2b60: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b70: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 73  E_OK;.  if( 0==s
2b80: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2b90: 43 6f 6c 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e  Col, FTS5_RANK_N
2ba0: 41 4d 45 29 20 0a 20 20 20 7c 7c 20 30 3d 3d 73  AME) .   || 0==s
2bb0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2bc0: 43 6f 6c 2c 20 46 54 53 35 5f 52 4f 57 49 44 5f  Col, FTS5_ROWID_
2bd0: 4e 41 4d 45 29 20 0a 20 20 29 7b 0a 20 20 20 20  NAME) .  ){.    
2be0: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
2bf0: 5f 6d 70 72 69 6e 74 66 28 22 72 65 73 65 72 76  _mprintf("reserv
2c00: 65 64 20 66 74 73 35 20 63 6f 6c 75 6d 6e 20 6e  ed fts5 column n
2c10: 61 6d 65 3a 20 25 73 22 2c 20 7a 43 6f 6c 29 3b  ame: %s", zCol);
2c20: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c30: 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20  _ERROR;.  }else 
2c40: 69 66 28 20 7a 41 72 67 20 29 7b 0a 20 20 20 20  if( zArg ){.    
2c50: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
2c60: 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 75 6e  tricmp(zArg, "un
2c70: 69 6e 64 65 78 65 64 22 29 20 29 7b 0a 20 20 20  indexed") ){.   
2c80: 20 20 20 70 2d 3e 61 62 55 6e 69 6e 64 65 78 65     p->abUnindexe
2c90: 64 5b 70 2d 3e 6e 43 6f 6c 5d 20 3d 20 31 3b 0a  d[p->nCol] = 1;.
2ca0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cb0: 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
2cc0: 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 72 65 63  3_mprintf("unrec
2cd0: 6f 67 6e 69 7a 65 64 20 63 6f 6c 75 6d 6e 20 6f  ognized column o
2ce0: 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 41 72 67  ption: %s", zArg
2cf0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
2d00: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2d10: 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 7a 43 6f  }.  }..  p->azCo
2d20: 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 20 3d 20 7a  l[p->nCol++] = z
2d30: 43 6f 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Col;.  return rc
2d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  ;.}../*.** Popul
2d50: 61 74 65 20 74 68 65 20 46 74 73 35 43 6f 6e 66  ate the Fts5Conf
2d60: 69 67 2e 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c  ig.zContentExprl
2d70: 69 73 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ist string..*/.s
2d80: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f  tatic int fts5Co
2d90: 6e 66 69 67 4d 61 6b 65 45 78 70 72 6c 69 73 74  nfigMakeExprlist
2da0: 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 29 7b  (Fts5Config *p){
2db0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2dc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2dd0: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
2de0: 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20   = {0, 0, 0};.. 
2df0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2e00: 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
2e10: 72 63 2c 20 26 62 75 66 2c 20 22 54 2e 25 51 22  rc, &buf, "T.%Q"
2e20: 2c 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77  , p->zContentRow
2e30: 69 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43  id);.  if( p->eC
2e40: 6f 6e 74 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e  ontent!=FTS5_CON
2e50: 54 45 4e 54 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TENT_NONE ){.   
2e60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2e70: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2e80: 20 69 66 28 20 70 2d 3e 65 43 6f 6e 74 65 6e 74   if( p->eContent
2e90: 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 45  ==FTS5_CONTENT_E
2ea0: 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20 20 20  XTERNAL ){.     
2eb0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ec0: 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ed0: 28 26 72 63 2c 20 26 62 75 66 2c 20 22 2c 20 54  (&rc, &buf, ", T
2ee0: 2e 25 51 22 2c 20 70 2d 3e 61 7a 43 6f 6c 5b 69  .%Q", p->azCol[i
2ef0: 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
2f00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f10: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f20: 50 72 69 6e 74 66 28 26 72 63 2c 20 26 62 75 66  Printf(&rc, &buf
2f30: 2c 20 22 2c 20 54 2e 63 25 64 22 2c 20 69 29 3b  , ", T.c%d", i);
2f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f50: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
2f60: 3e 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73  >zContentExprlis
2f70: 74 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 43 6f  t==0 );.  p->zCo
2f80: 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 20 3d 20  ntentExprlist = 
2f90: 28 63 68 61 72 2a 29 62 75 66 2e 70 3b 0a 20 20  (char*)buf.p;.  
2fa0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2fb0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 6e 41  .** Arguments nA
2fc0: 72 67 2f 61 7a 41 72 67 20 63 6f 6e 74 61 69 6e  rg/azArg contain
2fd0: 20 74 68 65 20 73 74 72 69 6e 67 20 61 72 67 75   the string argu
2fe0: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
2ff0: 74 68 65 20 78 43 72 65 61 74 65 0a 2a 2a 20 6f  the xCreate.** o
3000: 72 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  r xConnect metho
3010: 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
3020: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
3030: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
3040: 6f 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 61  o .** allocate a
3050: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 46 74  n instance of Ft
3060: 73 35 43 6f 6e 66 69 67 20 63 6f 6e 74 61 69 6e  s5Config contain
3070: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
3080: 6f 66 20 70 61 72 73 69 6e 67 0a 2a 2a 20 74 68  of parsing.** th
3090: 6f 73 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  ose arguments..*
30a0: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
30b0: 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
30c0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
30d0: 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70  pOut is set to p
30e0: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e  oint to the.** n
30f0: 65 77 20 46 74 73 35 43 6f 6e 66 69 67 20 6f 62  ew Fts5Config ob
3100: 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
3110: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
3120: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
3130: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20  s .** returned, 
3140: 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *ppOut is set to
3150: 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 65 72 72   NULL and an err
3160: 6f 72 20 6d 65 73 73 61 67 65 20 6d 61 79 20 62  or message may b
3170: 65 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 2a 70 7a  e left in.** *pz
3180: 45 72 72 2e 20 49 74 20 69 73 20 74 68 65 20 72  Err. It is the r
3190: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
31a0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
31b0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 61  ventually free a
31c0: 6e 79 20 0a 2a 2a 20 73 75 63 68 20 65 72 72 6f  ny .** such erro
31d0: 72 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  r message using 
31e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
31f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
3200: 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28 0a 20  s5ConfigParse(. 
3210: 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c   Fts5Global *pGl
3220: 6f 62 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 20  obal,.  sqlite3 
3230: 2a 64 62 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  *db,.  int nArg,
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3250: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3260: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3270: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
3280: 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  azArg,          
3290: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6e     /* Array of n
32a0: 41 72 67 20 43 52 45 41 54 45 20 56 49 52 54 55  Arg CREATE VIRTU
32b0: 41 4c 20 54 41 42 4c 45 20 61 72 67 73 20 2a 2f  AL TABLE args */
32c0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 2a  .  Fts5Config **
32d0: 70 70 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20  ppOut,          
32e0: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
32f0: 74 73 20 6f 66 20 70 61 72 73 65 20 2a 2f 0a 20  ts of parse */. 
3300: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
3330: 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  essage */.){.  i
3340: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
3350: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
3360: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
3370: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
3380: 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
3390: 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
33a0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
33b0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
33c0: 74 65 3b 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20  te;..  *ppOut = 
33d0: 70 52 65 74 20 3d 20 28 46 74 73 35 43 6f 6e 66  pRet = (Fts5Conf
33e0: 69 67 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ig*)sqlite3_mall
33f0: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 35 43 6f  oc(sizeof(Fts5Co
3400: 6e 66 69 67 29 29 3b 0a 20 20 69 66 28 20 70 52  nfig));.  if( pR
3410: 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  et==0 ) return S
3420: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
3430: 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 73  emset(pRet, 0, s
3440: 69 7a 65 6f 66 28 46 74 73 35 43 6f 6e 66 69 67  izeof(Fts5Config
3450: 29 29 3b 0a 20 20 70 52 65 74 2d 3e 64 62 20 3d  ));.  pRet->db =
3460: 20 64 62 3b 0a 20 20 70 52 65 74 2d 3e 69 43 6f   db;.  pRet->iCo
3470: 6f 6b 69 65 20 3d 20 2d 31 3b 0a 0a 20 20 6e 42  okie = -1;..  nB
3480: 79 74 65 20 3d 20 6e 41 72 67 20 2a 20 28 73 69  yte = nArg * (si
3490: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
34a0: 7a 65 6f 66 28 75 38 29 29 3b 0a 20 20 70 52 65  zeof(u8));.  pRe
34b0: 74 2d 3e 61 7a 43 6f 6c 20 3d 20 28 63 68 61 72  t->azCol = (char
34c0: 2a 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  **)sqlite3Fts5Ma
34d0: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
34e0: 79 74 65 29 3b 0a 20 20 70 52 65 74 2d 3e 61 62  yte);.  pRet->ab
34f0: 55 6e 69 6e 64 65 78 65 64 20 3d 20 28 75 38 2a  Unindexed = (u8*
3500: 29 26 70 52 65 74 2d 3e 61 7a 43 6f 6c 5b 6e 41  )&pRet->azCol[nA
3510: 72 67 5d 3b 0a 20 20 70 52 65 74 2d 3e 7a 44 62  rg];.  pRet->zDb
3520: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
3530: 72 6e 64 75 70 28 26 72 63 2c 20 61 7a 41 72 67  rndup(&rc, azArg
3540: 5b 31 5d 2c 20 2d 31 29 3b 0a 20 20 70 52 65 74  [1], -1);.  pRet
3550: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
3560: 33 46 74 73 35 53 74 72 6e 64 75 70 28 26 72 63  3Fts5Strndup(&rc
3570: 2c 20 61 7a 41 72 67 5b 32 5d 2c 20 2d 31 29 3b  , azArg[2], -1);
3580: 0a 20 20 70 52 65 74 2d 3e 62 43 6f 6c 75 6d 6e  .  pRet->bColumn
3590: 73 69 7a 65 20 3d 20 31 3b 0a 23 69 66 64 65 66  size = 1;.#ifdef
35a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
35b0: 70 52 65 74 2d 3e 62 50 72 65 66 69 78 49 6e 64  pRet->bPrefixInd
35c0: 65 78 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  ex = 1;.#endif. 
35d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35e0: 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
35f0: 72 69 63 6d 70 28 70 52 65 74 2d 3e 7a 4e 61 6d  ricmp(pRet->zNam
3600: 65 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d  e, FTS5_RANK_NAM
3610: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a  E)==0 ){.    *pz
3620: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
3630: 72 69 6e 74 66 28 22 72 65 73 65 72 76 65 64 20  rintf("reserved 
3640: 66 74 73 35 20 74 61 62 6c 65 20 6e 61 6d 65 3a  fts5 table name:
3650: 20 25 73 22 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d   %s", pRet->zNam
3660: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
3670: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
3680: 20 20 66 6f 72 28 69 3d 33 3b 20 72 63 3d 3d 53    for(i=3; rc==S
3690: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41  QLITE_OK && i<nA
36a0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rg; i++){.    co
36b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 20  nst char *zOrig 
36c0: 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
36d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
36e0: 20 20 20 63 68 61 72 20 2a 7a 4f 6e 65 20 3d 20     char *zOne = 
36f0: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 77  0;.    char *zTw
3700: 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62  o = 0;.    int b
3710: 4f 70 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  Option = 0;.    
3720: 69 6e 74 20 62 4d 75 73 74 42 65 43 6f 6c 20 3d  int bMustBeCol =
3730: 20 30 3b 0a 0a 20 20 20 20 7a 20 3d 20 66 74 73   0;..    z = fts
3740: 35 43 6f 6e 66 69 67 47 6f 62 62 6c 65 57 6f 72  5ConfigGobbleWor
3750: 64 28 26 72 63 2c 20 7a 4f 72 69 67 2c 20 26 7a  d(&rc, zOrig, &z
3760: 4f 6e 65 2c 20 26 62 4d 75 73 74 42 65 43 6f 6c  One, &bMustBeCol
3770: 29 3b 0a 20 20 20 20 7a 20 3d 20 66 74 73 35 43  );.    z = fts5C
3780: 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73 70  onfigSkipWhitesp
3790: 61 63 65 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  ace(z);.    if( 
37a0: 7a 20 26 26 20 2a 7a 3d 3d 27 3d 27 20 29 7b 0a  z && *z=='=' ){.
37b0: 20 20 20 20 20 20 62 4f 70 74 69 6f 6e 20 3d 20        bOption = 
37c0: 31 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  1;.      z++;.  
37d0: 20 20 20 20 69 66 28 20 62 4d 75 73 74 42 65 43      if( bMustBeC
37e0: 6f 6c 20 29 20 7a 20 3d 20 30 3b 0a 20 20 20 20  ol ) z = 0;.    
37f0: 7d 0a 20 20 20 20 7a 20 3d 20 66 74 73 35 43 6f  }.    z = fts5Co
3800: 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73 70 61  nfigSkipWhitespa
3810: 63 65 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a  ce(z);.    if( z
3820: 20 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20   && z[0] ){.    
3830: 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
3840: 20 20 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66      z = fts5Conf
3850: 69 67 47 6f 62 62 6c 65 57 6f 72 64 28 26 72 63  igGobbleWord(&rc
3860: 2c 20 7a 2c 20 26 7a 54 77 6f 2c 20 26 62 44 75  , z, &zTwo, &bDu
3870: 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mmy);.      if( 
3880: 7a 20 26 26 20 7a 5b 30 5d 20 29 20 7a 20 3d 20  z && z[0] ) z = 
3890: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
38a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
38b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  ){.      if( z==
38c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  0 ){.        *pz
38d0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
38e0: 72 69 6e 74 66 28 22 70 61 72 73 65 20 65 72 72  rintf("parse err
38f0: 6f 72 20 69 6e 20 5c 22 25 73 5c 22 22 2c 20 7a  or in \"%s\"", z
3900: 4f 72 69 67 29 3b 0a 20 20 20 20 20 20 20 20 72  Orig);.        r
3910: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
3920: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3930: 20 20 20 20 20 20 20 69 66 28 20 62 4f 70 74 69         if( bOpti
3940: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
3950: 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 50  rc = fts5ConfigP
3960: 61 72 73 65 53 70 65 63 69 61 6c 28 70 47 6c 6f  arseSpecial(pGlo
3970: 62 61 6c 2c 20 70 52 65 74 2c 20 7a 4f 6e 65 2c  bal, pRet, zOne,
3980: 20 7a 54 77 6f 3f 7a 54 77 6f 3a 22 22 2c 20 70   zTwo?zTwo:"", p
3990: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  zErr);.        }
39a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
39b0: 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 50  rc = fts5ConfigP
39c0: 61 72 73 65 43 6f 6c 75 6d 6e 28 70 52 65 74 2c  arseColumn(pRet,
39d0: 20 7a 4f 6e 65 2c 20 7a 54 77 6f 2c 20 70 7a 45   zOne, zTwo, pzE
39e0: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rr);.          z
39f0: 4f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  One = 0;.       
3a00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3a10: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
3a20: 65 65 28 7a 4f 6e 65 29 3b 0a 20 20 20 20 73 71  ee(zOne);.    sq
3a30: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 77 6f 29  lite3_free(zTwo)
3a40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
3a50: 20 74 6f 6b 65 6e 69 7a 65 72 3d 20 6f 70 74 69   tokenizer= opti
3a60: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
3a70: 6c 6c 79 20 70 61 72 73 65 64 2c 20 74 68 65 20  lly parsed, the 
3a80: 74 6f 6b 65 6e 69 7a 65 72 20 68 61 73 0a 20 20  tokenizer has.  
3a90: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
3aa0: 61 6c 6c 6f 63 61 74 65 64 2e 20 4f 74 68 65 72  allocated. Other
3ab0: 77 69 73 65 2c 20 61 6c 6c 6f 63 61 74 65 20 61  wise, allocate a
3ac0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3ad0: 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 74  e default.  ** t
3ae0: 6f 6b 65 6e 69 7a 65 72 20 28 75 6e 69 63 6f 64  okenizer (unicod
3af0: 65 36 31 29 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20  e61) now.  */.  
3b00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3b10: 4b 20 26 26 20 70 52 65 74 2d 3e 70 54 6f 6b 3d  K && pRet->pTok=
3b20: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  =0 ){.    rc = f
3b30: 74 73 35 43 6f 6e 66 69 67 44 65 66 61 75 6c 74  ts5ConfigDefault
3b40: 54 6f 6b 65 6e 69 7a 65 72 28 70 47 6c 6f 62 61  Tokenizer(pGloba
3b50: 6c 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 0a 20  l, pRet);.  }.. 
3b60: 20 2f 2a 20 49 66 20 6e 6f 20 7a 43 6f 6e 74 65   /* If no zConte
3b70: 6e 74 20 6f 70 74 69 6f 6e 20 77 61 73 20 73 70  nt option was sp
3b80: 65 63 69 66 69 65 64 2c 20 66 69 6c 6c 20 69 6e  ecified, fill in
3b90: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
3ba0: 75 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ues. */.  if( rc
3bb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
3bc0: 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 3d 3d 30  Ret->zContent==0
3bd0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
3be0: 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  ar *zTail = 0;. 
3bf0: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74 2d     assert( pRet-
3c00: 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f  >eContent==FTS5_
3c10: 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 0a  CONTENT_NORMAL .
3c20: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 52 65 74           || pRet
3c30: 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35  ->eContent==FTS5
3c40: 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20 0a 20  _CONTENT_NONE . 
3c50: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 52     );.    if( pR
3c60: 65 74 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54  et->eContent==FT
3c70: 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41  S5_CONTENT_NORMA
3c80: 4c 20 29 7b 0a 20 20 20 20 20 20 7a 54 61 69 6c  L ){.      zTail
3c90: 20 3d 20 22 63 6f 6e 74 65 6e 74 22 3b 0a 20 20   = "content";.  
3ca0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 65 74    }else if( pRet
3cb0: 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b  ->bColumnsize ){
3cc0: 0a 20 20 20 20 20 20 7a 54 61 69 6c 20 3d 20 22  .      zTail = "
3cd0: 64 6f 63 73 69 7a 65 22 3b 0a 20 20 20 20 7d 0a  docsize";.    }.
3ce0: 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29  .    if( zTail )
3cf0: 7b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 7a 43  {.      pRet->zC
3d00: 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  ontent = sqlite3
3d10: 46 74 73 35 4d 70 72 69 6e 74 66 28 0a 20 20 20  Fts5Mprintf(.   
3d20: 20 20 20 20 20 20 20 26 72 63 2c 20 22 25 51 2e         &rc, "%Q.
3d30: 27 25 71 5f 25 73 27 22 2c 20 70 52 65 74 2d 3e  '%q_%s'", pRet->
3d40: 7a 44 62 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d 65  zDb, pRet->zName
3d50: 2c 20 7a 54 61 69 6c 0a 20 20 20 20 20 20 29 3b  , zTail.      );
3d60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
3d70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3d80: 26 26 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e  && pRet->zConten
3d90: 74 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20  tRowid==0 ){.   
3da0: 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 52   pRet->zContentR
3db0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74  owid = sqlite3Ft
3dc0: 73 35 53 74 72 6e 64 75 70 28 26 72 63 2c 20 22  s5Strndup(&rc, "
3dd0: 72 6f 77 69 64 22 2c 20 2d 31 29 3b 0a 20 20 7d  rowid", -1);.  }
3de0: 0a 0a 20 20 2f 2a 20 46 6f 72 6d 75 6c 61 74 65  ..  /* Formulate
3df0: 20 74 68 65 20 7a 43 6f 6e 74 65 6e 74 45 78 70   the zContentExp
3e00: 72 6c 69 73 74 20 74 65 78 74 20 2a 2f 0a 20 20  rlist text */.  
3e10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3e20: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
3e30: 73 35 43 6f 6e 66 69 67 4d 61 6b 65 45 78 70 72  s5ConfigMakeExpr
3e40: 6c 69 73 74 28 70 52 65 74 29 3b 0a 20 20 7d 0a  list(pRet);.  }.
3e50: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3e60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
3e70: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 46 72 65  te3Fts5ConfigFre
3e80: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 2a 70 70  e(pRet);.    *pp
3e90: 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Out = 0;.  }.  r
3ea0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3eb0: 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 66  ** Free the conf
3ec0: 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74  iguration object
3ed0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
3ee0: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
3ef0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
3f00: 35 43 6f 6e 66 69 67 46 72 65 65 28 46 74 73 35  5ConfigFree(Fts5
3f10: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 29  Config *pConfig)
3f20: 7b 0a 20 20 69 66 28 20 70 43 6f 6e 66 69 67 20  {.  if( pConfig 
3f30: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
3f40: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 70    if( pConfig->p
3f50: 54 6f 6b 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  Tok ){.      pCo
3f60: 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69 2d 3e 78  nfig->pTokApi->x
3f70: 44 65 6c 65 74 65 28 70 43 6f 6e 66 69 67 2d 3e  Delete(pConfig->
3f80: 70 54 6f 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTok);.    }.   
3f90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
3fa0: 6f 6e 66 69 67 2d 3e 7a 44 62 29 3b 0a 20 20 20  onfig->zDb);.   
3fb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
3fc0: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  onfig->zName);. 
3fd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
3fe0: 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  onfig->nCol; i++
3ff0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4000: 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 61  _free(pConfig->a
4010: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zCol[i]);.    }.
4020: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4030: 28 70 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c 29  (pConfig->azCol)
4040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4050: 65 65 28 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  ee(pConfig->aPre
4060: 66 69 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  fix);.    sqlite
4070: 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e  3_free(pConfig->
4080: 7a 52 61 6e 6b 29 3b 0a 20 20 20 20 73 71 6c 69  zRank);.    sqli
4090: 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67  te3_free(pConfig
40a0: 2d 3e 7a 52 61 6e 6b 41 72 67 73 29 3b 0a 20 20  ->zRankArgs);.  
40b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
40c0: 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74  Config->zContent
40d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
40e0: 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f  ree(pConfig->zCo
40f0: 6e 74 65 6e 74 52 6f 77 69 64 29 3b 0a 20 20 20  ntentRowid);.   
4100: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
4110: 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 45  onfig->zContentE
4120: 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  xprlist);.    sq
4130: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
4140: 69 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ig);.  }.}../*.*
4150: 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 64  * Call sqlite3_d
4160: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 62 61  eclare_vtab() ba
4170: 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
4180: 6e 74 73 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  nts of the confi
4190: 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6f 62 6a 65  guration.** obje
41a0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
41b0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20   only argument. 
41c0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
41d0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
41e0: 6f 72 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  or.** an SQLite 
41f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
4200: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
4210: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
4220: 35 43 6f 6e 66 69 67 44 65 63 6c 61 72 65 56 74  5ConfigDeclareVt
4230: 61 62 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  ab(Fts5Config *p
4240: 43 6f 6e 66 69 67 29 7b 0a 20 20 69 6e 74 20 69  Config){.  int i
4250: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
4260: 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
4270: 7a 53 71 6c 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  zSql;..  zSql = 
4280: 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e  sqlite3Fts5Mprin
4290: 74 66 28 26 72 63 2c 20 22 43 52 45 41 54 45 20  tf(&rc, "CREATE 
42a0: 54 41 42 4c 45 20 78 28 22 29 3b 0a 20 20 66 6f  TABLE x(");.  fo
42b0: 72 28 69 3d 30 3b 20 7a 53 71 6c 20 26 26 20 69  r(i=0; zSql && i
42c0: 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20  <pConfig->nCol; 
42d0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
42e0: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 28 69 3d  char *zSep = (i=
42f0: 3d 30 3f 22 22 3a 22 2c 20 22 29 3b 0a 20 20 20  =0?"":", ");.   
4300: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 46   zSql = sqlite3F
4310: 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20  ts5Mprintf(&rc, 
4320: 22 25 7a 25 73 25 51 22 2c 20 7a 53 71 6c 2c 20  "%z%s%Q", zSql, 
4330: 7a 53 65 70 2c 20 70 43 6f 6e 66 69 67 2d 3e 61  zSep, pConfig->a
4340: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  zCol[i]);.  }.  
4350: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 46 74  zSql = sqlite3Ft
4360: 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22  s5Mprintf(&rc, "
4370: 25 7a 2c 20 25 51 20 48 49 44 44 45 4e 2c 20 25  %z, %Q HIDDEN, %
4380: 73 20 48 49 44 44 45 4e 29 22 2c 20 0a 20 20 20  s HIDDEN)", .   
4390: 20 20 20 7a 53 71 6c 2c 20 70 43 6f 6e 66 69 67     zSql, pConfig
43a0: 2d 3e 7a 4e 61 6d 65 2c 20 46 54 53 35 5f 52 41  ->zName, FTS5_RA
43b0: 4e 4b 5f 4e 41 4d 45 0a 20 20 29 3b 0a 0a 20 20  NK_NAME.  );..  
43c0: 61 73 73 65 72 74 28 20 7a 53 71 6c 20 7c 7c 20  assert( zSql || 
43d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
43e0: 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 20 29   );.  if( zSql )
43f0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
4400: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
4410: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
4420: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
4430: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
4440: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
4450: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a  }../*.** Tokeniz
4460: 65 20 74 68 65 20 74 65 78 74 20 70 61 73 73 65  e the text passe
4470: 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64  d via the second
4480: 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d   and third argum
4490: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
44a0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
44b0: 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
44c0: 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 69  h token in the i
44d0: 6e 70 75 74 20 74 65 78 74 2e 20 54 68 65 0a 2a  nput text. The.*
44e0: 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  * arguments pass
44f0: 65 64 20 74 6f 20 69 74 20 61 72 65 2c 20 69 6e  ed to it are, in
4500: 20 6f 72 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20   order:.**.**   
4510: 20 20 76 6f 69 64 20 2a 70 43 74 78 20 20 20 20    void *pCtx    
4520: 20 20 20 20 20 20 2f 2f 20 43 6f 70 79 20 6f 66        // Copy of
4530: 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f   4th argument to
4540: 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65   sqlite3Fts5Toke
4550: 6e 69 7a 65 28 29 0a 2a 2a 20 20 20 20 20 63 6f  nize().**     co
4560: 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
4570: 20 20 2f 2f 20 50 6f 69 6e 74 65 72 20 74 6f 20    // Pointer to 
4580: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
4590: 67 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 69  g token.**     i
45a0: 6e 74 20 6e 54 6f 6b 65 6e 20 20 20 20 20 20 20  nt nToken       
45b0: 20 20 20 2f 2f 20 53 69 7a 65 20 6f 66 20 74 6f     // Size of to
45c0: 6b 65 6e 20 69 6e 20 62 79 74 65 73 0a 2a 2a 20  ken in bytes.** 
45d0: 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 20      int iStart  
45e0: 20 20 20 20 20 20 20 20 2f 2f 20 42 79 74 65 20          // Byte 
45f0: 6f 66 66 73 65 74 20 6f 66 20 73 74 61 72 74 20  offset of start 
4600: 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
4610: 69 6e 70 75 74 20 74 65 78 74 0a 2a 2a 20 20 20  input text.**   
4620: 20 20 69 6e 74 20 69 45 6e 64 20 20 20 20 20 20    int iEnd      
4630: 20 20 20 20 20 20 2f 2f 20 42 79 74 65 20 6f 66        // Byte of
4640: 66 73 65 74 20 6f 66 20 65 6e 64 20 6f 66 20 74  fset of end of t
4650: 6f 6b 65 6e 20 77 69 74 68 69 6e 20 69 6e 70 75  oken within inpu
4660: 74 20 74 65 78 74 0a 2a 2a 20 20 20 20 20 69 6e  t text.**     in
4670: 74 20 69 50 6f 73 20 20 20 20 20 20 20 20 20 20  t iPos          
4680: 20 20 2f 2f 20 50 6f 73 69 74 69 6f 6e 20 6f 66    // Position of
4690: 20 74 6f 6b 65 6e 20 69 6e 20 69 6e 70 75 74 20   token in input 
46a0: 28 66 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  (first token is 
46b0: 30 29 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0).**.** If the 
46c0: 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
46d0: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
46e0: 65 20 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69  e the tokenizati
46f0: 6f 6e 20 69 73 20 61 62 61 6e 64 6f 6e 65 64 0a  on is abandoned.
4700: 2a 2a 20 61 6e 64 20 6e 6f 20 66 75 72 74 68 65  ** and no furthe
4710: 72 20 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20  r callbacks are 
4720: 69 73 73 75 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  issued. .**.** T
4730: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
4740: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
4750: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
4760: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
4770: 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72  code.** if an er
4780: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ror occurs. If t
4790: 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20  he tokenization 
47a0: 77 61 73 20 61 62 61 6e 64 6f 6e 65 64 20 65 61  was abandoned ea
47b0: 72 6c 79 20 62 65 63 61 75 73 65 0a 2a 2a 20 74  rly because.** t
47c0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  he callback retu
47d0: 72 6e 65 64 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rned SQLITE_DONE
47e0: 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e  , this is not an
47f0: 20 65 72 72 6f 72 20 61 6e 64 20 74 68 69 73 20   error and this 
4800: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 74 69 6c  function.** stil
4810: 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
4820: 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  _OK. Or, if the 
4830: 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20 77 61 73  tokenization was
4840: 20 61 62 61 6e 64 6f 6e 65 64 20 65 61 72 6c 79   abandoned early
4850: 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20  .** because the 
4860: 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 65  callback returne
4870: 64 20 61 6e 6f 74 68 65 72 20 6e 6f 6e 2d 7a 65  d another non-ze
4880: 72 6f 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20  ro value, it is 
4890: 61 73 73 75 6d 65 64 0a 2a 2a 20 74 6f 20 62 65  assumed.** to be
48a0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
48b0: 20 63 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   code and return
48c0: 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
48d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
48e0: 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 0a 20 20  Fts5Tokenize(.  
48f0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
4900: 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  fig,            
4910: 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69 67 75 72  /* FTS5 Configur
4920: 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ation object */.
4930: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 20 2f 2a 20 46 54 53 35 5f 54 4f 4b 45 4e 49    /* FTS5_TOKENI
4960: 5a 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  ZE_* flags */.  
4970: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 78  const char *pTex
4980: 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20 20 20  t, int nText,   
4990: 2f 2a 20 54 65 78 74 20 74 6f 20 74 6f 6b 65 6e  /* Text to token
49a0: 69 7a 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ize */.  void *p
49b0: 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
49c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
49d0: 65 78 74 20 70 61 73 73 65 64 20 74 6f 20 78 54  ext passed to xT
49e0: 6f 6b 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  oken() */.  int 
49f0: 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c  (*xToken)(void*,
4a00: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72   int, const char
4a10: 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74  *, int, int, int
4a20: 29 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  )    /* Callback
4a30: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 65   */.){.  if( pTe
4a40: 78 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  xt==0 ) return S
4a50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
4a60: 72 6e 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b  rn pConfig->pTok
4a70: 41 70 69 2d 3e 78 54 6f 6b 65 6e 69 7a 65 28 0a  Api->xTokenize(.
4a80: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70        pConfig->p
4a90: 54 6f 6b 2c 20 70 43 74 78 2c 20 66 6c 61 67 73  Tok, pCtx, flags
4aa0: 2c 20 70 54 65 78 74 2c 20 6e 54 65 78 74 2c 20  , pText, nText, 
4ab0: 78 54 6f 6b 65 6e 0a 20 20 29 3b 0a 7d 0a 0a 2f  xToken.  );.}../
4ac0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49  *.** Argument pI
4ad0: 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  n points to the 
4ae0: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
4af0: 69 6e 20 77 68 61 74 20 69 73 20 65 78 70 65 63  in what is expec
4b00: 74 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 63  ted to be.** a c
4b10: 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 6c  omma-separated l
4b20: 69 73 74 20 6f 66 20 53 51 4c 20 6c 69 74 65 72  ist of SQL liter
4b30: 61 6c 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  als followed by 
4b40: 61 20 27 29 27 20 63 68 61 72 61 63 74 65 72 2e  a ')' character.
4b50: 0a 2a 2a 20 49 66 20 69 74 20 61 63 74 75 61 6c  .** If it actual
4b60: 6c 79 20 69 73 20 74 68 69 73 2c 20 72 65 74 75  ly is this, retu
4b70: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
4b80: 74 68 65 20 27 29 27 2e 20 4f 74 68 65 72 77 69  the ')'. Otherwi
4b90: 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55  se, return.** NU
4ba0: 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 61  LL to indicate a
4bb0: 20 70 61 72 73 65 20 65 72 72 6f 72 2e 0a 2a 2f   parse error..*/
4bc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
4bd0: 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b  ar *fts5ConfigSk
4be0: 69 70 41 72 67 73 28 63 6f 6e 73 74 20 63 68 61  ipArgs(const cha
4bf0: 72 20 2a 70 49 6e 29 7b 0a 20 20 63 6f 6e 73 74  r *pIn){.  const
4c00: 20 63 68 61 72 20 2a 70 20 3d 20 70 49 6e 3b 0a   char *p = pIn;.
4c10: 20 20 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b    .  while( 1 ){
4c20: 0a 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e  .    p = fts5Con
4c30: 66 69 67 53 6b 69 70 57 68 69 74 65 73 70 61 63  figSkipWhitespac
4c40: 65 28 70 29 3b 0a 20 20 20 20 70 20 3d 20 66 74  e(p);.    p = ft
4c50: 73 35 43 6f 6e 66 69 67 53 6b 69 70 4c 69 74 65  s5ConfigSkipLite
4c60: 72 61 6c 28 70 29 3b 0a 20 20 20 20 70 20 3d 20  ral(p);.    p = 
4c70: 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68  fts5ConfigSkipWh
4c80: 69 74 65 73 70 61 63 65 28 70 29 3b 0a 20 20 20  itespace(p);.   
4c90: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 2a 70 3d   if( p==0 || *p=
4ca0: 3d 27 29 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  =')' ) break;.  
4cb0: 20 20 69 66 28 20 2a 70 21 3d 27 2c 27 20 29 7b    if( *p!=',' ){
4cc0: 0a 20 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20  .      p = 0;.  
4cd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ce0: 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    p++;.  }.. 
4cf0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
4d00: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 49  .** Parameter zI
4d10: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 61 6e  n contains a ran
4d20: 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 73 70 65  k() function spe
4d30: 63 69 66 69 63 61 74 69 6f 6e 2e 20 54 68 65 20  cification. The 
4d40: 66 6f 72 6d 61 74 20 6f 66 20 0a 2a 2a 20 74 68  format of .** th
4d50: 69 73 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b  is is:.**.**   +
4d60: 20 42 61 72 65 77 6f 72 64 20 28 66 75 6e 63 74   Bareword (funct
4d70: 69 6f 6e 20 6e 61 6d 65 29 0a 2a 2a 20 20 20 2b  ion name).**   +
4d80: 20 4f 70 65 6e 20 70 61 72 65 6e 74 68 65 73 69   Open parenthesi
4d90: 73 20 2d 20 22 28 22 0a 2a 2a 20 20 20 2b 20 5a  s - "(".**   + Z
4da0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20  ero or more SQL 
4db0: 6c 69 74 65 72 61 6c 73 20 69 6e 20 61 20 63 6f  literals in a co
4dc0: 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c 69  mma separated li
4dd0: 73 74 0a 2a 2a 20 20 20 2b 20 43 6c 6f 73 65 20  st.**   + Close 
4de0: 70 61 72 65 6e 74 68 65 73 69 73 20 2d 20 22 29  parenthesis - ")
4df0: 22 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ".*/.int sqlite3
4e00: 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 52  Fts5ConfigParseR
4e10: 61 6e 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ank(.  const cha
4e20: 72 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20 20 20  r *zIn,         
4e30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
4e40: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
4e50: 20 2a 2a 70 7a 52 61 6e 6b 2c 20 20 20 20 20 20   **pzRank,      
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4e70: 55 54 3a 20 52 61 6e 6b 20 66 75 6e 63 74 69 6f  UT: Rank functio
4e80: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72  n name */.  char
4e90: 20 2a 2a 70 7a 52 61 6e 6b 41 72 67 73 20 20 20   **pzRankArgs   
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4eb0: 55 54 3a 20 52 61 6e 6b 20 66 75 6e 63 74 69 6f  UT: Rank functio
4ec0: 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
4ed0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
4ee0: 70 20 3d 20 7a 49 6e 3b 0a 20 20 63 6f 6e 73 74  p = zIn;.  const
4ef0: 20 63 68 61 72 20 2a 70 52 61 6e 6b 3b 0a 20 20   char *pRank;.  
4f00: 63 68 61 72 20 2a 7a 52 61 6e 6b 20 3d 20 30 3b  char *zRank = 0;
4f10: 0a 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72  .  char *zRankAr
4f20: 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  gs = 0;.  int rc
4f30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
4f40: 20 2a 70 7a 52 61 6e 6b 20 3d 20 30 3b 0a 20 20   *pzRank = 0;.  
4f50: 2a 70 7a 52 61 6e 6b 41 72 67 73 20 3d 20 30 3b  *pzRankArgs = 0;
4f60: 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ..  if( p==0 ){.
4f70: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4f80: 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
4f90: 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66      p = fts5Conf
4fa0: 69 67 53 6b 69 70 57 68 69 74 65 73 70 61 63 65  igSkipWhitespace
4fb0: 28 70 29 3b 0a 20 20 20 20 70 52 61 6e 6b 20 3d  (p);.    pRank =
4fc0: 20 70 3b 0a 20 20 20 20 70 20 3d 20 66 74 73 35   p;.    p = fts5
4fd0: 43 6f 6e 66 69 67 53 6b 69 70 42 61 72 65 77 6f  ConfigSkipBarewo
4fe0: 72 64 28 70 29 3b 0a 0a 20 20 20 20 69 66 28 20  rd(p);..    if( 
4ff0: 70 20 29 7b 0a 20 20 20 20 20 20 7a 52 61 6e 6b  p ){.      zRank
5000: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61   = sqlite3Fts5Ma
5010: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 31 20  llocZero(&rc, 1 
5020: 2b 20 70 20 2d 20 70 52 61 6e 6b 29 3b 0a 20 20  + p - pRank);.  
5030: 20 20 20 20 69 66 28 20 7a 52 61 6e 6b 20 29 20      if( zRank ) 
5040: 6d 65 6d 63 70 79 28 7a 52 61 6e 6b 2c 20 70 52  memcpy(zRank, pR
5050: 61 6e 6b 2c 20 70 2d 70 52 61 6e 6b 29 3b 0a 20  ank, p-pRank);. 
5060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5070: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5080: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
5090: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
50a0: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 66 74 73  ){.      p = fts
50b0: 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65  5ConfigSkipWhite
50c0: 73 70 61 63 65 28 70 29 3b 0a 20 20 20 20 20 20  space(p);.      
50d0: 69 66 28 20 2a 70 21 3d 27 28 27 20 29 20 72 63  if( *p!='(' ) rc
50e0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
50f0: 0a 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20  .      p++;.    
5100: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
5110: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5120: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 41 72   const char *pAr
5130: 67 73 3b 20 0a 20 20 20 20 20 20 70 20 3d 20 66  gs; .      p = f
5140: 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69  ts5ConfigSkipWhi
5150: 74 65 73 70 61 63 65 28 70 29 3b 0a 20 20 20 20  tespace(p);.    
5160: 20 20 70 41 72 67 73 20 3d 20 70 3b 0a 20 20 20    pArgs = p;.   
5170: 20 20 20 69 66 28 20 2a 70 21 3d 27 29 27 20 29     if( *p!=')' )
5180: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66 74  {.        p = ft
5190: 73 35 43 6f 6e 66 69 67 53 6b 69 70 41 72 67 73  s5ConfigSkipArgs
51a0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
51b0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   p==0 ){.       
51c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
51d0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65  RROR;.        }e
51e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
51f0: 52 61 6e 6b 41 72 67 73 20 3d 20 73 71 6c 69 74  RankArgs = sqlit
5200: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
5210: 28 26 72 63 2c 20 31 20 2b 20 70 20 2d 20 70 41  (&rc, 1 + p - pA
5220: 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rgs);.          
5230: 69 66 28 20 7a 52 61 6e 6b 41 72 67 73 20 29 20  if( zRankArgs ) 
5240: 6d 65 6d 63 70 79 28 7a 52 61 6e 6b 41 72 67 73  memcpy(zRankArgs
5250: 2c 20 70 41 72 67 73 2c 20 70 2d 70 41 72 67 73  , pArgs, p-pArgs
5260: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
5280: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5290: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
52a0: 65 33 5f 66 72 65 65 28 7a 52 61 6e 6b 29 3b 0a  e3_free(zRank);.
52b0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 52 61 6e      assert( zRan
52c0: 6b 41 72 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  kArgs==0 );.  }e
52d0: 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 52 61 6e 6b  lse{.    *pzRank
52e0: 20 3d 20 7a 52 61 6e 6b 3b 0a 20 20 20 20 2a 70   = zRank;.    *p
52f0: 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a 52 61 6e  zRankArgs = zRan
5300: 6b 41 72 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74  kArgs;.  }.  ret
5310: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73  urn rc;.}..int s
5320: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
5330: 53 65 74 56 61 6c 75 65 28 0a 20 20 46 74 73 35  SetValue(.  Fts5
5340: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
5350: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
5360: 7a 4b 65 79 2c 20 0a 20 20 73 71 6c 69 74 65 33  zKey, .  sqlite3
5370: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 0a 20 20  _value *pVal,.  
5380: 69 6e 74 20 2a 70 62 42 61 64 6b 65 79 0a 29 7b  int *pbBadkey.){
5390: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
53a0: 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 30 3d  TE_OK;..  if( 0=
53b0: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
53c0: 28 7a 4b 65 79 2c 20 22 70 67 73 7a 22 29 20 29  (zKey, "pgsz") )
53d0: 7b 0a 20 20 20 20 69 6e 74 20 70 67 73 7a 20 3d  {.    int pgsz =
53e0: 20 30 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   0;.    if( SQLI
53f0: 54 45 5f 49 4e 54 45 47 45 52 3d 3d 73 71 6c 69  TE_INTEGER==sqli
5400: 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69  te3_value_numeri
5410: 63 5f 74 79 70 65 28 70 56 61 6c 29 20 29 7b 0a  c_type(pVal) ){.
5420: 20 20 20 20 20 20 70 67 73 7a 20 3d 20 73 71 6c        pgsz = sql
5430: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
5440: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
5450: 69 66 28 20 70 67 73 7a 3c 3d 30 20 7c 7c 20 70  if( pgsz<=0 || p
5460: 67 73 7a 3e 46 54 53 35 5f 4d 41 58 5f 50 41 47  gsz>FTS5_MAX_PAG
5470: 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
5480: 2a 70 62 42 61 64 6b 65 79 20 3d 20 31 3b 0a 20  *pbBadkey = 1;. 
5490: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
54a0: 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 3d 20  pConfig->pgsz = 
54b0: 70 67 73 7a 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pgsz;.    }.  }.
54c0: 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
54d0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
54e0: 4b 65 79 2c 20 22 68 61 73 68 73 69 7a 65 22 29  Key, "hashsize")
54f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 48 61 73   ){.    int nHas
5500: 68 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  hSize = -1;.    
5510: 69 66 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  if( SQLITE_INTEG
5520: 45 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ER==sqlite3_valu
5530: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70  e_numeric_type(p
5540: 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 6e 48  Val) ){.      nH
5550: 61 73 68 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ashSize = sqlite
5560: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
5570: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5580: 20 6e 48 61 73 68 53 69 7a 65 3c 3d 30 20 29 7b   nHashSize<=0 ){
5590: 0a 20 20 20 20 20 20 2a 70 62 42 61 64 6b 65 79  .      *pbBadkey
55a0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
55b0: 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e  .      pConfig->
55c0: 6e 48 61 73 68 53 69 7a 65 20 3d 20 6e 48 61 73  nHashSize = nHas
55d0: 68 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  hSize;.    }.  }
55e0: 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d  ..  else if( 0==
55f0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5600: 7a 4b 65 79 2c 20 22 61 75 74 6f 6d 65 72 67 65  zKey, "automerge
5610: 22 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  ") ){.    int nA
5620: 75 74 6f 6d 65 72 67 65 20 3d 20 2d 31 3b 0a 20  utomerge = -1;. 
5630: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 49 4e     if( SQLITE_IN
5640: 54 45 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f 76  TEGER==sqlite3_v
5650: 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70  alue_numeric_typ
5660: 65 28 70 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  e(pVal) ){.     
5670: 20 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 73 71   nAutomerge = sq
5680: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
5690: 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pVal);.    }.   
56a0: 20 69 66 28 20 6e 41 75 74 6f 6d 65 72 67 65 3c   if( nAutomerge<
56b0: 30 20 7c 7c 20 6e 41 75 74 6f 6d 65 72 67 65 3e  0 || nAutomerge>
56c0: 36 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 42  64 ){.      *pbB
56d0: 61 64 6b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  adkey = 1;.    }
56e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
56f0: 6e 41 75 74 6f 6d 65 72 67 65 3d 3d 31 20 29 20  nAutomerge==1 ) 
5700: 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 46 54 53  nAutomerge = FTS
5710: 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 45  5_DEFAULT_AUTOME
5720: 52 47 45 3b 0a 20 20 20 20 20 20 70 43 6f 6e 66  RGE;.      pConf
5730: 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 3d  ig->nAutomerge =
5740: 20 6e 41 75 74 6f 6d 65 72 67 65 3b 0a 20 20 20   nAutomerge;.   
5750: 20 7d 0a 20 20 7d 0a 0a 20 20 65 6c 73 65 20 69   }.  }..  else i
5760: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
5770: 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22 63 72 69  ricmp(zKey, "cri
5780: 73 69 73 6d 65 72 67 65 22 29 20 29 7b 0a 20 20  sismerge") ){.  
5790: 20 20 69 6e 74 20 6e 43 72 69 73 69 73 4d 65 72    int nCrisisMer
57a0: 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  ge = -1;.    if(
57b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3d   SQLITE_INTEGER=
57c0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e  =sqlite3_value_n
57d0: 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56 61 6c  umeric_type(pVal
57e0: 29 20 29 7b 0a 20 20 20 20 20 20 6e 43 72 69 73  ) ){.      nCris
57f0: 69 73 4d 65 72 67 65 20 3d 20 73 71 6c 69 74 65  isMerge = sqlite
5800: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
5810: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5820: 20 6e 43 72 69 73 69 73 4d 65 72 67 65 3c 30 20   nCrisisMerge<0 
5830: 29 7b 0a 20 20 20 20 20 20 2a 70 62 42 61 64 6b  ){.      *pbBadk
5840: 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ey = 1;.    }els
5850: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 72  e{.      if( nCr
5860: 69 73 69 73 4d 65 72 67 65 3c 3d 31 20 29 20 6e  isisMerge<=1 ) n
5870: 43 72 69 73 69 73 4d 65 72 67 65 20 3d 20 46 54  CrisisMerge = FT
5880: 53 35 5f 44 45 46 41 55 4c 54 5f 43 52 49 53 49  S5_DEFAULT_CRISI
5890: 53 4d 45 52 47 45 3b 0a 20 20 20 20 20 20 70 43  SMERGE;.      pC
58a0: 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65  onfig->nCrisisMe
58b0: 72 67 65 20 3d 20 6e 43 72 69 73 69 73 4d 65 72  rge = nCrisisMer
58c0: 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ge;.    }.  }.. 
58d0: 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c   else if( 0==sql
58e0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65  ite3_stricmp(zKe
58f0: 79 2c 20 22 72 61 6e 6b 22 29 20 29 7b 0a 20 20  y, "rank") ){.  
5900: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5910: 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
5920: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5930: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 63  ext(pVal);.    c
5940: 68 61 72 20 2a 7a 52 61 6e 6b 3b 0a 20 20 20 20  har *zRank;.    
5950: 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73 3b  char *zRankArgs;
5960: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
5970: 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65  3Fts5ConfigParse
5980: 52 61 6e 6b 28 7a 49 6e 2c 20 26 7a 52 61 6e 6b  Rank(zIn, &zRank
5990: 2c 20 26 7a 52 61 6e 6b 41 72 67 73 29 3b 0a 20  , &zRankArgs);. 
59a0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
59b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
59c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
59d0: 69 67 2d 3e 7a 52 61 6e 6b 29 3b 0a 20 20 20 20  ig->zRank);.    
59e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
59f0: 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41 72 67  Config->zRankArg
5a00: 73 29 3b 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  s);.      pConfi
5a10: 67 2d 3e 7a 52 61 6e 6b 20 3d 20 7a 52 61 6e 6b  g->zRank = zRank
5a20: 3b 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ;.      pConfig-
5a30: 3e 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a 52 61  >zRankArgs = zRa
5a40: 6e 6b 41 72 67 73 3b 0a 20 20 20 20 7d 65 6c 73  nkArgs;.    }els
5a50: 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
5a60: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
5a70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5a80: 20 20 20 20 20 20 2a 70 62 42 61 64 6b 65 79 20        *pbBadkey 
5a90: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
5aa0: 73 65 7b 0a 20 20 20 20 2a 70 62 42 61 64 6b 65  se{.    *pbBadke
5ab0: 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 1;.  }.  ret
5ac0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5ad0: 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Load the conten
5ae0: 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 66  ts of the %_conf
5af0: 69 67 20 74 61 62 6c 65 20 69 6e 74 6f 20 6d 65  ig table into me
5b00: 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mory..*/.int sql
5b10: 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f  ite3Fts5ConfigLo
5b20: 61 64 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  ad(Fts5Config *p
5b30: 43 6f 6e 66 69 67 2c 20 69 6e 74 20 69 43 6f 6f  Config, int iCoo
5b40: 6b 69 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  kie){.  const ch
5b50: 61 72 20 2a 7a 53 65 6c 65 63 74 20 3d 20 22 53  ar *zSelect = "S
5b60: 45 4c 45 43 54 20 6b 2c 20 76 20 46 52 4f 4d 20  ELECT k, v FROM 
5b70: 25 51 2e 27 25 71 5f 63 6f 6e 66 69 67 27 22 3b  %Q.'%q_config'";
5b80: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
5b90: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
5ba0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
5bb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
5bc0: 74 20 69 56 65 72 73 69 6f 6e 20 3d 20 30 3b 0a  t iVersion = 0;.
5bd0: 0a 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c  .  /* Set defaul
5be0: 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 70 43  t values */.  pC
5bf0: 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 3d 20 46 54  onfig->pgsz = FT
5c00: 53 35 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  S5_DEFAULT_PAGE_
5c10: 53 49 5a 45 3b 0a 20 20 70 43 6f 6e 66 69 67 2d  SIZE;.  pConfig-
5c20: 3e 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 46 54  >nAutomerge = FT
5c30: 53 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  S5_DEFAULT_AUTOM
5c40: 45 52 47 45 3b 0a 20 20 70 43 6f 6e 66 69 67 2d  ERGE;.  pConfig-
5c50: 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 20 3d 20  >nCrisisMerge = 
5c60: 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 43 52 49  FTS5_DEFAULT_CRI
5c70: 53 49 53 4d 45 52 47 45 3b 0a 20 20 70 43 6f 6e  SISMERGE;.  pCon
5c80: 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 20 3d  fig->nHashSize =
5c90: 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 48 41   FTS5_DEFAULT_HA
5ca0: 53 48 53 49 5a 45 3b 0a 0a 20 20 7a 53 71 6c 20  SHSIZE;..  zSql 
5cb0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72  = sqlite3Fts5Mpr
5cc0: 69 6e 74 66 28 26 72 63 2c 20 7a 53 65 6c 65 63  intf(&rc, zSelec
5cd0: 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c  t, pConfig->zDb,
5ce0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29   pConfig->zName)
5cf0: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a  ;.  if( zSql ){.
5d00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5d10: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e  _prepare_v2(pCon
5d20: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
5d30: 31 2c 20 26 70 2c 20 30 29 3b 0a 20 20 20 20 73  1, &p, 0);.    s
5d40: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
5d50: 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
5d60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5d70: 7c 7c 20 70 3d 3d 30 20 29 3b 0a 20 20 69 66 28  || p==0 );.  if(
5d80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5d90: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c  {.    while( SQL
5da0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
5db0: 5f 73 74 65 70 28 70 29 20 29 7b 0a 20 20 20 20  _step(p) ){.    
5dc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
5dd0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
5de0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5df0: 65 78 74 28 70 2c 20 30 29 3b 0a 20 20 20 20 20  ext(p, 0);.     
5e00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5e10: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pVal = sqlite3_c
5e20: 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 2c 20 31  olumn_value(p, 1
5e30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
5e40: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5e50: 7a 4b 2c 20 22 76 65 72 73 69 6f 6e 22 29 20 29  zK, "version") )
5e60: 7b 0a 20 20 20 20 20 20 20 20 69 56 65 72 73 69  {.        iVersi
5e70: 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  on = sqlite3_val
5e80: 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0a 20 20  ue_int(pVal);.  
5e90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5ea0: 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 20 3d 20     int bDummy = 
5eb0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
5ec0: 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74 56  e3Fts5ConfigSetV
5ed0: 61 6c 75 65 28 70 43 6f 6e 66 69 67 2c 20 7a 4b  alue(pConfig, zK
5ee0: 2c 20 70 56 61 6c 2c 20 26 62 44 75 6d 6d 79 29  , pVal, &bDummy)
5ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5f00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5f10: 5f 66 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20  _finalize(p);.  
5f20: 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
5f30: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 56 65 72  QLITE_OK && iVer
5f40: 73 69 6f 6e 21 3d 46 54 53 35 5f 43 55 52 52 45  sion!=FTS5_CURRE
5f50: 4e 54 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20  NT_VERSION ){.  
5f60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
5f70: 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  ROR;.    if( pCo
5f80: 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20 29  nfig->pzErrmsg )
5f90: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5fa0: 30 3d 3d 2a 70 43 6f 6e 66 69 67 2d 3e 70 7a 45  0==*pConfig->pzE
5fb0: 72 72 6d 73 67 20 29 3b 0a 20 20 20 20 20 20 2a  rrmsg );.      *
5fc0: 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73  pConfig->pzErrms
5fd0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
5fe0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
5ff0: 69 6e 76 61 6c 69 64 20 66 74 73 35 20 66 69 6c  invalid fts5 fil
6000: 65 20 66 6f 72 6d 61 74 20 28 66 6f 75 6e 64 20  e format (found 
6010: 25 64 2c 20 65 78 70 65 63 74 65 64 20 25 64 29  %d, expected %d)
6020: 20 2d 20 72 75 6e 20 27 72 65 62 75 69 6c 64 27   - run 'rebuild'
6030: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 56 65  ",.          iVe
6040: 72 73 69 6f 6e 2c 20 46 54 53 35 5f 43 55 52 52  rsion, FTS5_CURR
6050: 45 4e 54 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20  ENT_VERSION.    
6060: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
6070: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6080: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 6f 6e 66  _OK ){.    pConf
6090: 69 67 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 69 43  ig->iCookie = iC
60a0: 6f 6f 6b 69 65 3b 0a 20 20 7d 0a 20 20 72 65 74  ookie;.  }.  ret
60b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a                 urn rc;.}..