/ Hex Artifact Content
Login

Artifact eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882:


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 23 69 6e 63 6c 75 64  ch..*/...#includ
01c0: 65 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a 23  e "fts5Int.h"..#
01d0: 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41  define FTS5_DEFA
01e0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 20 20  ULT_PAGE_SIZE   
01f0: 34 30 35 30 0a 23 64 65 66 69 6e 65 20 46 54 53  4050.#define FTS
0200: 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 45  5_DEFAULT_AUTOME
0210: 52 47 45 20 20 20 20 20 20 34 0a 23 64 65 66 69  RGE      4.#defi
0220: 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f  ne FTS5_DEFAULT_
0230: 55 53 45 52 4d 45 52 47 45 20 20 20 20 20 20 34  USERMERGE      4
0240: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45  .#define FTS5_DE
0250: 46 41 55 4c 54 5f 43 52 49 53 49 53 4d 45 52 47  FAULT_CRISISMERG
0260: 45 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20 46  E   16.#define F
0270: 54 53 35 5f 44 45 46 41 55 4c 54 5f 48 41 53 48  TS5_DEFAULT_HASH
0280: 53 49 5a 45 20 20 20 20 28 31 30 32 34 2a 31 30  SIZE    (1024*10
0290: 32 34 29 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  24)../* Maximum 
02a0: 61 6c 6c 6f 77 65 64 20 70 61 67 65 20 73 69 7a  allowed page siz
02b0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  e */.#define FTS
02c0: 35 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  5_MAX_PAGE_SIZE 
02d0: 28 31 32 38 2a 31 30 32 34 29 0a 0a 73 74 61 74  (128*1024)..stat
02e0: 69 63 20 69 6e 74 20 66 74 73 35 5f 69 73 77 68  ic int fts5_iswh
02f0: 69 74 65 73 70 61 63 65 28 63 68 61 72 20 78 29  itespace(char x)
0300: 7b 0a 20 20 72 65 74 75 72 6e 20 28 78 3d 3d 27  {.  return (x=='
0310: 20 27 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   ');.}..static i
0320: 6e 74 20 66 74 73 35 5f 69 73 6f 70 65 6e 71 75  nt fts5_isopenqu
0330: 6f 74 65 28 63 68 61 72 20 78 29 7b 0a 20 20 72  ote(char x){.  r
0340: 65 74 75 72 6e 20 28 78 3d 3d 27 22 27 20 7c 7c  eturn (x=='"' ||
0350: 20 78 3d 3d 27 5c 27 27 20 7c 7c 20 78 3d 3d 27   x=='\'' || x=='
0360: 5b 27 20 7c 7c 20 78 3d 3d 27 60 27 29 3b 0a 7d  [' || x=='`');.}
0370: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
0380: 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61   pIn points to a
0390: 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20   character that 
03a0: 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e 75 6c  is part of a nul
03b0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 0a 2a 2a 20  -terminated .** 
03c0: 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 61  string. Return a
03d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
03e0: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
03f0: 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 49 6e 20 69  following *pIn i
0400: 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  n .** the string
0410: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 77   that is not a w
0420: 68 69 74 65 2d 73 70 61 63 65 20 63 68 61 72 61  hite-space chara
0430: 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
0440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 74 73 35  const char *fts5
0450: 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73  ConfigSkipWhites
0460: 70 61 63 65 28 63 6f 6e 73 74 20 63 68 61 72 20  pace(const char 
0470: 2a 70 49 6e 29 7b 0a 20 20 63 6f 6e 73 74 20 63  *pIn){.  const c
0480: 68 61 72 20 2a 70 20 3d 20 70 49 6e 3b 0a 20 20  har *p = pIn;.  
0490: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77 68 69  if( p ){.    whi
04a0: 6c 65 28 20 66 74 73 35 5f 69 73 77 68 69 74 65  le( fts5_iswhite
04b0: 73 70 61 63 65 28 2a 70 29 20 29 7b 20 70 2b 2b  space(*p) ){ p++
04c0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
04d0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67   p;.}../*.** Arg
04e0: 75 6d 65 6e 74 20 70 49 6e 20 70 6f 69 6e 74 73  ument pIn points
04f0: 20 74 6f 20 61 20 63 68 61 72 61 63 74 65 72 20   to a character 
0500: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
0510: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
0520: 20 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 52 65 74   .** string. Ret
0530: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0540: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
0550: 63 74 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a  cter following *
0560: 70 49 6e 20 69 6e 20 0a 2a 2a 20 74 68 65 20 73  pIn in .** the s
0570: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
0580: 74 20 61 20 22 62 61 72 65 77 6f 72 64 22 20 63  t a "bareword" c
0590: 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
05a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
05b0: 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 42 61  fts5ConfigSkipBa
05c0: 72 65 77 6f 72 64 28 63 6f 6e 73 74 20 63 68 61  reword(const cha
05d0: 72 20 2a 70 49 6e 29 7b 0a 20 20 63 6f 6e 73 74  r *pIn){.  const
05e0: 20 63 68 61 72 20 2a 70 20 3d 20 70 49 6e 3b 0a   char *p = pIn;.
05f0: 20 20 77 68 69 6c 65 20 28 20 73 71 6c 69 74 65    while ( sqlite
0600: 33 46 74 73 35 49 73 42 61 72 65 77 6f 72 64 28  3Fts5IsBareword(
0610: 2a 70 29 20 29 20 70 2b 2b 3b 0a 20 20 69 66 28  *p) ) p++;.  if(
0620: 20 70 3d 3d 70 49 6e 20 29 20 70 20 3d 20 30 3b   p==pIn ) p = 0;
0630: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0640: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 5f  static int fts5_
0650: 69 73 64 69 67 69 74 28 63 68 61 72 20 61 29 7b  isdigit(char a){
0660: 0a 20 20 72 65 74 75 72 6e 20 28 61 3e 3d 27 30  .  return (a>='0
0670: 27 20 26 26 20 61 3c 3d 27 39 27 29 3b 0a 7d 0a  ' && a<='9');.}.
0680: 0a 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ...static const 
0690: 63 68 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67  char *fts5Config
06a0: 53 6b 69 70 4c 69 74 65 72 61 6c 28 63 6f 6e 73  SkipLiteral(cons
06b0: 74 20 63 68 61 72 20 2a 70 49 6e 29 7b 0a 20 20  t char *pIn){.  
06c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
06d0: 70 49 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 2a  pIn;.  switch( *
06e0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 27 6e  p ){.    case 'n
06f0: 27 3a 20 63 61 73 65 20 27 4e 27 3a 0a 20 20 20  ': case 'N':.   
0700: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
0710: 74 72 6e 69 63 6d 70 28 22 6e 75 6c 6c 22 2c 20  trnicmp("null", 
0720: 70 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p, 4)==0 ){.    
0730: 20 20 20 20 70 20 3d 20 26 70 5b 34 5d 3b 0a 20      p = &p[4];. 
0740: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0750: 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20      p = 0;.     
0760: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
0770: 0a 20 20 20 20 63 61 73 65 20 27 78 27 3a 20 63  .    case 'x': c
0780: 61 73 65 20 27 58 27 3a 0a 20 20 20 20 20 20 70  ase 'X':.      p
0790: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  ++;.      if( *p
07a0: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
07b0: 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77    p++;.        w
07c0: 68 69 6c 65 28 20 28 2a 70 3e 3d 27 61 27 20 26  hile( (*p>='a' &
07d0: 26 20 2a 70 3c 3d 27 66 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 41 27 20 26 26 20 2a 70 3c 3d 27 46 27 29 20  'A' && *p<='F') 
0800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
0810: 28 2a 70 3e 3d 27 30 27 20 26 26 20 2a 70 3c 3d  (*p>='0' && *p<=
0820: 27 39 27 29 20 0a 20 20 20 20 20 20 20 20 20 20  '9') .          
0830: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
0840: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
0850: 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27 5c        if( *p=='\
0860: 27 27 20 26 26 20 30 3d 3d 28 28 70 2d 70 49 6e  '' && 0==((p-pIn
0870: 29 25 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  )%2) ){.        
0880: 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    p++;.        }
0890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
08a0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
08b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
08c0: 20 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20        p = 0;.   
08d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
08e0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 27 5c 27 27  ;..    case '\''
08f0: 3a 0a 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20  :.      p++;.   
0900: 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20     while( p ){. 
0910: 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27         if( *p=='
0920: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \'' ){.         
0930: 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   p++;.          
0940: 69 66 28 20 2a 70 21 3d 27 5c 27 27 20 29 20 62  if( *p!='\'' ) b
0950: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
0960: 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20          p++;.   
0970: 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 30 20 29       if( *p==0 )
0980: 20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a   p = 0;.      }.
0990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
09a0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
09b0: 20 2f 2a 20 6d 61 79 62 65 20 61 20 6e 75 6d 62   /* maybe a numb
09c0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  er */.      if( 
09d0: 2a 70 3d 3d 27 2b 27 20 7c 7c 20 2a 70 3d 3d 27  *p=='+' || *p=='
09e0: 2d 27 20 29 20 70 2b 2b 3b 0a 20 20 20 20 20 20  -' ) p++;.      
09f0: 77 68 69 6c 65 28 20 66 74 73 35 5f 69 73 64 69  while( fts5_isdi
0a00: 67 69 74 28 2a 70 29 20 29 20 70 2b 2b 3b 0a 0a  git(*p) ) p++;..
0a10: 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
0a20: 20 70 6f 69 6e 74 2c 20 69 66 20 74 68 65 20 6c   point, if the l
0a30: 69 74 65 72 61 6c 20 77 61 73 20 61 6e 20 69 6e  iteral was an in
0a40: 74 65 67 65 72 2c 20 74 68 65 20 70 61 72 73 65  teger, the parse
0a50: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
0a60: 6e 69 73 68 65 64 2e 20 4f 72 2c 20 69 66 20 69  nished. Or, if i
0a70: 74 20 69 73 20 61 20 66 6c 6f 61 74 69 6e 67 20  t is a floating 
0a80: 70 6f 69 6e 74 20 76 61 6c 75 65 2c 20 69 74 20  point value, it 
0a90: 6d 61 79 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20  may continue.   
0aa0: 20 20 20 2a 2a 20 77 69 74 68 20 65 69 74 68 65     ** with eithe
0ab0: 72 20 61 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e  r a decimal poin
0ac0: 74 20 6f 72 20 61 6e 20 27 45 27 20 63 68 61 72  t or an 'E' char
0ad0: 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  acter. */.      
0ae0: 69 66 28 20 2a 70 3d 3d 27 2e 27 20 26 26 20 66  if( *p=='.' && f
0af0: 74 73 35 5f 69 73 64 69 67 69 74 28 70 5b 31 5d  ts5_isdigit(p[1]
0b00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20 2b  ) ){.        p +
0b10: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = 2;.        whi
0b20: 6c 65 28 20 66 74 73 35 5f 69 73 64 69 67 69 74  le( fts5_isdigit
0b30: 28 2a 70 29 20 29 20 70 2b 2b 3b 0a 20 20 20 20  (*p) ) p++;.    
0b40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 3d    }.      if( p=
0b50: 3d 70 49 6e 20 29 20 70 20 3d 20 30 3b 0a 0a 20  =pIn ) p = 0;.. 
0b60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
0b70: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0b80: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
0b90: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
0ba0: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
0bb0: 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 7a  to by argument z
0bc0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
0bd0: 2a 20 74 6f 20 62 65 20 61 6e 20 6f 70 65 6e 2d  * to be an open-
0be0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
0bf0: 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 66 74  (see function ft
0c00: 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65 28 29  s5_isopenquote()
0c10: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
0c20: 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
0c30: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
0c40: 6e 64 69 6e 67 20 63 6c 6f 73 65 2d 71 75 6f 74  nding close-quot
0c50: 65 20 63 68 61 72 61 63 74 65 72 20 77 69 74 68  e character with
0c60: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  in.** the string
0c70: 20 61 6e 64 2c 20 69 66 20 66 6f 75 6e 64 2c 20   and, if found, 
0c80: 64 65 71 75 6f 74 65 73 20 74 68 65 20 73 74 72  dequotes the str
0c90: 69 6e 67 20 69 6e 20 70 6c 61 63 65 20 61 6e 64  ing in place and
0ca0: 20 61 64 64 73 20 61 20 6e 65 77 0a 2a 2a 20 6e   adds a new.** n
0cb0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
0cc0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
0cd0: 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20 69 73 20   close-quote is 
0ce0: 66 6f 75 6e 64 2c 20 74 68 65 20 76 61 6c 75 65  found, the value
0cf0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
0d00: 20 62 79 74 65 20 6f 66 66 73 65 74 20 6f 66 0a   byte offset of.
0d10: 2a 2a 20 74 68 65 20 63 68 61 72 61 63 74 65 72  ** the character
0d20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
0d30: 6c 6f 77 69 6e 67 20 69 74 2e 20 4f 72 2c 20 69  lowing it. Or, i
0d40: 66 20 74 68 65 20 63 6c 6f 73 65 2d 71 75 6f 74  f the close-quot
0d50: 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 66 6f 75  e is not .** fou
0d60: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
0d70: 65 64 2e 20 49 66 20 2d 31 20 69 73 20 72 65 74  ed. If -1 is ret
0d80: 75 72 6e 65 64 2c 20 74 68 65 20 62 75 66 66 65  urned, the buffe
0d90: 72 20 69 73 20 6c 65 66 74 20 69 6e 20 61 6e 20  r is left in an 
0da0: 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 20 73 74  .** undefined st
0db0: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
0dc0: 6e 74 20 66 74 73 35 44 65 71 75 6f 74 65 28 63  nt fts5Dequote(c
0dd0: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20  har *z){.  char 
0de0: 71 3b 0a 20 20 69 6e 74 20 69 49 6e 20 3d 20 31  q;.  int iIn = 1
0df0: 3b 0a 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30  ;.  int iOut = 0
0e00: 3b 0a 20 20 71 20 3d 20 7a 5b 30 5d 3b 0a 0a 20  ;.  q = z[0];.. 
0e10: 20 2f 2a 20 53 65 74 20 73 74 61 63 6b 20 76 61   /* Set stack va
0e20: 72 69 61 62 6c 65 20 71 20 74 6f 20 74 68 65 20  riable q to the 
0e30: 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63 68 61 72  close-quote char
0e40: 61 63 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  acter */.  asser
0e50: 74 28 20 71 3d 3d 27 5b 27 20 7c 7c 20 71 3d 3d  t( q=='[' || q==
0e60: 27 5c 27 27 20 7c 7c 20 71 3d 3d 27 22 27 20 7c  '\'' || q=='"' |
0e70: 7c 20 71 3d 3d 27 60 27 20 29 3b 0a 20 20 69 66  | q=='`' );.  if
0e80: 28 20 71 3d 3d 27 5b 27 20 29 20 71 20 3d 20 27  ( q=='[' ) q = '
0e90: 5d 27 3b 20 20 0a 0a 20 20 77 68 69 6c 65 28 20  ]';  ..  while( 
0ea0: 41 4c 57 41 59 53 28 7a 5b 69 49 6e 5d 29 20 29  ALWAYS(z[iIn]) )
0eb0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 5d  {.    if( z[iIn]
0ec0: 3d 3d 71 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==q ){.      if(
0ed0: 20 7a 5b 69 49 6e 2b 31 5d 21 3d 71 20 29 7b 0a   z[iIn+1]!=q ){.
0ee0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61          /* Chara
0ef0: 63 74 65 72 20 69 49 6e 20 77 61 73 20 74 68 65  cter iIn was the
0f00: 20 63 6c 6f 73 65 20 71 75 6f 74 65 2e 20 2a 2f   close quote. */
0f10: 0a 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a  .        iIn++;.
0f20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0f30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0f40: 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72      /* Character
0f50: 20 69 49 6e 20 61 6e 64 20 69 49 6e 2b 31 20 66   iIn and iIn+1 f
0f60: 6f 72 6d 20 61 6e 20 65 73 63 61 70 65 64 20 71  orm an escaped q
0f70: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 2e 20  uote character. 
0f80: 53 6b 69 70 0a 20 20 20 20 20 20 20 20 2a 2a 20  Skip.        ** 
0f90: 74 68 65 20 69 6e 70 75 74 20 63 75 72 73 6f 72  the input cursor
0fa0: 20 70 61 73 74 20 62 6f 74 68 20 61 6e 64 20 63   past both and c
0fb0: 6f 70 79 20 61 20 73 69 6e 67 6c 65 20 71 75 6f  opy a single quo
0fc0: 74 65 20 63 68 61 72 61 63 74 65 72 20 0a 20 20  te character .  
0fd0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
0fe0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a  output buffer. *
0ff0: 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 20 2b 3d  /.        iIn +=
1000: 20 32 3b 0a 20 20 20 20 20 20 20 20 7a 5b 69 4f   2;.        z[iO
1010: 75 74 2b 2b 5d 20 3d 20 71 3b 0a 20 20 20 20 20  ut++] = q;.     
1020: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1030: 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20      z[iOut++] = 
1040: 7a 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20 20 7d 0a  z[iIn++];.    }.
1050: 20 20 7d 0a 0a 20 20 7a 5b 69 4f 75 74 5d 20 3d    }..  z[iOut] =
1060: 20 27 5c 30 27 3b 0a 20 20 72 65 74 75 72 6e 20   '\0';.  return 
1070: 69 49 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  iIn;.}../*.** Co
1080: 6e 76 65 72 74 20 61 6e 20 53 51 4c 2d 73 74 79  nvert an SQL-sty
1090: 6c 65 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le quoted string
10a0: 20 69 6e 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73   into a normal s
10b0: 74 72 69 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e  tring by removin
10c0: 67 0a 2a 2a 20 74 68 65 20 71 75 6f 74 65 20 63  g.** the quote c
10d0: 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20  haracters.  The 
10e0: 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 64 6f  conversion is do
10f0: 6e 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66  ne in-place.  If
1100: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 64 6f   the.** input do
1110: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
1120: 68 20 61 20 71 75 6f 74 65 20 63 68 61 72 61 63  h a quote charac
1130: 74 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ter, then this r
1140: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e  outine.** is a n
1150: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  o-op..**.** Exam
1160: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
1170: 22 61 62 63 22 20 20 20 62 65 63 6f 6d 65 73 20  "abc"   becomes 
1180: 20 20 61 62 63 0a 2a 2a 20 20 20 20 20 27 78 79    abc.**     'xy
1190: 7a 27 20 20 20 62 65 63 6f 6d 65 73 20 20 20 78  z'   becomes   x
11a0: 79 7a 0a 2a 2a 20 20 20 20 20 5b 70 71 72 5d 20  yz.**     [pqr] 
11b0: 20 20 62 65 63 6f 6d 65 73 20 20 20 70 71 72 0a    becomes   pqr.
11c0: 2a 2a 20 20 20 20 20 60 6d 6e 6f 60 20 20 20 62  **     `mno`   b
11d0: 65 63 6f 6d 65 73 20 20 20 6d 6e 6f 0a 2a 2f 0a  ecomes   mno.*/.
11e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
11f0: 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29  Dequote(char *z)
1200: 7b 0a 20 20 63 68 61 72 20 71 75 6f 74 65 3b 20  {.  char quote; 
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 20 20 2f 2a 20 51 75 6f 74 65 20 63 68 61      /* Quote cha
1230: 72 61 63 74 65 72 20 28 69 66 20 61 6e 79 20 29  racter (if any )
1240: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 30   */..  assert( 0
1250: 3d 3d 66 74 73 35 5f 69 73 77 68 69 74 65 73 70  ==fts5_iswhitesp
1260: 61 63 65 28 7a 5b 30 5d 29 20 29 3b 0a 20 20 71  ace(z[0]) );.  q
1270: 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69  uote = z[0];.  i
1280: 66 28 20 71 75 6f 74 65 3d 3d 27 5b 27 20 7c 7c  f( quote=='[' ||
1290: 20 71 75 6f 74 65 3d 3d 27 5c 27 27 20 7c 7c 20   quote=='\'' || 
12a0: 71 75 6f 74 65 3d 3d 27 22 27 20 7c 7c 20 71 75  quote=='"' || qu
12b0: 6f 74 65 3d 3d 27 60 27 20 29 7b 0a 20 20 20 20  ote=='`' ){.    
12c0: 66 74 73 35 44 65 71 75 6f 74 65 28 7a 29 3b 0a  fts5Dequote(z);.
12d0: 20 20 7d 0a 7d 0a 0a 0a 73 74 72 75 63 74 20 46    }.}...struct F
12e0: 74 73 35 45 6e 75 6d 20 7b 0a 20 20 63 6f 6e 73  ts5Enum {.  cons
12f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
1300: 20 69 6e 74 20 65 56 61 6c 3b 0a 7d 3b 0a 74 79   int eVal;.};.ty
1310: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
1320: 35 45 6e 75 6d 20 46 74 73 35 45 6e 75 6d 3b 0a  5Enum Fts5Enum;.
1330: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1340: 43 6f 6e 66 69 67 53 65 74 45 6e 75 6d 28 0a 20  ConfigSetEnum(. 
1350: 20 63 6f 6e 73 74 20 46 74 73 35 45 6e 75 6d 20   const Fts5Enum 
1360: 2a 61 45 6e 75 6d 2c 20 0a 20 20 63 6f 6e 73 74  *aEnum, .  const
1370: 20 63 68 61 72 20 2a 7a 45 6e 75 6d 2c 20 0a 20   char *zEnum, . 
1380: 20 69 6e 74 20 2a 70 65 56 61 6c 0a 29 7b 0a 20   int *peVal.){. 
1390: 20 69 6e 74 20 6e 45 6e 75 6d 20 3d 20 28 69 6e   int nEnum = (in
13a0: 74 29 73 74 72 6c 65 6e 28 7a 45 6e 75 6d 29 3b  t)strlen(zEnum);
13b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
13c0: 69 56 61 6c 20 3d 20 2d 31 3b 0a 0a 20 20 66 6f  iVal = -1;..  fo
13d0: 72 28 69 3d 30 3b 20 61 45 6e 75 6d 5b 69 5d 2e  r(i=0; aEnum[i].
13e0: 7a 4e 61 6d 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  zName; i++){.   
13f0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1400: 6e 69 63 6d 70 28 61 45 6e 75 6d 5b 69 5d 2e 7a  nicmp(aEnum[i].z
1410: 4e 61 6d 65 2c 20 7a 45 6e 75 6d 2c 20 6e 45 6e  Name, zEnum, nEn
1420: 75 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  um)==0 ){.      
1430: 69 66 28 20 69 56 61 6c 3e 3d 30 20 29 20 72 65  if( iVal>=0 ) re
1440: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1450: 52 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  R;.      iVal = 
1460: 61 45 6e 75 6d 5b 69 5d 2e 65 56 61 6c 3b 0a 20  aEnum[i].eVal;. 
1470: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 65 56     }.  }..  *peV
1480: 61 6c 20 3d 20 69 56 61 6c 3b 0a 20 20 72 65 74  al = iVal;.  ret
1490: 75 72 6e 20 69 56 61 6c 3c 30 20 3f 20 53 51 4c  urn iVal<0 ? SQL
14a0: 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49  ITE_ERROR : SQLI
14b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14c0: 50 61 72 73 65 20 61 20 22 73 70 65 63 69 61 6c  Parse a "special
14d0: 22 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  " CREATE VIRTUAL
14e0: 20 54 41 42 4c 45 20 64 69 72 65 63 74 69 76 65   TABLE directive
14f0: 20 61 6e 64 20 75 70 64 61 74 65 0a 2a 2a 20 63   and update.** c
1500: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
1510: 65 63 74 20 70 43 6f 6e 66 69 67 20 61 73 20 61  ect pConfig as a
1520: 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a  ppropriate..**.*
1530: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1540: 20 6f 62 6a 65 63 74 20 70 43 6f 6e 66 69 67 20   object pConfig 
1550: 69 73 20 75 70 64 61 74 65 64 20 61 6e 64 20 53  is updated and S
1560: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1570: 64 2e 20 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f  d. If.** an erro
1580: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
1590: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
15a0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
15b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
15c0: 2a 2a 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  ** may be left i
15d0: 6e 20 2a 70 7a 45 72 72 2e 20 49 74 20 69 73 20  n *pzErr. It is 
15e0: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
15f0: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1600: 20 74 6f 0a 2a 2a 20 65 76 65 6e 74 75 61 6c 6c   to.** eventuall
1610: 79 20 66 72 65 65 20 61 6e 79 20 73 75 63 68 20  y free any such 
1620: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75 73  error message us
1630: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
1640: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1650: 74 20 66 74 73 35 43 6f 6e 66 69 67 50 61 72 73  t fts5ConfigPars
1660: 65 53 70 65 63 69 61 6c 28 0a 20 20 46 74 73 35  eSpecial(.  Fts5
1670: 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c  Global *pGlobal,
1680: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
1690: 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20  Config,         
16a0: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
16b0: 69 6f 6e 20 6f 62 6a 65 63 74 20 74 6f 20 75 70  ion object to up
16c0: 64 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  date */.  const 
16d0: 63 68 61 72 20 2a 7a 43 6d 64 2c 20 20 20 20 20  char *zCmd,     
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 65            /* Spe
16f0: 63 69 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  cial command to 
1700: 70 61 72 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  parse */.  const
1710: 20 63 68 61 72 20 2a 7a 41 72 67 2c 20 20 20 20   char *zArg,    
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
1730: 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65 20  gument to parse 
1740: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
1750: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1760: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
1770: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b  or message */.){
1780: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1790: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 6d  TE_OK;.  int nCm
17a0: 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
17b0: 7a 43 6d 64 29 3b 0a 20 20 69 66 28 20 73 71 6c  zCmd);.  if( sql
17c0: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 70  ite3_strnicmp("p
17d0: 72 65 66 69 78 22 2c 20 7a 43 6d 64 2c 20 6e 43  refix", zCmd, nC
17e0: 6d 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  md)==0 ){.    co
17f0: 6e 73 74 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  nst int nByte = 
1800: 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 46 54  sizeof(int) * FT
1810: 53 35 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e  S5_MAX_PREFIX_IN
1820: 44 45 58 45 53 3b 0a 20 20 20 20 63 6f 6e 73 74  DEXES;.    const
1830: 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 69 6e   char *p;.    in
1840: 74 20 62 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  t bFirst = 1;.  
1850: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
1860: 50 72 65 66 69 78 3d 3d 30 20 29 7b 0a 20 20 20  Prefix==0 ){.   
1870: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65     pConfig->aPre
1880: 66 69 78 20 3d 20 73 71 6c 69 74 65 33 46 74 73  fix = sqlite3Fts
1890: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
18a0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
18b0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
18c0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 20  c;.    }..    p 
18d0: 3d 20 7a 41 72 67 3b 0a 20 20 20 20 77 68 69 6c  = zArg;.    whil
18e0: 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  e( 1 ){.      in
18f0: 74 20 6e 50 72 65 20 3d 20 30 3b 0a 0a 20 20 20  t nPre = 0;..   
1900: 20 20 20 77 68 69 6c 65 28 20 70 5b 30 5d 3d 3d     while( p[0]==
1910: 27 20 27 20 29 20 70 2b 2b 3b 0a 20 20 20 20 20  ' ' ) p++;.     
1920: 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 26   if( bFirst==0 &
1930: 26 20 70 5b 30 5d 3d 3d 27 2c 27 20 29 7b 0a 20  & p[0]==',' ){. 
1940: 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20         p++;.    
1950: 20 20 20 20 77 68 69 6c 65 28 20 70 5b 30 5d 3d      while( p[0]=
1960: 3d 27 20 27 20 29 20 70 2b 2b 3b 0a 20 20 20 20  =' ' ) p++;.    
1970: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 5b 30 5d    }else if( p[0]
1980: 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 20 20  =='\0' ){.      
1990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19a0: 0a 20 20 20 20 20 20 69 66 28 20 70 5b 30 5d 3c  .      if( p[0]<
19b0: 27 30 27 20 7c 7c 20 70 5b 30 5d 3e 27 39 27 20  '0' || p[0]>'9' 
19c0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
19d0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
19e0: 6e 74 66 28 22 6d 61 6c 66 6f 72 6d 65 64 20 70  ntf("malformed p
19f0: 72 65 66 69 78 3d 2e 2e 2e 20 64 69 72 65 63 74  refix=... direct
1a00: 69 76 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ive");.        r
1a10: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1a20: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1a30: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a40: 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  if( pConfig->nPr
1a50: 65 66 69 78 3d 3d 46 54 53 35 5f 4d 41 58 5f 50  efix==FTS5_MAX_P
1a60: 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20 29 7b  REFIX_INDEXES ){
1a70: 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20  .        *pzErr 
1a80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1a90: 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  f(.            "
1aa0: 74 6f 6f 20 6d 61 6e 79 20 70 72 65 66 69 78 20  too many prefix 
1ab0: 69 6e 64 65 78 65 73 20 28 6d 61 78 20 25 64 29  indexes (max %d)
1ac0: 22 2c 20 46 54 53 35 5f 4d 41 58 5f 50 52 45 46  ", FTS5_MAX_PREF
1ad0: 49 58 5f 49 4e 44 45 58 45 53 0a 20 20 20 20 20  IX_INDEXES.     
1ae0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63     );.        rc
1af0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1b00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1b10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 77        }..      w
1b20: 68 69 6c 65 28 20 70 5b 30 5d 3e 3d 27 30 27 20  hile( p[0]>='0' 
1b30: 26 26 20 70 5b 30 5d 3c 3d 27 39 27 20 26 26 20  && p[0]<='9' && 
1b40: 6e 50 72 65 3c 31 30 30 30 20 29 7b 0a 20 20 20  nPre<1000 ){.   
1b50: 20 20 20 20 20 6e 50 72 65 20 3d 20 6e 50 72 65       nPre = nPre
1b60: 2a 31 30 20 2b 20 28 70 5b 30 5d 20 2d 20 27 30  *10 + (p[0] - '0
1b70: 27 29 3b 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b  ');.        p++;
1b80: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1b90: 69 66 28 20 6e 50 72 65 3c 3d 30 20 7c 7c 20 6e  if( nPre<=0 || n
1ba0: 50 72 65 3e 3d 31 30 30 30 20 29 7b 0a 20 20 20  Pre>=1000 ){.   
1bb0: 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
1bc0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 70  lite3_mprintf("p
1bd0: 72 65 66 69 78 20 6c 65 6e 67 74 68 20 6f 75 74  refix length out
1be0: 20 6f 66 20 72 61 6e 67 65 20 28 6d 61 78 20 39   of range (max 9
1bf0: 39 39 29 22 29 3b 0a 20 20 20 20 20 20 20 20 72  99)");.        r
1c00: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1c10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1c20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1c30: 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
1c40: 5b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  [pConfig->nPrefi
1c50: 78 5d 20 3d 20 6e 50 72 65 3b 0a 20 20 20 20 20  x] = nPre;.     
1c60: 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69   pConfig->nPrefi
1c70: 78 2b 2b 3b 0a 20 20 20 20 20 20 62 46 69 72 73  x++;.      bFirs
1c80: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
1c90: 20 61 73 73 65 72 74 28 20 70 43 6f 6e 66 69 67   assert( pConfig
1ca0: 2d 3e 6e 50 72 65 66 69 78 3c 3d 46 54 53 35 5f  ->nPrefix<=FTS5_
1cb0: 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58  MAX_PREFIX_INDEX
1cc0: 45 53 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ES );.    return
1cd0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
1ce0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
1cf0: 28 22 74 6f 6b 65 6e 69 7a 65 22 2c 20 7a 43 6d  ("tokenize", zCm
1d00: 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b 0a 20  d, nCmd)==0 ){. 
1d10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
1d20: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1d30: 7a 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  zArg;.    sqlite
1d40: 33 5f 69 6e 74 36 34 20 6e 41 72 67 20 3d 20 73  3_int64 nArg = s
1d50: 74 72 6c 65 6e 28 7a 41 72 67 29 20 2b 20 31 3b  trlen(zArg) + 1;
1d60: 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  .    char **azAr
1d70: 67 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  g = sqlite3Fts5M
1d80: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
1d90: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e  izeof(char*) * n
1da0: 41 72 67 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  Arg);.    char *
1db0: 70 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 46 74  pDel = sqlite3Ft
1dc0: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
1dd0: 2c 20 6e 41 72 67 20 2a 20 32 29 3b 0a 20 20 20  , nArg * 2);.   
1de0: 20 63 68 61 72 20 2a 70 53 70 61 63 65 20 3d 20   char *pSpace = 
1df0: 70 44 65 6c 3b 0a 0a 20 20 20 20 69 66 28 20 61  pDel;..    if( a
1e00: 7a 41 72 67 20 26 26 20 70 53 70 61 63 65 20 29  zArg && pSpace )
1e10: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  {.      if( pCon
1e20: 66 69 67 2d 3e 70 54 6f 6b 20 29 7b 0a 20 20 20  fig->pTok ){.   
1e30: 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
1e40: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d  lite3_mprintf("m
1e50: 75 6c 74 69 70 6c 65 20 74 6f 6b 65 6e 69 7a 65  ultiple tokenize
1e60: 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 73 22  =... directives"
1e70: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1e80: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1e90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ea0: 20 20 20 66 6f 72 28 6e 41 72 67 3d 30 3b 20 70     for(nArg=0; p
1eb0: 20 26 26 20 2a 70 3b 20 6e 41 72 67 2b 2b 29 7b   && *p; nArg++){
1ec0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
1ed0: 20 63 68 61 72 20 2a 70 32 20 3d 20 66 74 73 35   char *p2 = fts5
1ee0: 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73  ConfigSkipWhites
1ef0: 70 61 63 65 28 70 29 3b 0a 20 20 20 20 20 20 20  pace(p);.       
1f00: 20 20 20 69 66 28 20 2a 70 32 3d 3d 27 5c 27 27     if( *p2=='\''
1f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f20: 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  p = fts5ConfigSk
1f30: 69 70 4c 69 74 65 72 61 6c 28 70 32 29 3b 0a 20  ipLiteral(p2);. 
1f40: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 70 20 3d 20              p = 
1f60: 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 42 61  fts5ConfigSkipBa
1f70: 72 65 77 6f 72 64 28 70 32 29 3b 0a 20 20 20 20  reword(p2);.    
1f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f90: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
1fa0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53         memcpy(pS
1fb0: 70 61 63 65 2c 20 70 32 2c 20 70 2d 70 32 29 3b  pace, p2, p-p2);
1fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41  .            azA
1fd0: 72 67 5b 6e 41 72 67 5d 20 3d 20 70 53 70 61 63  rg[nArg] = pSpac
1fe0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
1ff0: 71 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f 74  qlite3Fts5Dequot
2000: 65 28 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  e(pSpace);.     
2010: 20 20 20 20 20 20 20 70 53 70 61 63 65 20 2b 3d         pSpace +=
2020: 20 28 70 20 2d 20 70 32 29 20 2b 20 31 3b 0a 20   (p - p2) + 1;. 
2030: 20 20 20 20 20 20 20 20 20 20 20 70 20 3d 20 66             p = f
2040: 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69  ts5ConfigSkipWhi
2050: 74 65 73 70 61 63 65 28 70 29 3b 0a 20 20 20 20  tespace(p);.    
2060: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2070: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 3d  }.        if( p=
2080: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2090: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
20a0: 5f 6d 70 72 69 6e 74 66 28 22 70 61 72 73 65 20  _mprintf("parse 
20b0: 65 72 72 6f 72 20 69 6e 20 74 6f 6b 65 6e 69 7a  error in tokeniz
20c0: 65 20 64 69 72 65 63 74 69 76 65 22 29 3b 0a 20  e directive");. 
20d0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
20e0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
20f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2100: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2110: 33 46 74 73 35 47 65 74 54 6f 6b 65 6e 69 7a 65  3Fts5GetTokenize
2120: 72 28 70 47 6c 6f 62 61 6c 2c 20 0a 20 20 20 20  r(pGlobal, .    
2130: 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
2140: 20 63 68 61 72 2a 2a 29 61 7a 41 72 67 2c 20 6e   char**)azArg, n
2150: 41 72 67 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 70  Arg, &pConfig->p
2160: 54 6f 6b 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 70  Tok, &pConfig->p
2170: 54 6f 6b 41 70 69 2c 0a 20 20 20 20 20 20 20 20  TokApi,.        
2180: 20 20 20 20 20 20 70 7a 45 72 72 0a 20 20 20 20        pzErr.    
2190: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
21a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21b0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
21c0: 65 65 28 61 7a 41 72 67 29 3b 0a 20 20 20 20 73  ee(azArg);.    s
21d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65 6c  qlite3_free(pDel
21e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
21f0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c  ;.  }..  if( sql
2200: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 63  ite3_strnicmp("c
2210: 6f 6e 74 65 6e 74 22 2c 20 7a 43 6d 64 2c 20 6e  ontent", zCmd, n
2220: 43 6d 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Cmd)==0 ){.    i
2230: 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e  f( pConfig->eCon
2240: 74 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45  tent!=FTS5_CONTE
2250: 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0a 20 20 20  NT_NORMAL ){.   
2260: 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
2270: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 75 6c  te3_mprintf("mul
2280: 74 69 70 6c 65 20 63 6f 6e 74 65 6e 74 3d 2e 2e  tiple content=..
2290: 2e 20 64 69 72 65 63 74 69 76 65 73 22 29 3b 0a  . directives");.
22a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
22c0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  se{.      if( zA
22d0: 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  rg[0] ){.       
22e0: 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65   pConfig->eConte
22f0: 6e 74 20 3d 20 46 54 53 35 5f 43 4f 4e 54 45 4e  nt = FTS5_CONTEN
2300: 54 5f 45 58 54 45 52 4e 41 4c 3b 0a 20 20 20 20  T_EXTERNAL;.    
2310: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f      pConfig->zCo
2320: 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46  ntent = sqlite3F
2330: 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20  ts5Mprintf(&rc, 
2340: 22 25 51 2e 25 51 22 2c 20 70 43 6f 6e 66 69 67  "%Q.%Q", pConfig
2350: 2d 3e 7a 44 62 2c 7a 41 72 67 29 3b 0a 20 20 20  ->zDb,zArg);.   
2360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2370: 20 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74    pConfig->eCont
2380: 65 6e 74 20 3d 20 46 54 53 35 5f 43 4f 4e 54 45  ent = FTS5_CONTE
2390: 4e 54 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NT_NONE;.      }
23a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
23b0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
23c0: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
23d0: 70 28 22 63 6f 6e 74 65 6e 74 5f 72 6f 77 69 64  p("content_rowid
23e0: 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d  ", zCmd, nCmd)==
23f0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  0 ){.    if( pCo
2400: 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f  nfig->zContentRo
2410: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a  wid ){.      *pz
2420: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
2430: 72 69 6e 74 66 28 22 6d 75 6c 74 69 70 6c 65 20  rintf("multiple 
2440: 63 6f 6e 74 65 6e 74 5f 72 6f 77 69 64 3d 2e 2e  content_rowid=..
2450: 2e 20 64 69 72 65 63 74 69 76 65 73 22 29 3b 0a  . directives");.
2460: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2470: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
2480: 73 65 7b 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  se{.      pConfi
2490: 67 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64  g->zContentRowid
24a0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
24b0: 72 6e 64 75 70 28 26 72 63 2c 20 7a 41 72 67 2c  rndup(&rc, zArg,
24c0: 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   -1);.    }.    
24d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
24e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
24f0: 72 6e 69 63 6d 70 28 22 63 6f 6c 75 6d 6e 73 69  rnicmp("columnsi
2500: 7a 65 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64 29  ze", zCmd, nCmd)
2510: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ==0 ){.    if( (
2520: 7a 41 72 67 5b 30 5d 21 3d 27 30 27 20 26 26 20  zArg[0]!='0' && 
2530: 7a 41 72 67 5b 30 5d 21 3d 27 31 27 29 20 7c 7c  zArg[0]!='1') ||
2540: 20 7a 41 72 67 5b 31 5d 21 3d 27 5c 30 27 20 29   zArg[1]!='\0' )
2550: 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d  {.      *pzErr =
2560: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2570: 28 22 6d 61 6c 66 6f 72 6d 65 64 20 63 6f 6c 75  ("malformed colu
2580: 6d 6e 73 69 7a 65 3d 2e 2e 2e 20 64 69 72 65 63  mnsize=... direc
2590: 74 69 76 65 22 29 3b 0a 20 20 20 20 20 20 72 63  tive");.      rc
25a0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
25b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25c0: 20 20 70 43 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75    pConfig->bColu
25d0: 6d 6e 73 69 7a 65 20 3d 20 28 7a 41 72 67 5b 30  mnsize = (zArg[0
25e0: 5d 3d 3d 27 31 27 29 3b 0a 20 20 20 20 7d 0a 20  ]=='1');.    }. 
25f0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2600: 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  }..  if( sqlite3
2610: 5f 73 74 72 6e 69 63 6d 70 28 22 64 65 74 61 69  _strnicmp("detai
2620: 6c 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d  l", zCmd, nCmd)=
2630: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2640: 46 74 73 35 45 6e 75 6d 20 61 44 65 74 61 69 6c  Fts5Enum aDetail
2650: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
2660: 6e 6f 6e 65 22 2c 20 46 54 53 35 5f 44 45 54 41  none", FTS5_DETA
2670: 49 4c 5f 4e 4f 4e 45 20 7d 2c 0a 20 20 20 20 20  IL_NONE },.     
2680: 20 7b 20 22 66 75 6c 6c 22 2c 20 46 54 53 35 5f   { "full", FTS5_
2690: 44 45 54 41 49 4c 5f 46 55 4c 4c 20 7d 2c 0a 20  DETAIL_FULL },. 
26a0: 20 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 73 22       { "columns"
26b0: 2c 20 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f  , FTS5_DETAIL_CO
26c0: 4c 55 4d 4e 53 20 7d 2c 0a 20 20 20 20 20 20 7b  LUMNS },.      {
26d0: 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 0a   0, 0 }.    };..
26e0: 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 66 74      if( (rc = ft
26f0: 73 35 43 6f 6e 66 69 67 53 65 74 45 6e 75 6d 28  s5ConfigSetEnum(
2700: 61 44 65 74 61 69 6c 2c 20 7a 41 72 67 2c 20 26  aDetail, zArg, &
2710: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
2720: 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45  )) ){.      *pzE
2730: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
2740: 69 6e 74 66 28 22 6d 61 6c 66 6f 72 6d 65 64 20  intf("malformed 
2750: 64 65 74 61 69 6c 3d 2e 2e 2e 20 64 69 72 65 63  detail=... direc
2760: 74 69 76 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20  tive");.    }.  
2770: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2780: 0a 0a 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c  ..  *pzErr = sql
2790: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e  ite3_mprintf("un
27a0: 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
27b0: 6e 3a 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 6e 43  n: \"%.*s\"", nC
27c0: 6d 64 2c 20 7a 43 6d 64 29 3b 0a 20 20 72 65 74  md, zCmd);.  ret
27d0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
27f0: 61 74 65 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ate an instance 
2800: 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  of the default t
2810: 6f 6b 65 6e 69 7a 65 72 20 28 22 73 69 6d 70 6c  okenizer ("simpl
2820: 65 22 29 20 61 74 20 0a 2a 2a 20 46 74 73 35 43  e") at .** Fts5C
2830: 6f 6e 66 69 67 2e 70 54 6f 6b 65 6e 69 7a 65 72  onfig.pTokenizer
2840: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
2850: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
2860: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
2870: 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 66 20  rror.** code if 
2880: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
2890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
28a0: 74 73 35 43 6f 6e 66 69 67 44 65 66 61 75 6c 74  ts5ConfigDefault
28b0: 54 6f 6b 65 6e 69 7a 65 72 28 46 74 73 35 47 6c  Tokenizer(Fts5Gl
28c0: 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 20 46  obal *pGlobal, F
28d0: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
28e0: 69 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ig){.  assert( p
28f0: 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 3d 3d 30 20  Config->pTok==0 
2900: 26 26 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b  && pConfig->pTok
2910: 41 70 69 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  Api==0 );.  retu
2920: 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  rn sqlite3Fts5Ge
2930: 74 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 20 20  tTokenizer(.    
2940: 20 20 70 47 6c 6f 62 61 6c 2c 20 30 2c 20 30 2c    pGlobal, 0, 0,
2950: 20 26 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 2c   &pConfig->pTok,
2960: 20 26 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41   &pConfig->pTokA
2970: 70 69 2c 20 30 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a  pi, 0.  );.}../*
2980: 0a 2a 2a 20 47 6f 62 62 6c 65 20 75 70 20 74 68  .** Gobble up th
2990: 65 20 66 69 72 73 74 20 62 61 72 65 77 6f 72 64  e first bareword
29a0: 20 6f 72 20 71 75 6f 74 65 64 20 77 6f 72 64 20   or quoted word 
29b0: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
29c0: 75 66 66 65 72 20 7a 49 6e 2e 0a 2a 2a 20 52 65  uffer zIn..** Re
29d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
29e0: 6f 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  o the character 
29f0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
2a00: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 69  owing the last i
2a10: 6e 0a 2a 2a 20 74 68 65 20 67 6f 62 62 6c 65 64  n.** the gobbled
2a20: 20 77 6f 72 64 20 69 66 20 73 75 63 63 65 73 73   word if success
2a30: 66 75 6c 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70  ful, or a NULL p
2a40: 6f 69 6e 74 65 72 20 6f 74 68 65 72 77 69 73 65  ointer otherwise
2a50: 20 28 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 66   (failed.** to f
2a60: 69 6e 64 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20  ind close-quote 
2a70: 63 68 61 72 61 63 74 65 72 29 2e 0a 2a 2a 0a 2a  character)..**.*
2a80: 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
2a90: 6e 67 2c 20 73 65 74 20 70 7a 4f 75 74 20 74 6f  ng, set pzOut to
2aa0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e 65 77 20   point to a new 
2ab0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2ac0: 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  g a.** nul-termi
2ad0: 6e 61 74 65 64 2c 20 64 65 71 75 6f 74 65 64 20  nated, dequoted 
2ae0: 63 6f 70 79 20 6f 66 20 74 68 65 20 67 6f 62 62  copy of the gobb
2af0: 6c 65 64 20 77 6f 72 64 2e 20 49 66 20 74 68 65  led word. If the
2b00: 20 77 6f 72 64 20 77 61 73 0a 2a 2a 20 71 75 6f   word was.** quo
2b10: 74 65 64 2c 20 2a 70 62 51 75 6f 74 65 64 20 69  ted, *pbQuoted i
2b20: 73 20 61 6c 73 6f 20 73 65 74 20 74 6f 20 31 20  s also set to 1 
2b30: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2b40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ..**.** If *pRc 
2b50: 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  is other than SQ
2b60: 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
2b70: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2b80: 6c 6c 65 64 2c 20 69 74 20 69 73 0a 2a 2a 20 61  lled, it is.** a
2b90: 20 6e 6f 2d 6f 70 20 28 4e 55 4c 4c 20 69 73 20   no-op (NULL is 
2ba0: 72 65 74 75 72 6e 65 64 29 2e 20 4f 74 68 65 72  returned). Other
2bb0: 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20  wise, if an OOM 
2bc0: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
2bd0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20  is.** function, 
2be0: 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53  *pRc is set to S
2bf0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f  QLITE_NOMEM befo
2c00: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 70  re returning. *p
2c10: 52 63 20 69 73 20 2a 6e 6f 74 2a 0a 2a 2a 20 73  Rc is *not*.** s
2c20: 65 74 20 69 66 20 61 20 70 61 72 73 65 20 65 72  et if a parse er
2c30: 72 6f 72 20 28 66 61 69 6c 65 64 20 74 6f 20 66  ror (failed to f
2c40: 69 6e 64 20 63 6c 6f 73 65 20 71 75 6f 74 65 29  ind close quote)
2c50: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
2c60: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  ic const char *f
2c70: 74 73 35 43 6f 6e 66 69 67 47 6f 62 62 6c 65 57  ts5ConfigGobbleW
2c80: 6f 72 64 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ord(.  int *pRc,
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2cb0: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
2cc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
2cd0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2ce0: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 67    /* Buffer to g
2cf0: 6f 62 62 6c 65 20 73 74 72 69 6e 67 2f 62 61 72  obble string/bar
2d00: 65 77 6f 72 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  eword from */.  
2d10: 63 68 61 72 20 2a 2a 70 7a 4f 75 74 2c 20 20 20  char **pzOut,   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 2f 2a 20 4f 55 54 3a 20 6d 61 6c 6c 6f 63 27 64  /* OUT: malloc'd
2d40: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
2d50: 6e 67 20 73 74 72 2f 62 77 20 2a 2f 0a 20 20 69  ng str/bw */.  i
2d60: 6e 74 20 2a 70 62 51 75 6f 74 65 64 20 20 20 20  nt *pbQuoted    
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d80: 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74 72  * OUT: Set to tr
2d90: 75 65 20 69 66 20 64 65 71 75 6f 74 69 6e 67 20  ue if dequoting 
2da0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 29 7b 0a 20  required */.){. 
2db0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
2dc0: 74 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65  t = 0;..  sqlite
2dd0: 33 5f 69 6e 74 36 34 20 6e 49 6e 20 3d 20 73 74  3_int64 nIn = st
2de0: 72 6c 65 6e 28 7a 49 6e 29 3b 0a 20 20 63 68 61  rlen(zIn);.  cha
2df0: 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
2e00: 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 49 6e 2b 31  3_malloc64(nIn+1
2e10: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  );..  assert( *p
2e20: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  Rc==SQLITE_OK );
2e30: 0a 20 20 2a 70 62 51 75 6f 74 65 64 20 3d 20 30  .  *pbQuoted = 0
2e40: 3b 0a 20 20 2a 70 7a 4f 75 74 20 3d 20 30 3b 0a  ;.  *pzOut = 0;.
2e50: 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29  .  if( zOut==0 )
2e60: 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c  {.    *pRc = SQL
2e70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
2e80: 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  se{.    memcpy(z
2e90: 4f 75 74 2c 20 7a 49 6e 2c 20 6e 49 6e 2b 31 29  Out, zIn, nIn+1)
2ea0: 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 5f 69  ;.    if( fts5_i
2eb0: 73 6f 70 65 6e 71 75 6f 74 65 28 7a 4f 75 74 5b  sopenquote(zOut[
2ec0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  0]) ){.      int
2ed0: 20 69 69 20 3d 20 66 74 73 35 44 65 71 75 6f 74   ii = fts5Dequot
2ee0: 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 7a  e(zOut);.      z
2ef0: 52 65 74 20 3d 20 26 7a 49 6e 5b 69 69 5d 3b 0a  Ret = &zIn[ii];.
2f00: 20 20 20 20 20 20 2a 70 62 51 75 6f 74 65 64 20        *pbQuoted 
2f10: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
2f20: 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
2f30: 35 43 6f 6e 66 69 67 53 6b 69 70 42 61 72 65 77  5ConfigSkipBarew
2f40: 6f 72 64 28 7a 49 6e 29 3b 0a 20 20 20 20 20 20  ord(zIn);.      
2f50: 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20  if( zRet ){.    
2f60: 20 20 20 20 7a 4f 75 74 5b 7a 52 65 74 2d 7a 49      zOut[zRet-zI
2f70: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
2f80: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2f90: 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 7b 0a 20  if( zRet==0 ){. 
2fa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2fb0: 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zOut);.  }else{.
2fc0: 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20 7a 4f 75      *pzOut = zOu
2fd0: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
2fe0: 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63   zRet;.}..static
2ff0: 20 69 6e 74 20 66 74 73 35 43 6f 6e 66 69 67 50   int fts5ConfigP
3000: 61 72 73 65 43 6f 6c 75 6d 6e 28 0a 20 20 46 74  arseColumn(.  Ft
3010: 73 35 43 6f 6e 66 69 67 20 2a 70 2c 20 0a 20 20  s5Config *p, .  
3020: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 0a 20 20 63  char *zCol, .  c
3030: 68 61 72 20 2a 7a 41 72 67 2c 20 0a 20 20 63 68  har *zArg, .  ch
3040: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
3050: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3060: 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c  OK;.  if( 0==sql
3070: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 43 6f  ite3_stricmp(zCo
3080: 6c 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d  l, FTS5_RANK_NAM
3090: 45 29 20 0a 20 20 20 7c 7c 20 30 3d 3d 73 71 6c  E) .   || 0==sql
30a0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 43 6f  ite3_stricmp(zCo
30b0: 6c 2c 20 46 54 53 35 5f 52 4f 57 49 44 5f 4e 41  l, FTS5_ROWID_NA
30c0: 4d 45 29 20 0a 20 20 29 7b 0a 20 20 20 20 2a 70  ME) .  ){.    *p
30d0: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
30e0: 70 72 69 6e 74 66 28 22 72 65 73 65 72 76 65 64  printf("reserved
30f0: 20 66 74 73 35 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fts5 column nam
3100: 65 3a 20 25 73 22 2c 20 7a 43 6f 6c 29 3b 0a 20  e: %s", zCol);. 
3110: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
3120: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  RROR;.  }else if
3130: 28 20 7a 41 72 67 20 29 7b 0a 20 20 20 20 69 66  ( zArg ){.    if
3140: 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
3150: 69 63 6d 70 28 7a 41 72 67 2c 20 22 75 6e 69 6e  icmp(zArg, "unin
3160: 64 65 78 65 64 22 29 20 29 7b 0a 20 20 20 20 20  dexed") ){.     
3170: 20 70 2d 3e 61 62 55 6e 69 6e 64 65 78 65 64 5b   p->abUnindexed[
3180: 70 2d 3e 6e 43 6f 6c 5d 20 3d 20 31 3b 0a 20 20  p->nCol] = 1;.  
3190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
31a0: 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
31b0: 6d 70 72 69 6e 74 66 28 22 75 6e 72 65 63 6f 67  mprintf("unrecog
31c0: 6e 69 7a 65 64 20 63 6f 6c 75 6d 6e 20 6f 70 74  nized column opt
31d0: 69 6f 6e 3a 20 25 73 22 2c 20 7a 41 72 67 29 3b  ion: %s", zArg);
31e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
31f0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
3200: 20 20 7d 0a 0a 20 20 70 2d 3e 61 7a 43 6f 6c 5b    }..  p->azCol[
3210: 70 2d 3e 6e 43 6f 6c 2b 2b 5d 20 3d 20 7a 43 6f  p->nCol++] = zCo
3220: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  l;.  return rc;.
3230: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
3240: 65 20 74 68 65 20 46 74 73 35 43 6f 6e 66 69 67  e the Fts5Config
3250: 2e 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73  .zContentExprlis
3260: 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  t string..*/.sta
3270: 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e 66  tic int fts5Conf
3280: 69 67 4d 61 6b 65 45 78 70 72 6c 69 73 74 28 46  igMakeExprlist(F
3290: 74 73 35 43 6f 6e 66 69 67 20 2a 70 29 7b 0a 20  ts5Config *p){. 
32a0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
32b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
32c0: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d  Fts5Buffer buf =
32d0: 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 73   {0, 0, 0};..  s
32e0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
32f0: 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
3300: 2c 20 26 62 75 66 2c 20 22 54 2e 25 51 22 2c 20  , &buf, "T.%Q", 
3310: 70 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64  p->zContentRowid
3320: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43 6f 6e  );.  if( p->eCon
3330: 74 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45  tent!=FTS5_CONTE
3340: 4e 54 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 66  NT_NONE ){.    f
3350: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
3360: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
3370: 66 28 20 70 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d  f( p->eContent==
3380: 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 45 58 54  FTS5_CONTENT_EXT
3390: 45 52 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  ERNAL ){.       
33a0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
33b0: 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
33c0: 72 63 2c 20 26 62 75 66 2c 20 22 2c 20 54 2e 25  rc, &buf, ", T.%
33d0: 51 22 2c 20 70 2d 3e 61 7a 43 6f 6c 5b 69 5d 29  Q", p->azCol[i])
33e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
33f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
3400: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
3410: 69 6e 74 66 28 26 72 63 2c 20 26 62 75 66 2c 20  intf(&rc, &buf, 
3420: 22 2c 20 54 2e 63 25 64 22 2c 20 69 29 3b 0a 20  ", T.c%d", i);. 
3430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3440: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a  ..  assert( p->z
3450: 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 3d  ContentExprlist=
3460: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 43 6f 6e 74  =0 );.  p->zCont
3470: 65 6e 74 45 78 70 72 6c 69 73 74 20 3d 20 28 63  entExprlist = (c
3480: 68 61 72 2a 29 62 75 66 2e 70 3b 0a 20 20 72 65  har*)buf.p;.  re
3490: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34a0: 2a 20 41 72 67 75 6d 65 6e 74 73 20 6e 41 72 67  * Arguments nArg
34b0: 2f 61 7a 41 72 67 20 63 6f 6e 74 61 69 6e 20 74  /azArg contain t
34c0: 68 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65  he string argume
34d0: 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  nts passed to th
34e0: 65 20 78 43 72 65 61 74 65 0a 2a 2a 20 6f 72 20  e xCreate.** or 
34f0: 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 20  xConnect method 
3500: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
3510: 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
3520: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
3530: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20  .** allocate an 
3540: 69 6e 73 74 61 6e 63 65 20 6f 66 20 46 74 73 35  instance of Fts5
3550: 43 6f 6e 66 69 67 20 63 6f 6e 74 61 69 6e 69 6e  Config containin
3560: 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
3570: 20 70 61 72 73 69 6e 67 0a 2a 2a 20 74 68 6f 73   parsing.** thos
3580: 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 0a  e arguments..**.
3590: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
35a0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
35b0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 4f  eturned and *ppO
35c0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
35d0: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 77  nt to the.** new
35e0: 20 46 74 73 35 43 6f 6e 66 69 67 20 6f 62 6a 65   Fts5Config obje
35f0: 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
3600: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
3610: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
3620: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 2a 70  .** returned, *p
3630: 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e  pOut is set to N
3640: 55 4c 4c 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ULL and an error
3650: 20 6d 65 73 73 61 67 65 20 6d 61 79 20 62 65 20   message may be 
3660: 6c 65 66 74 20 69 6e 0a 2a 2a 20 2a 70 7a 45 72  left in.** *pzEr
3670: 72 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  r. It is the res
3680: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
3690: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
36a0: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 61 6e 79  ntually free any
36b0: 20 0a 2a 2a 20 73 75 63 68 20 65 72 72 6f 72 20   .** such error 
36c0: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
36d0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
36e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
36f0: 43 6f 6e 66 69 67 50 61 72 73 65 28 0a 20 20 46  ConfigParse(.  F
3700: 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62  ts5Global *pGlob
3710: 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  al,.  sqlite3 *d
3720: 62 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  b,.  int nArg,  
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3750: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3760: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a   const char **az
3770: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
3780: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6e 41 72   /* Array of nAr
3790: 67 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  g CREATE VIRTUAL
37a0: 20 54 41 42 4c 45 20 61 72 67 73 20 2a 2f 0a 20   TABLE args */. 
37b0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 2a 70 70   Fts5Config **pp
37c0: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
37d0: 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 73   /* OUT: Results
37e0: 20 6f 66 20 70 61 72 73 65 20 2a 2f 0a 20 20 63   of parse */.  c
37f0: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3810: 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73  * OUT: Error mes
3820: 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  sage */.){.  int
3830: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3850: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
3860: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 52 65   Fts5Config *pRe
3870: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3880: 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 74   /* New object t
3890: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
38a0: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  t i;.  sqlite3_i
38b0: 6e 74 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 2a  nt64 nByte;..  *
38c0: 70 70 4f 75 74 20 3d 20 70 52 65 74 20 3d 20 28  ppOut = pRet = (
38d0: 46 74 73 35 43 6f 6e 66 69 67 2a 29 73 71 6c 69  Fts5Config*)sqli
38e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
38f0: 66 28 46 74 73 35 43 6f 6e 66 69 67 29 29 3b 0a  f(Fts5Config));.
3900: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 20    if( pRet==0 ) 
3910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
3920: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 52  MEM;.  memset(pR
3930: 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  et, 0, sizeof(Ft
3940: 73 35 43 6f 6e 66 69 67 29 29 3b 0a 20 20 70 52  s5Config));.  pR
3950: 65 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70  et->db = db;.  p
3960: 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 2d  Ret->iCookie = -
3970: 31 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6e 41  1;..  nByte = nA
3980: 72 67 20 2a 20 28 73 69 7a 65 6f 66 28 63 68 61  rg * (sizeof(cha
3990: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 75 38 29  r*) + sizeof(u8)
39a0: 29 3b 0a 20 20 70 52 65 74 2d 3e 61 7a 43 6f 6c  );.  pRet->azCol
39b0: 20 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c 69 74   = (char**)sqlit
39c0: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
39d0: 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  (&rc, nByte);.  
39e0: 70 52 65 74 2d 3e 61 62 55 6e 69 6e 64 65 78 65  pRet->abUnindexe
39f0: 64 20 3d 20 28 75 38 2a 29 26 70 52 65 74 2d 3e  d = (u8*)&pRet->
3a00: 61 7a 43 6f 6c 5b 6e 41 72 67 5d 3b 0a 20 20 70  azCol[nArg];.  p
3a10: 52 65 74 2d 3e 7a 44 62 20 3d 20 73 71 6c 69 74  Ret->zDb = sqlit
3a20: 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26 72  e3Fts5Strndup(&r
3a30: 63 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d 31 29  c, azArg[1], -1)
3a40: 3b 0a 20 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 20  ;.  pRet->zName 
3a50: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 72  = sqlite3Fts5Str
3a60: 6e 64 75 70 28 26 72 63 2c 20 61 7a 41 72 67 5b  ndup(&rc, azArg[
3a70: 32 5d 2c 20 2d 31 29 3b 0a 20 20 70 52 65 74 2d  2], -1);.  pRet-
3a80: 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 3d 20 31  >bColumnsize = 1
3a90: 3b 0a 20 20 70 52 65 74 2d 3e 65 44 65 74 61 69  ;.  pRet->eDetai
3aa0: 6c 20 3d 20 46 54 53 35 5f 44 45 54 41 49 4c 5f  l = FTS5_DETAIL_
3ab0: 46 55 4c 4c 3b 0a 23 69 66 64 65 66 20 53 51 4c  FULL;.#ifdef SQL
3ac0: 49 54 45 5f 44 45 42 55 47 0a 20 20 70 52 65 74  ITE_DEBUG.  pRet
3ad0: 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 20 3d  ->bPrefixIndex =
3ae0: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
3af0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
3b00: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
3b10: 70 28 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c 20 46  p(pRet->zName, F
3b20: 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45 29 3d 3d  TS5_RANK_NAME)==
3b30: 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20  0 ){.    *pzErr 
3b40: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3b50: 66 28 22 72 65 73 65 72 76 65 64 20 66 74 73 35  f("reserved fts5
3b60: 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22   table name: %s"
3b70: 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pRet->zName);.
3b80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3b90: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f  ERROR;.  }..  fo
3ba0: 72 28 69 3d 33 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=3; rc==SQLIT
3bb0: 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20  E_OK && i<nArg; 
3bc0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
3bd0: 63 68 61 72 20 2a 7a 4f 72 69 67 20 3d 20 61 7a  char *zOrig = az
3be0: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 63 6f 6e 73  Arg[i];.    cons
3bf0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 63  t char *z;.    c
3c00: 68 61 72 20 2a 7a 4f 6e 65 20 3d 20 30 3b 0a 20  har *zOne = 0;. 
3c10: 20 20 20 63 68 61 72 20 2a 7a 54 77 6f 20 3d 20     char *zTwo = 
3c20: 30 3b 0a 20 20 20 20 69 6e 74 20 62 4f 70 74 69  0;.    int bOpti
3c30: 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  on = 0;.    int 
3c40: 62 4d 75 73 74 42 65 43 6f 6c 20 3d 20 30 3b 0a  bMustBeCol = 0;.
3c50: 0a 20 20 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e  .    z = fts5Con
3c60: 66 69 67 47 6f 62 62 6c 65 57 6f 72 64 28 26 72  figGobbleWord(&r
3c70: 63 2c 20 7a 4f 72 69 67 2c 20 26 7a 4f 6e 65 2c  c, zOrig, &zOne,
3c80: 20 26 62 4d 75 73 74 42 65 43 6f 6c 29 3b 0a 20   &bMustBeCol);. 
3c90: 20 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69     z = fts5Confi
3ca0: 67 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28  gSkipWhitespace(
3cb0: 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 26 26  z);.    if( z &&
3cc0: 20 2a 7a 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20   *z=='=' ){.    
3cd0: 20 20 62 4f 70 74 69 6f 6e 20 3d 20 31 3b 0a 20    bOption = 1;. 
3ce0: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
3cf0: 69 66 28 20 62 4d 75 73 74 42 65 43 6f 6c 20 29  if( bMustBeCol )
3d00: 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   z = 0;.    }.  
3d10: 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69 67    z = fts5Config
3d20: 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 7a  SkipWhitespace(z
3d30: 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 26 26 20  );.    if( z && 
3d40: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  z[0] ){.      in
3d50: 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20  t bDummy;.      
3d60: 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 47 6f  z = fts5ConfigGo
3d70: 62 62 6c 65 57 6f 72 64 28 26 72 63 2c 20 7a 2c  bbleWord(&rc, z,
3d80: 20 26 7a 54 77 6f 2c 20 26 62 44 75 6d 6d 79 29   &zTwo, &bDummy)
3d90: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 26 26  ;.      if( z &&
3da0: 20 7a 5b 30 5d 20 29 20 7a 20 3d 20 30 3b 0a 20   z[0] ) z = 0;. 
3db0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
3dc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
3dd0: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
3de0: 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20  .        *pzErr 
3df0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3e00: 66 28 22 70 61 72 73 65 20 65 72 72 6f 72 20 69  f("parse error i
3e10: 6e 20 5c 22 25 73 5c 22 22 2c 20 7a 4f 72 69 67  n \"%s\"", zOrig
3e20: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
3e30: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
3e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3e50: 20 20 20 69 66 28 20 62 4f 70 74 69 6f 6e 20 29     if( bOption )
3e60: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
3e70: 20 66 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65   fts5ConfigParse
3e80: 53 70 65 63 69 61 6c 28 70 47 6c 6f 62 61 6c 2c  Special(pGlobal,
3e90: 20 70 52 65 74 2c 20 7a 4f 6e 65 2c 20 7a 54 77   pRet, zOne, zTw
3ea0: 6f 3f 7a 54 77 6f 3a 22 22 2c 20 70 7a 45 72 72  o?zTwo:"", pzErr
3eb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
3ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
3ed0: 20 66 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65   fts5ConfigParse
3ee0: 43 6f 6c 75 6d 6e 28 70 52 65 74 2c 20 7a 4f 6e  Column(pRet, zOn
3ef0: 65 2c 20 7a 54 77 6f 2c 20 70 7a 45 72 72 29 3b  e, zTwo, pzErr);
3f00: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6e 65 20  .          zOne 
3f10: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
3f20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3f30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3f40: 4f 6e 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  One);.    sqlite
3f50: 33 5f 66 72 65 65 28 7a 54 77 6f 29 3b 0a 20 20  3_free(zTwo);.  
3f60: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 6f 6b  }..  /* If a tok
3f70: 65 6e 69 7a 65 72 3d 20 6f 70 74 69 6f 6e 20 77  enizer= option w
3f80: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
3f90: 70 61 72 73 65 64 2c 20 74 68 65 20 74 6f 6b 65  parsed, the toke
3fa0: 6e 69 7a 65 72 20 68 61 73 0a 20 20 2a 2a 20 61  nizer has.  ** a
3fb0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
3fc0: 63 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65  cated. Otherwise
3fd0: 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 69 6e  , allocate an in
3fe0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 64 65  stance of the de
3ff0: 66 61 75 6c 74 0a 20 20 2a 2a 20 74 6f 6b 65 6e  fault.  ** token
4000: 69 7a 65 72 20 28 75 6e 69 63 6f 64 65 36 31 29  izer (unicode61)
4010: 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 69 66 28 20   now.  */.  if( 
4020: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
4030: 20 70 52 65 74 2d 3e 70 54 6f 6b 3d 3d 30 20 29   pRet->pTok==0 )
4040: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 43  {.    rc = fts5C
4050: 6f 6e 66 69 67 44 65 66 61 75 6c 74 54 6f 6b 65  onfigDefaultToke
4060: 6e 69 7a 65 72 28 70 47 6c 6f 62 61 6c 2c 20 70  nizer(pGlobal, p
4070: 52 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Ret);.  }..  /* 
4080: 49 66 20 6e 6f 20 7a 43 6f 6e 74 65 6e 74 20 6f  If no zContent o
4090: 70 74 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66  ption was specif
40a0: 69 65 64 2c 20 66 69 6c 6c 20 69 6e 20 74 68 65  ied, fill in the
40b0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2e   default values.
40c0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
40d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 65 74 2d  LITE_OK && pRet-
40e0: 3e 7a 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 7b 0a  >zContent==0 ){.
40f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4100: 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20 61  zTail = 0;.    a
4110: 73 73 65 72 74 28 20 70 52 65 74 2d 3e 65 43 6f  ssert( pRet->eCo
4120: 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54  ntent==FTS5_CONT
4130: 45 4e 54 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ENT_NORMAL .    
4140: 20 20 20 20 20 7c 7c 20 70 52 65 74 2d 3e 65 43       || pRet->eC
4150: 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e  ontent==FTS5_CON
4160: 54 45 4e 54 5f 4e 4f 4e 45 20 0a 20 20 20 20 29  TENT_NONE .    )
4170: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e  ;.    if( pRet->
4180: 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43  eContent==FTS5_C
4190: 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b  ONTENT_NORMAL ){
41a0: 0a 20 20 20 20 20 20 7a 54 61 69 6c 20 3d 20 22  .      zTail = "
41b0: 63 6f 6e 74 65 6e 74 22 3b 0a 20 20 20 20 7d 65  content";.    }e
41c0: 6c 73 65 20 69 66 28 20 70 52 65 74 2d 3e 62 43  lse if( pRet->bC
41d0: 6f 6c 75 6d 6e 73 69 7a 65 20 29 7b 0a 20 20 20  olumnsize ){.   
41e0: 20 20 20 7a 54 61 69 6c 20 3d 20 22 64 6f 63 73     zTail = "docs
41f0: 69 7a 65 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize";.    }..   
4200: 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
4210: 20 20 20 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65      pRet->zConte
4220: 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  nt = sqlite3Fts5
4230: 4d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  Mprintf(.       
4240: 20 20 20 26 72 63 2c 20 22 25 51 2e 27 25 71 5f     &rc, "%Q.'%q_
4250: 25 73 27 22 2c 20 70 52 65 74 2d 3e 7a 44 62 2c  %s'", pRet->zDb,
4260: 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 54   pRet->zName, zT
4270: 61 69 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ail.      );.   
4280: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
4290: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
42a0: 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77  Ret->zContentRow
42b0: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65  id==0 ){.    pRe
42c0: 74 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64  t->zContentRowid
42d0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
42e0: 72 6e 64 75 70 28 26 72 63 2c 20 22 72 6f 77 69  rndup(&rc, "rowi
42f0: 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  d", -1);.  }..  
4300: 2f 2a 20 46 6f 72 6d 75 6c 61 74 65 20 74 68 65  /* Formulate the
4310: 20 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73   zContentExprlis
4320: 74 20 74 65 78 74 20 2a 2f 0a 20 20 69 66 28 20  t text */.  if( 
4330: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4340: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 43 6f  .    rc = fts5Co
4350: 6e 66 69 67 4d 61 6b 65 45 78 70 72 6c 69 73 74  nfigMakeExprlist
4360: 28 70 52 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pRet);.  }..  i
4370: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
4390: 74 73 35 43 6f 6e 66 69 67 46 72 65 65 28 70 52  ts5ConfigFree(pR
43a0: 65 74 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20  et);.    *ppOut 
43b0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
43c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
43d0: 72 65 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ree the configur
43e0: 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73  ation object pas
43f0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
4400: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
4410: 64 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  d sqlite3Fts5Con
4420: 66 69 67 46 72 65 65 28 46 74 73 35 43 6f 6e 66  figFree(Fts5Conf
4430: 69 67 20 2a 70 43 6f 6e 66 69 67 29 7b 0a 20 20  ig *pConfig){.  
4440: 69 66 28 20 70 43 6f 6e 66 69 67 20 29 7b 0a 20  if( pConfig ){. 
4450: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
4460: 28 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 20  ( pConfig->pTok 
4470: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  ){.      pConfig
4480: 2d 3e 70 54 6f 6b 41 70 69 2d 3e 78 44 65 6c 65  ->pTokApi->xDele
4490: 74 65 28 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b  te(pConfig->pTok
44a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
44b0: 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
44c0: 67 2d 3e 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c  g->zDb);.    sql
44d0: 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
44e0: 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  g->zName);.    f
44f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69  or(i=0; i<pConfi
4500: 67 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  g->nCol; i++){. 
4510: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4520: 65 28 70 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c  e(pConfig->azCol
4530: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
4540: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
4550: 6e 66 69 67 2d 3e 61 7a 43 6f 6c 29 3b 0a 20 20  nfig->azCol);.  
4560: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4570: 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 29  Config->aPrefix)
4580: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4590: 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e  ee(pConfig->zRan
45a0: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  k);.    sqlite3_
45b0: 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52  free(pConfig->zR
45c0: 61 6e 6b 41 72 67 73 29 3b 0a 20 20 20 20 73 71  ankArgs);.    sq
45d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
45e0: 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20  ig->zContent);. 
45f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4600: 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e  pConfig->zConten
4610: 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  tRowid);.    sql
4620: 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
4630: 67 2d 3e 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c  g->zContentExprl
4640: 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
4650: 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 29 3b  3_free(pConfig);
4660: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  .  }.}../*.** Ca
4670: 6c 6c 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  ll sqlite3_decla
4680: 72 65 5f 76 74 61 62 28 29 20 62 61 73 65 64 20  re_vtab() based 
4690: 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
46a0: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
46b0: 74 69 6f 6e 0a 2a 2a 20 6f 62 6a 65 63 74 20 70  tion.** object p
46c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
46d0: 79 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  y argument. Retu
46e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
46f0: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 0a 2a  successful, or.*
4700: 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
4710: 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
4720: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  or occurs..*/.in
4730: 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  t sqlite3Fts5Con
4740: 66 69 67 44 65 63 6c 61 72 65 56 74 61 62 28 46  figDeclareVtab(F
4750: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
4760: 69 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ig){.  int i;.  
4770: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4780: 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  OK;.  char *zSql
4790: 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  ;..  zSql = sqli
47a0: 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26  te3Fts5Mprintf(&
47b0: 72 63 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  rc, "CREATE TABL
47c0: 45 20 78 28 22 29 3b 0a 20 20 66 6f 72 28 69 3d  E x(");.  for(i=
47d0: 30 3b 20 7a 53 71 6c 20 26 26 20 69 3c 70 43 6f  0; zSql && i<pCo
47e0: 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  nfig->nCol; i++)
47f0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
4800: 20 2a 7a 53 65 70 20 3d 20 28 69 3d 3d 30 3f 22   *zSep = (i==0?"
4810: 22 3a 22 2c 20 22 29 3b 0a 20 20 20 20 7a 53 71  ":", ");.    zSq
4820: 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  l = sqlite3Fts5M
4830: 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25 7a 25  printf(&rc, "%z%
4840: 73 25 51 22 2c 20 7a 53 71 6c 2c 20 7a 53 65 70  s%Q", zSql, zSep
4850: 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c  , pConfig->azCol
4860: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  [i]);.  }.  zSql
4870: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70   = sqlite3Fts5Mp
4880: 72 69 6e 74 66 28 26 72 63 2c 20 22 25 7a 2c 20  rintf(&rc, "%z, 
4890: 25 51 20 48 49 44 44 45 4e 2c 20 25 73 20 48 49  %Q HIDDEN, %s HI
48a0: 44 44 45 4e 29 22 2c 20 0a 20 20 20 20 20 20 7a  DDEN)", .      z
48b0: 53 71 6c 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  Sql, pConfig->zN
48c0: 61 6d 65 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e  ame, FTS5_RANK_N
48d0: 41 4d 45 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  AME.  );..  asse
48e0: 72 74 28 20 7a 53 71 6c 20 7c 7c 20 72 63 3d 3d  rt( zSql || rc==
48f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
4900: 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20    if( zSql ){.  
4910: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
4920: 65 63 6c 61 72 65 5f 76 74 61 62 28 70 43 6f 6e  eclare_vtab(pCon
4930: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 29 3b 0a  fig->db, zSql);.
4940: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4950: 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 0a 20  (zSql);.  }.  . 
4960: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4970: 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 65 20 74 68  *.** Tokenize th
4980: 65 20 74 65 78 74 20 70 61 73 73 65 64 20 76 69  e text passed vi
4990: 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  a the second and
49a0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73   third arguments
49b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
49c0: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
49d0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f  once for each to
49e0: 6b 65 6e 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ken in the input
49f0: 20 74 65 78 74 2e 20 54 68 65 0a 2a 2a 20 61 72   text. The.** ar
4a00: 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
4a10: 6f 20 69 74 20 61 72 65 2c 20 69 6e 20 6f 72 64  o it are, in ord
4a20: 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 76 6f  er:.**.**     vo
4a30: 69 64 20 2a 70 43 74 78 20 20 20 20 20 20 20 20  id *pCtx        
4a40: 20 20 2f 2f 20 43 6f 70 79 20 6f 66 20 34 74 68    // Copy of 4th
4a50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
4a60: 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ite3Fts5Tokenize
4a70: 28 29 0a 2a 2a 20 20 20 20 20 63 6f 6e 73 74 20  ().**     const 
4a80: 63 68 61 72 20 2a 70 54 6f 6b 65 6e 20 20 2f 2f  char *pToken  //
4a90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
4aa0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f  er containing to
4ab0: 6b 65 6e 0a 2a 2a 20 20 20 20 20 69 6e 74 20 6e  ken.**     int n
4ac0: 54 6f 6b 65 6e 20 20 20 20 20 20 20 20 20 20 2f  Token          /
4ad0: 2f 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65 6e 20  / Size of token 
4ae0: 69 6e 20 62 79 74 65 73 0a 2a 2a 20 20 20 20 20  in bytes.**     
4af0: 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
4b00: 20 20 20 20 2f 2f 20 42 79 74 65 20 6f 66 66 73      // Byte offs
4b10: 65 74 20 6f 66 20 73 74 61 72 74 20 6f 66 20 74  et of start of t
4b20: 6f 6b 65 6e 20 77 69 74 68 69 6e 20 69 6e 70 75  oken within inpu
4b30: 74 20 74 65 78 74 0a 2a 2a 20 20 20 20 20 69 6e  t text.**     in
4b40: 74 20 69 45 6e 64 20 20 20 20 20 20 20 20 20 20  t iEnd          
4b50: 20 20 2f 2f 20 42 79 74 65 20 6f 66 66 73 65 74    // Byte offset
4b60: 20 6f 66 20 65 6e 64 20 6f 66 20 74 6f 6b 65 6e   of end of token
4b70: 20 77 69 74 68 69 6e 20 69 6e 70 75 74 20 74 65   within input te
4b80: 78 74 0a 2a 2a 20 20 20 20 20 69 6e 74 20 69 50  xt.**     int iP
4b90: 6f 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  os            //
4ba0: 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b   Position of tok
4bb0: 65 6e 20 69 6e 20 69 6e 70 75 74 20 28 66 69 72  en in input (fir
4bc0: 73 74 20 74 6f 6b 65 6e 20 69 73 20 30 29 0a 2a  st token is 0).*
4bd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  *.** If the call
4be0: 62 61 63 6b 20 72 65 74 75 72 6e 73 20 61 20 6e  back returns a n
4bf0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 74 68  on-zero value th
4c00: 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20 69  e tokenization i
4c10: 73 20 61 62 61 6e 64 6f 6e 65 64 0a 2a 2a 20 61  s abandoned.** a
4c20: 6e 64 20 6e 6f 20 66 75 72 74 68 65 72 20 63 61  nd no further ca
4c30: 6c 6c 62 61 63 6b 73 20 61 72 65 20 69 73 73 75  llbacks are issu
4c40: 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed. .**.** This 
4c50: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4c60: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
4c70: 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53  ccessful or an S
4c80: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
4c90: 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72 20  .** if an error 
4ca0: 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 74  occurs. If the t
4cb0: 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20 77 61 73 20  okenization was 
4cc0: 61 62 61 6e 64 6f 6e 65 64 20 65 61 72 6c 79 20  abandoned early 
4cd0: 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 63  because.** the c
4ce0: 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 65 64  allback returned
4cf0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2c 20 74 68   SQLITE_DONE, th
4d00: 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  is is not an err
4d10: 6f 72 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  or and this func
4d20: 74 69 6f 6e 0a 2a 2a 20 73 74 69 6c 6c 20 72 65  tion.** still re
4d30: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
4d40: 20 4f 72 2c 20 69 66 20 74 68 65 20 74 6f 6b 65   Or, if the toke
4d50: 6e 69 7a 61 74 69 6f 6e 20 77 61 73 20 61 62 61  nization was aba
4d60: 6e 64 6f 6e 65 64 20 65 61 72 6c 79 0a 2a 2a 20  ndoned early.** 
4d70: 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
4d80: 62 61 63 6b 20 72 65 74 75 72 6e 65 64 20 61 6e  back returned an
4d90: 6f 74 68 65 72 20 6e 6f 6e 2d 7a 65 72 6f 20 76  other non-zero v
4da0: 61 6c 75 65 2c 20 69 74 20 69 73 20 61 73 73 75  alue, it is assu
4db0: 6d 65 64 0a 2a 2a 20 74 6f 20 62 65 20 61 6e 20  med.** to be an 
4dc0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
4dd0: 65 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74  e and returned t
4de0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
4df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4e00: 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35  Tokenize(.  Fts5
4e10: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4e30: 54 53 35 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  TS5 Configuratio
4e40: 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  n object */.  in
4e50: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4e70: 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 2a   FTS5_TOKENIZE_*
4e80: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
4e90: 74 20 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69  t char *pText, i
4ea0: 6e 74 20 6e 54 65 78 74 2c 20 20 20 2f 2a 20 54  nt nText,   /* T
4eb0: 65 78 74 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20  ext to tokenize 
4ec0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  */.  void *pCtx,
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
4ef0: 70 61 73 73 65 64 20 74 6f 20 78 54 6f 6b 65 6e  passed to xToken
4f00: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 54  () */.  int (*xT
4f10: 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20 69 6e 74  oken)(void*, int
4f20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
4f30: 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 20 20 20  nt, int, int)   
4f40: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a   /* Callback */.
4f50: 29 7b 0a 20 20 69 66 28 20 70 54 65 78 74 3d 3d  ){.  if( pText==
4f60: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
4f70: 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 70  E_OK;.  return p
4f80: 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69 2d  Config->pTokApi-
4f90: 3e 78 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 20 20  >xTokenize(.    
4fa0: 20 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 2c    pConfig->pTok,
4fb0: 20 70 43 74 78 2c 20 66 6c 61 67 73 2c 20 70 54   pCtx, flags, pT
4fc0: 65 78 74 2c 20 6e 54 65 78 74 2c 20 78 54 6f 6b  ext, nText, xTok
4fd0: 65 6e 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  en.  );.}../*.**
4fe0: 20 41 72 67 75 6d 65 6e 74 20 70 49 6e 20 70 6f   Argument pIn po
4ff0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
5000: 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 77  t character in w
5010: 68 61 74 20 69 73 20 65 78 70 65 63 74 65 64 20  hat is expected 
5020: 74 6f 20 62 65 0a 2a 2a 20 61 20 63 6f 6d 6d 61  to be.** a comma
5030: 2d 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 20  -separated list 
5040: 6f 66 20 53 51 4c 20 6c 69 74 65 72 61 6c 73 20  of SQL literals 
5050: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 27 29  followed by a ')
5060: 27 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 20  ' character..** 
5070: 49 66 20 69 74 20 61 63 74 75 61 6c 6c 79 20 69  If it actually i
5080: 73 20 74 68 69 73 2c 20 72 65 74 75 72 6e 20 61  s this, return a
5090: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
50a0: 27 29 27 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ')'. Otherwise, 
50b0: 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 74  return.** NULL t
50c0: 6f 20 69 6e 64 69 63 61 74 65 20 61 20 70 61 72  o indicate a par
50d0: 73 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  se error..*/.sta
50e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
50f0: 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 41 72  fts5ConfigSkipAr
5100: 67 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  gs(const char *p
5110: 49 6e 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  In){.  const cha
5120: 72 20 2a 70 20 3d 20 70 49 6e 3b 0a 20 20 0a 20  r *p = pIn;.  . 
5130: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
5140: 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53   p = fts5ConfigS
5150: 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29  kipWhitespace(p)
5160: 3b 0a 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f  ;.    p = fts5Co
5170: 6e 66 69 67 53 6b 69 70 4c 69 74 65 72 61 6c 28  nfigSkipLiteral(
5180: 70 29 3b 0a 20 20 20 20 70 20 3d 20 66 74 73 35  p);.    p = fts5
5190: 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73  ConfigSkipWhites
51a0: 70 61 63 65 28 70 29 3b 0a 20 20 20 20 69 66 28  pace(p);.    if(
51b0: 20 70 3d 3d 30 20 7c 7c 20 2a 70 3d 3d 27 29 27   p==0 || *p==')'
51c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
51d0: 28 20 2a 70 21 3d 27 2c 27 20 29 7b 0a 20 20 20  ( *p!=',' ){.   
51e0: 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20     p = 0;.      
51f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5200: 20 70 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   p++;.  }..  ret
5210: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
5220: 50 61 72 61 6d 65 74 65 72 20 7a 49 6e 20 63 6f  Parameter zIn co
5230: 6e 74 61 69 6e 73 20 61 20 72 61 6e 6b 28 29 20  ntains a rank() 
5240: 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69  function specifi
5250: 63 61 74 69 6f 6e 2e 20 54 68 65 20 66 6f 72 6d  cation. The form
5260: 61 74 20 6f 66 20 0a 2a 2a 20 74 68 69 73 20 69  at of .** this i
5270: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 42 61 72  s:.**.**   + Bar
5280: 65 77 6f 72 64 20 28 66 75 6e 63 74 69 6f 6e 20  eword (function 
5290: 6e 61 6d 65 29 0a 2a 2a 20 20 20 2b 20 4f 70 65  name).**   + Ope
52a0: 6e 20 70 61 72 65 6e 74 68 65 73 69 73 20 2d 20  n parenthesis - 
52b0: 22 28 22 0a 2a 2a 20 20 20 2b 20 5a 65 72 6f 20  "(".**   + Zero 
52c0: 6f 72 20 6d 6f 72 65 20 53 51 4c 20 6c 69 74 65  or more SQL lite
52d0: 72 61 6c 73 20 69 6e 20 61 20 63 6f 6d 6d 61 20  rals in a comma 
52e0: 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 0a 2a  separated list.*
52f0: 2a 20 20 20 2b 20 43 6c 6f 73 65 20 70 61 72 65  *   + Close pare
5300: 6e 74 68 65 73 69 73 20 2d 20 22 29 22 0a 2a 2f  nthesis - ")".*/
5310: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
5320: 43 6f 6e 66 69 67 50 61 72 73 65 52 61 6e 6b 28  ConfigParseRank(
5330: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5340: 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  In,             
5350: 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69     /* Input stri
5360: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ng */.  char **p
5370: 7a 52 61 6e 6b 2c 20 20 20 20 20 20 20 20 20 20  zRank,          
5380: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
5390: 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 6e 61  Rank function na
53a0: 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  me */.  char **p
53b0: 7a 52 61 6e 6b 41 72 67 73 20 20 20 20 20 20 20  zRankArgs       
53c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
53d0: 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 61 72  Rank function ar
53e0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
53f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
5400: 7a 49 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  zIn;.  const cha
5410: 72 20 2a 70 52 61 6e 6b 3b 0a 20 20 63 68 61 72  r *pRank;.  char
5420: 20 2a 7a 52 61 6e 6b 20 3d 20 30 3b 0a 20 20 63   *zRank = 0;.  c
5430: 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73 20 3d  har *zRankArgs =
5440: 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
5450: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2a 70 7a  QLITE_OK;..  *pz
5460: 52 61 6e 6b 20 3d 20 30 3b 0a 20 20 2a 70 7a 52  Rank = 0;.  *pzR
5470: 61 6e 6b 41 72 67 73 20 3d 20 30 3b 0a 0a 20 20  ankArgs = 0;..  
5480: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
5490: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
54a0: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
54b0: 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  p = fts5ConfigSk
54c0: 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b  ipWhitespace(p);
54d0: 0a 20 20 20 20 70 52 61 6e 6b 20 3d 20 70 3b 0a  .    pRank = p;.
54e0: 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66      p = fts5Conf
54f0: 69 67 53 6b 69 70 42 61 72 65 77 6f 72 64 28 70  igSkipBareword(p
5500: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 20 29 7b  );..    if( p ){
5510: 0a 20 20 20 20 20 20 7a 52 61 6e 6b 20 3d 20 73  .      zRank = s
5520: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
5530: 5a 65 72 6f 28 26 72 63 2c 20 31 20 2b 20 70 20  Zero(&rc, 1 + p 
5540: 2d 20 70 52 61 6e 6b 29 3b 0a 20 20 20 20 20 20  - pRank);.      
5550: 69 66 28 20 7a 52 61 6e 6b 20 29 20 6d 65 6d 63  if( zRank ) memc
5560: 70 79 28 7a 52 61 6e 6b 2c 20 70 52 61 6e 6b 2c  py(zRank, pRank,
5570: 20 70 2d 70 52 61 6e 6b 29 3b 0a 20 20 20 20 7d   p-pRank);.    }
5580: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
5590: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
55a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
55b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
55c0: 20 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e       p = fts5Con
55d0: 66 69 67 53 6b 69 70 57 68 69 74 65 73 70 61 63  figSkipWhitespac
55e0: 65 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e(p);.      if( 
55f0: 2a 70 21 3d 27 28 27 20 29 20 72 63 20 3d 20 53  *p!='(' ) rc = S
5600: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
5610: 20 20 20 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     p++;.    }.  
5620: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5630: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  _OK ){.      con
5640: 73 74 20 63 68 61 72 20 2a 70 41 72 67 73 3b 20  st char *pArgs; 
5650: 0a 20 20 20 20 20 20 70 20 3d 20 66 74 73 35 43  .      p = fts5C
5660: 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73 70  onfigSkipWhitesp
5670: 61 63 65 28 70 29 3b 0a 20 20 20 20 20 20 70 41  ace(p);.      pA
5680: 72 67 73 20 3d 20 70 3b 0a 20 20 20 20 20 20 69  rgs = p;.      i
5690: 66 28 20 2a 70 21 3d 27 29 27 20 29 7b 0a 20 20  f( *p!=')' ){.  
56a0: 20 20 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f        p = fts5Co
56b0: 6e 66 69 67 53 6b 69 70 41 72 67 73 28 70 29 3b  nfigSkipArgs(p);
56c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 3d 3d  .        if( p==
56d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
56e0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
56f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5700: 0a 20 20 20 20 20 20 20 20 20 20 7a 52 61 6e 6b  .          zRank
5710: 41 72 67 73 20 3d 20 73 71 6c 69 74 65 33 46 74  Args = sqlite3Ft
5720: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
5730: 2c 20 31 20 2b 20 70 20 2d 20 70 41 72 67 73 29  , 1 + p - pArgs)
5740: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5750: 7a 52 61 6e 6b 41 72 67 73 20 29 20 6d 65 6d 63  zRankArgs ) memc
5760: 70 79 28 7a 52 61 6e 6b 41 72 67 73 2c 20 70 41  py(zRankArgs, pA
5770: 72 67 73 2c 20 70 2d 70 41 72 67 73 29 3b 0a 20  rgs, p-pArgs);. 
5780: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
57a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
57b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
57c0: 72 65 65 28 7a 52 61 6e 6b 29 3b 0a 20 20 20 20  ree(zRank);.    
57d0: 61 73 73 65 72 74 28 20 7a 52 61 6e 6b 41 72 67  assert( zRankArg
57e0: 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
57f0: 0a 20 20 20 20 2a 70 7a 52 61 6e 6b 20 3d 20 7a  .    *pzRank = z
5800: 52 61 6e 6b 3b 0a 20 20 20 20 2a 70 7a 52 61 6e  Rank;.    *pzRan
5810: 6b 41 72 67 73 20 3d 20 7a 52 61 6e 6b 41 72 67  kArgs = zRankArg
5820: 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  s;.  }.  return 
5830: 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
5840: 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74 56  e3Fts5ConfigSetV
5850: 61 6c 75 65 28 0a 20 20 46 74 73 35 43 6f 6e 66  alue(.  Fts5Conf
5860: 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
5870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
5880: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
5890: 75 65 20 2a 70 56 61 6c 2c 0a 20 20 69 6e 74 20  ue *pVal,.  int 
58a0: 2a 70 62 42 61 64 6b 65 79 0a 29 7b 0a 20 20 69  *pbBadkey.){.  i
58b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
58c0: 4b 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c  K;..  if( 0==sql
58d0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65  ite3_stricmp(zKe
58e0: 79 2c 20 22 70 67 73 7a 22 29 20 29 7b 0a 20 20  y, "pgsz") ){.  
58f0: 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30 3b 0a    int pgsz = 0;.
5900: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 49      if( SQLITE_I
5910: 4e 54 45 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f  NTEGER==sqlite3_
5920: 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79  value_numeric_ty
5930: 70 65 28 70 56 61 6c 29 20 29 7b 0a 20 20 20 20  pe(pVal) ){.    
5940: 20 20 70 67 73 7a 20 3d 20 73 71 6c 69 74 65 33    pgsz = sqlite3
5950: 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29  _value_int(pVal)
5960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5970: 70 67 73 7a 3c 3d 30 20 7c 7c 20 70 67 73 7a 3e  pgsz<=0 || pgsz>
5980: 46 54 53 35 5f 4d 41 58 5f 50 41 47 45 5f 53 49  FTS5_MAX_PAGE_SI
5990: 5a 45 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 42  ZE ){.      *pbB
59a0: 61 64 6b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  adkey = 1;.    }
59b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 6f 6e  else{.      pCon
59c0: 66 69 67 2d 3e 70 67 73 7a 20 3d 20 70 67 73 7a  fig->pgsz = pgsz
59d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
59e0: 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  lse if( 0==sqlit
59f0: 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c  e3_stricmp(zKey,
5a00: 20 22 68 61 73 68 73 69 7a 65 22 29 20 29 7b 0a   "hashsize") ){.
5a10: 20 20 20 20 69 6e 74 20 6e 48 61 73 68 53 69 7a      int nHashSiz
5a20: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  e = -1;.    if( 
5a30: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3d 3d  SQLITE_INTEGER==
5a40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75  sqlite3_value_nu
5a50: 6d 65 72 69 63 5f 74 79 70 65 28 70 56 61 6c 29  meric_type(pVal)
5a60: 20 29 7b 0a 20 20 20 20 20 20 6e 48 61 73 68 53   ){.      nHashS
5a70: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ize = sqlite3_va
5a80: 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0a 20  lue_int(pVal);. 
5a90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 48 61     }.    if( nHa
5aa0: 73 68 53 69 7a 65 3c 3d 30 20 29 7b 0a 20 20 20  shSize<=0 ){.   
5ab0: 20 20 20 2a 70 62 42 61 64 6b 65 79 20 3d 20 31     *pbBadkey = 1
5ac0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5ad0: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 48 61 73     pConfig->nHas
5ae0: 68 53 69 7a 65 20 3d 20 6e 48 61 73 68 53 69 7a  hSize = nHashSiz
5af0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  e;.    }.  }..  
5b00: 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69  else if( 0==sqli
5b10: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79  te3_stricmp(zKey
5b20: 2c 20 22 61 75 74 6f 6d 65 72 67 65 22 29 20 29  , "automerge") )
5b30: 7b 0a 20 20 20 20 69 6e 74 20 6e 41 75 74 6f 6d  {.    int nAutom
5b40: 65 72 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69  erge = -1;.    i
5b50: 66 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  f( SQLITE_INTEGE
5b60: 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  R==sqlite3_value
5b70: 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56  _numeric_type(pV
5b80: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 6e 41 75  al) ){.      nAu
5b90: 74 6f 6d 65 72 67 65 20 3d 20 73 71 6c 69 74 65  tomerge = sqlite
5ba0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
5bb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5bc0: 20 6e 41 75 74 6f 6d 65 72 67 65 3c 30 20 7c 7c   nAutomerge<0 ||
5bd0: 20 6e 41 75 74 6f 6d 65 72 67 65 3e 36 34 20 29   nAutomerge>64 )
5be0: 7b 0a 20 20 20 20 20 20 2a 70 62 42 61 64 6b 65  {.      *pbBadke
5bf0: 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
5c00: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 75 74  {.      if( nAut
5c10: 6f 6d 65 72 67 65 3d 3d 31 20 29 20 6e 41 75 74  omerge==1 ) nAut
5c20: 6f 6d 65 72 67 65 20 3d 20 46 54 53 35 5f 44 45  omerge = FTS5_DE
5c30: 46 41 55 4c 54 5f 41 55 54 4f 4d 45 52 47 45 3b  FAULT_AUTOMERGE;
5c40: 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e  .      pConfig->
5c50: 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 6e 41 75  nAutomerge = nAu
5c60: 74 6f 6d 65 72 67 65 3b 0a 20 20 20 20 7d 0a 20  tomerge;.    }. 
5c70: 20 7d 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 30   }..  else if( 0
5c80: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5c90: 70 28 7a 4b 65 79 2c 20 22 75 73 65 72 6d 65 72  p(zKey, "usermer
5ca0: 67 65 22 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ge") ){.    int 
5cb0: 6e 55 73 65 72 6d 65 72 67 65 20 3d 20 2d 31 3b  nUsermerge = -1;
5cc0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
5cd0: 49 4e 54 45 47 45 52 3d 3d 73 71 6c 69 74 65 33  INTEGER==sqlite3
5ce0: 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74  _value_numeric_t
5cf0: 79 70 65 28 70 56 61 6c 29 20 29 7b 0a 20 20 20  ype(pVal) ){.   
5d00: 20 20 20 6e 55 73 65 72 6d 65 72 67 65 20 3d 20     nUsermerge = 
5d10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
5d20: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
5d30: 20 20 20 69 66 28 20 6e 55 73 65 72 6d 65 72 67     if( nUsermerg
5d40: 65 3c 32 20 7c 7c 20 6e 55 73 65 72 6d 65 72 67  e<2 || nUsermerg
5d50: 65 3e 31 36 20 29 7b 0a 20 20 20 20 20 20 2a 70  e>16 ){.      *p
5d60: 62 42 61 64 6b 65 79 20 3d 20 31 3b 0a 20 20 20  bBadkey = 1;.   
5d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
5d80: 6f 6e 66 69 67 2d 3e 6e 55 73 65 72 6d 65 72 67  onfig->nUsermerg
5d90: 65 20 3d 20 6e 55 73 65 72 6d 65 72 67 65 3b 0a  e = nUsermerge;.
5da0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 6c 73      }.  }..  els
5db0: 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
5dc0: 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22  _stricmp(zKey, "
5dd0: 63 72 69 73 69 73 6d 65 72 67 65 22 29 20 29 7b  crisismerge") ){
5de0: 0a 20 20 20 20 69 6e 74 20 6e 43 72 69 73 69 73  .    int nCrisis
5df0: 4d 65 72 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20  Merge = -1;.    
5e00: 69 66 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  if( SQLITE_INTEG
5e10: 45 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ER==sqlite3_valu
5e20: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70  e_numeric_type(p
5e30: 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 6e 43  Val) ){.      nC
5e40: 72 69 73 69 73 4d 65 72 67 65 20 3d 20 73 71 6c  risisMerge = sql
5e50: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
5e60: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
5e70: 69 66 28 20 6e 43 72 69 73 69 73 4d 65 72 67 65  if( nCrisisMerge
5e80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 42  <0 ){.      *pbB
5e90: 61 64 6b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  adkey = 1;.    }
5ea0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
5eb0: 6e 43 72 69 73 69 73 4d 65 72 67 65 3c 3d 31 20  nCrisisMerge<=1 
5ec0: 29 20 6e 43 72 69 73 69 73 4d 65 72 67 65 20 3d  ) nCrisisMerge =
5ed0: 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 43 52   FTS5_DEFAULT_CR
5ee0: 49 53 49 53 4d 45 52 47 45 3b 0a 20 20 20 20 20  ISISMERGE;.     
5ef0: 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69   pConfig->nCrisi
5f00: 73 4d 65 72 67 65 20 3d 20 6e 43 72 69 73 69 73  sMerge = nCrisis
5f10: 4d 65 72 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  Merge;.    }.  }
5f20: 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d  ..  else if( 0==
5f30: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5f40: 7a 4b 65 79 2c 20 22 72 61 6e 6b 22 29 20 29 7b  zKey, "rank") ){
5f50: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5f60: 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zIn = (const ch
5f70: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5f80: 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20  e_text(pVal);.  
5f90: 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 3b 0a 20    char *zRank;. 
5fa0: 20 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72     char *zRankAr
5fb0: 67 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  gs;.    rc = sql
5fc0: 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61  ite3Fts5ConfigPa
5fd0: 72 73 65 52 61 6e 6b 28 7a 49 6e 2c 20 26 7a 52  rseRank(zIn, &zR
5fe0: 61 6e 6b 2c 20 26 7a 52 61 6e 6b 41 72 67 73 29  ank, &zRankArgs)
5ff0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
6000: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6010: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
6020: 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 29 3b 0a 20  onfig->zRank);. 
6030: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6040: 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b  e(pConfig->zRank
6050: 41 72 67 73 29 3b 0a 20 20 20 20 20 20 70 43 6f  Args);.      pCo
6060: 6e 66 69 67 2d 3e 7a 52 61 6e 6b 20 3d 20 7a 52  nfig->zRank = zR
6070: 61 6e 6b 3b 0a 20 20 20 20 20 20 70 43 6f 6e 66  ank;.      pConf
6080: 69 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 20 3d 20  ig->zRankArgs = 
6090: 7a 52 61 6e 6b 41 72 67 73 3b 0a 20 20 20 20 7d  zRankArgs;.    }
60a0: 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
60b0: 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  ITE_ERROR ){.   
60c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
60d0: 4b 3b 0a 20 20 20 20 20 20 2a 70 62 42 61 64 6b  K;.      *pbBadk
60e0: 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ey = 1;.    }.  
60f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 62 42 61  }else{.    *pbBa
6100: 64 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  dkey = 1;.  }.  
6110: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6120: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e  .** Load the con
6130: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63  tents of the %_c
6140: 6f 6e 66 69 67 20 74 61 62 6c 65 20 69 6e 74 6f  onfig table into
6150: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20   memory..*/.int 
6160: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
6170: 67 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66 69 67  gLoad(Fts5Config
6180: 20 2a 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20 69   *pConfig, int i
6190: 43 6f 6f 6b 69 65 29 7b 0a 20 20 63 6f 6e 73 74  Cookie){.  const
61a0: 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 20 3d   char *zSelect =
61b0: 20 22 53 45 4c 45 43 54 20 6b 2c 20 76 20 46 52   "SELECT k, v FR
61c0: 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 66 69 67  OM %Q.'%q_config
61d0: 27 22 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  '";.  char *zSql
61e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
61f0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   *p = 0;.  int r
6200: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6210: 20 69 6e 74 20 69 56 65 72 73 69 6f 6e 20 3d 20   int iVersion = 
6220: 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 64 65 66  0;..  /* Set def
6230: 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  ault values */. 
6240: 20 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 3d   pConfig->pgsz =
6250: 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 50 41   FTS5_DEFAULT_PA
6260: 47 45 5f 53 49 5a 45 3b 0a 20 20 70 43 6f 6e 66  GE_SIZE;.  pConf
6270: 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 3d  ig->nAutomerge =
6280: 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 41 55   FTS5_DEFAULT_AU
6290: 54 4f 4d 45 52 47 45 3b 0a 20 20 70 43 6f 6e 66  TOMERGE;.  pConf
62a0: 69 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65 20 3d  ig->nUsermerge =
62b0: 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 55 53   FTS5_DEFAULT_US
62c0: 45 52 4d 45 52 47 45 3b 0a 20 20 70 43 6f 6e 66  ERMERGE;.  pConf
62d0: 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65  ig->nCrisisMerge
62e0: 20 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f   = FTS5_DEFAULT_
62f0: 43 52 49 53 49 53 4d 45 52 47 45 3b 0a 20 20 70  CRISISMERGE;.  p
6300: 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a  Config->nHashSiz
6310: 65 20 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54  e = FTS5_DEFAULT
6320: 5f 48 41 53 48 53 49 5a 45 3b 0a 0a 20 20 7a 53  _HASHSIZE;..  zS
6330: 71 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  ql = sqlite3Fts5
6340: 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 7a 53 65  Mprintf(&rc, zSe
6350: 6c 65 63 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  lect, pConfig->z
6360: 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
6370: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 20  me);.  if( zSql 
6380: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
6390: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
63a0: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c  Config->db, zSql
63b0: 2c 20 2d 31 2c 20 26 70 2c 20 30 29 3b 0a 20 20  , -1, &p, 0);.  
63c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
63d0: 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Sql);.  }..  ass
63e0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
63f0: 4f 4b 20 7c 7c 20 70 3d 3d 30 20 29 3b 0a 20 20  OK || p==0 );.  
6400: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6410: 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  K ){.    while( 
6420: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
6430: 74 65 33 5f 73 74 65 70 28 70 29 20 29 7b 0a 20  te3_step(p) ){. 
6440: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
6450: 2a 7a 4b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  *zK = (const cha
6460: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
6470: 6e 5f 74 65 78 74 28 70 2c 20 30 29 3b 0a 20 20  n_text(p, 0);.  
6480: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6490: 65 20 2a 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  e *pVal = sqlite
64a0: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
64b0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
64c0: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
64d0: 6d 70 28 7a 4b 2c 20 22 76 65 72 73 69 6f 6e 22  mp(zK, "version"
64e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 56 65  ) ){.        iVe
64f0: 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  rsion = sqlite3_
6500: 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b  value_int(pVal);
6510: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6520: 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
6530: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
6540: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 53  lite3Fts5ConfigS
6550: 65 74 56 61 6c 75 65 28 70 43 6f 6e 66 69 67 2c  etValue(pConfig,
6560: 20 7a 4b 2c 20 70 56 61 6c 2c 20 26 62 44 75 6d   zK, pVal, &bDum
6570: 6d 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  my);.      }.   
6580: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
6590: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 29 3b  te3_finalize(p);
65a0: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
65b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
65c0: 56 65 72 73 69 6f 6e 21 3d 46 54 53 35 5f 43 55  Version!=FTS5_CU
65d0: 52 52 45 4e 54 5f 56 45 52 53 49 4f 4e 20 29 7b  RRENT_VERSION ){
65e0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
65f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
6600: 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73  pConfig->pzErrms
6610: 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
6620: 74 28 20 30 3d 3d 2a 70 43 6f 6e 66 69 67 2d 3e  t( 0==*pConfig->
6630: 70 7a 45 72 72 6d 73 67 20 29 3b 0a 20 20 20 20  pzErrmsg );.    
6640: 20 20 2a 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72    *pConfig->pzEr
6650: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
6660: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
6670: 20 20 22 69 6e 76 61 6c 69 64 20 66 74 73 35 20    "invalid fts5 
6680: 66 69 6c 65 20 66 6f 72 6d 61 74 20 28 66 6f 75  file format (fou
6690: 6e 64 20 25 64 2c 20 65 78 70 65 63 74 65 64 20  nd %d, expected 
66a0: 25 64 29 20 2d 20 72 75 6e 20 27 72 65 62 75 69  %d) - run 'rebui
66b0: 6c 64 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld'",.          
66c0: 69 56 65 72 73 69 6f 6e 2c 20 46 54 53 35 5f 43  iVersion, FTS5_C
66d0: 55 52 52 45 4e 54 5f 56 45 52 53 49 4f 4e 0a 20  URRENT_VERSION. 
66e0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
66f0: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
6700: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
6710: 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 20 3d  onfig->iCookie =
6720: 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 7d 0a 20 20   iCookie;.  }.  
6730: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.