/ Hex Artifact Content
Login

Artifact 8e57fbe8c4fe2f1800f9190fd361231cb8558407:


0000: 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 61 6e  /*.** Compile an
0010: 64 20 72 75 6e 20 74 68 69 73 20 73 74 61 6e 64  d run this stand
0020: 61 6c 6f 6e 65 20 70 72 6f 67 72 61 6d 20 69 6e  alone program in
0030: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
0040: 74 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  te code that.** 
0050: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 66 75 6e  implements a fun
0060: 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
0070: 74 72 61 6e 73 6c 61 74 65 20 61 6c 70 68 61 62  translate alphab
0080: 65 74 69 63 20 69 64 65 6e 74 69 66 69 65 72 73  etic identifiers
0090: 20 69 6e 74 6f 0a 2a 2a 20 70 61 72 73 65 72 20   into.** parser 
00a0: 74 6f 6b 65 6e 20 63 6f 64 65 73 2e 0a 2a 2f 0a  token codes..*/.
00b0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
00c0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
00d0: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
00e0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 0a 2f 2a 0a 2a  <stdlib.h>../*.*
00f0: 2a 20 41 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  * A header comme
0100: 6e 74 20 70 6c 61 63 65 64 20 61 74 20 74 68 65  nt placed at the
0110: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 67 65   beginning of ge
0120: 6e 65 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2f  nerated code..*/
0130: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
0140: 61 72 20 7a 48 64 72 5b 5d 20 3d 20 0a 20 20 22  ar zHdr[] = .  "
0150: 2f 2a 2a 2a 2a 2a 20 54 68 69 73 20 66 69 6c 65  /***** This file
0160: 20 63 6f 6e 74 61 69 6e 73 20 61 75 74 6f 6d 61   contains automa
0170: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
0180: 64 20 63 6f 64 65 20 2a 2a 2a 2a 2a 2a 5c 6e 22  d code ******\n"
0190: 0a 20 20 22 2a 2a 5c 6e 22 0a 20 20 22 2a 2a 20  .  "**\n".  "** 
01a0: 54 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  The code in this
01b0: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61   file has been a
01c0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
01d0: 65 72 61 74 65 64 20 62 79 5c 6e 22 0a 20 20 22  erated by\n".  "
01e0: 2a 2a 5c 6e 22 0a 20 20 22 2a 2a 20 20 20 20 20  **\n".  "**     
01f0: 24 48 65 61 64 65 72 3a 20 2f 68 6f 6d 65 2f 64  $Header: /home/d
0200: 72 68 2f 73 71 6c 69 74 65 2f 74 72 61 6e 73 2f  rh/sqlite/trans/
0210: 63 76 73 2f 73 71 6c 69 74 65 2f 73 71 6c 69 74  cvs/sqlite/sqlit
0220: 65 2f 74 6f 6f 6c 2f 6d 6b 6b 65 79 77 6f 72 64  e/tool/mkkeyword
0230: 68 61 73 68 2e 63 2c 76 20 31 2e 33 37 20 32 30  hash.c,v 1.37 20
0240: 30 39 2f 30 32 2f 30 31 20 30 30 3a 30 30 3a 34  09/02/01 00:00:4
0250: 36 20 64 72 68 20 45 78 70 20 24 5c 6e 22 0a 20  6 drh Exp $\n". 
0260: 20 22 2a 2a 5c 6e 22 0a 20 20 22 2a 2a 20 54 68   "**\n".  "** Th
0270: 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  e code in this f
0280: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ile implements a
0290: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64   function that d
02a0: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
02b0: 72 5c 6e 22 0a 20 20 22 2a 2a 20 6f 72 20 6e 6f  r\n".  "** or no
02c0: 74 20 61 20 67 69 76 65 6e 20 69 64 65 6e 74 69  t a given identi
02d0: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 61  fier is really a
02e0: 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2e 20 20  n SQL keyword.  
02f0: 54 68 65 20 73 61 6d 65 20 74 68 69 6e 67 5c 6e  The same thing\n
0300: 22 0a 20 20 22 2a 2a 20 6d 69 67 68 74 20 62 65  ".  "** might be
0310: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 6d 6f 72   implemented mor
0320: 65 20 64 69 72 65 63 74 6c 79 20 75 73 69 6e 67  e directly using
0330: 20 61 20 68 61 6e 64 2d 77 72 69 74 74 65 6e 20   a hand-written 
0340: 68 61 73 68 20 74 61 62 6c 65 2e 5c 6e 22 0a 20  hash table.\n". 
0350: 20 22 2a 2a 20 42 75 74 20 62 79 20 75 73 69 6e   "** But by usin
0360: 67 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63  g this automatic
0370: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63  ally generated c
0380: 6f 64 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66  ode, the size of
0390: 20 74 68 65 20 63 6f 64 65 5c 6e 22 0a 20 20 22   the code\n".  "
03a0: 2a 2a 20 69 73 20 73 75 62 73 74 61 6e 74 69 61  ** is substantia
03b0: 6c 6c 79 20 72 65 64 75 63 65 64 2e 20 20 54 68  lly reduced.  Th
03c0: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
03d0: 66 6f 72 20 65 6d 62 65 64 64 65 64 20 61 70 70  for embedded app
03e0: 6c 69 63 61 74 69 6f 6e 73 5c 6e 22 0a 20 20 22  lications\n".  "
03f0: 2a 2a 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  ** on platforms 
0400: 77 69 74 68 20 6c 69 6d 69 74 65 64 20 6d 65 6d  with limited mem
0410: 6f 72 79 2e 5c 6e 22 0a 20 20 22 2a 2f 5c 6e 22  ory.\n".  "*/\n"
0420: 0a 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 74 68  .;../*.** All th
0430: 65 20 6b 65 79 77 6f 72 64 73 20 6f 66 20 74 68  e keywords of th
0440: 65 20 53 51 4c 20 6c 61 6e 67 75 61 67 65 20 61  e SQL language a
0450: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 68  re stored in a h
0460: 61 73 68 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6d  ash.** table com
0470: 70 6f 73 65 64 20 6f 66 20 69 6e 73 74 61 6e 63  posed of instanc
0480: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
0490: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
04a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
04b0: 20 4b 65 79 77 6f 72 64 20 4b 65 79 77 6f 72 64   Keyword Keyword
04c0: 3b 0a 73 74 72 75 63 74 20 4b 65 79 77 6f 72 64  ;.struct Keyword
04d0: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65   {.  char *zName
04e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
04f0: 20 6b 65 79 77 6f 72 64 20 6e 61 6d 65 20 2a 2f   keyword name */
0500: 0a 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 54  .  char *zTokenT
0510: 79 70 65 3b 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ype;    /* Token
0520: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
0530: 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 69 6e 74  keyword */.  int
0540: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
0550: 20 20 2f 2a 20 43 6f 64 65 20 74 68 69 73 20 6b    /* Code this k
0560: 65 79 77 6f 72 64 20 69 66 20 6e 6f 6e 2d 7a 65  eyword if non-ze
0570: 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 64 3b 20  ro */.  int id; 
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0590: 55 6e 69 71 75 65 20 49 44 20 66 6f 72 20 74 68  Unique ID for th
05a0: 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  is record */.  i
05b0: 6e 74 20 68 61 73 68 3b 20 20 20 20 20 20 20 20  nt hash;        
05c0: 20 20 20 20 2f 2a 20 48 61 73 68 20 6f 6e 20 74      /* Hash on t
05d0: 68 65 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  he keyword */.  
05e0: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
05f0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
0600: 6f 20 73 74 61 72 74 20 6f 66 20 6e 61 6d 65 20  o start of name 
0610: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  string */.  int 
0620: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
0630: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
0640: 69 73 20 6b 65 79 77 6f 72 64 2c 20 6e 6f 74 20  is keyword, not 
0650: 63 6f 75 6e 74 69 6e 67 20 66 69 6e 61 6c 20 5c  counting final \
0660: 30 30 30 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65  000 */.  int pre
0670: 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  fix;          /*
0680: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
0690: 63 74 65 72 73 20 69 6e 20 70 72 65 66 69 78 20  cters in prefix 
06a0: 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6e 67 65 73 74  */.  int longest
06b0: 53 75 66 66 69 78 3b 20 20 20 2f 2a 20 4c 6f 6e  Suffix;   /* Lon
06c0: 67 65 73 74 20 73 75 66 66 69 78 20 74 68 61 74  gest suffix that
06d0: 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 6e 20   is a prefix on 
06e0: 61 6e 6f 74 68 65 72 20 77 6f 72 64 20 2a 2f 0a  another word */.
06f0: 20 20 69 6e 74 20 69 4e 65 78 74 3b 20 20 20 20    int iNext;    
0700: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
0710: 69 6e 20 61 4b 65 79 77 6f 72 64 54 61 62 6c 65  in aKeywordTable
0720: 5b 5d 20 6f 66 20 6e 65 78 74 20 77 69 74 68 20  [] of next with 
0730: 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 69  same hash */.  i
0740: 6e 74 20 73 75 62 73 74 72 49 64 3b 20 20 20 20  nt substrId;    
0750: 20 20 20 20 2f 2a 20 49 64 20 74 6f 20 61 6e 6f      /* Id to ano
0760: 74 68 65 72 20 6b 65 79 77 6f 72 64 20 74 68 69  ther keyword thi
0770: 73 20 6b 65 79 77 6f 72 64 20 69 73 20 65 6d 62  s keyword is emb
0780: 65 64 64 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  edded in */.  in
0790: 74 20 73 75 62 73 74 72 4f 66 66 73 65 74 3b 20  t substrOffset; 
07a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
07b0: 6f 20 73 75 62 73 74 72 49 64 20 66 6f 72 20 73  o substrId for s
07c0: 74 61 72 74 20 6f 66 20 74 68 69 73 20 6b 65 79  tart of this key
07d0: 77 6f 72 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  word */.};../*.*
07e0: 2a 20 44 65 66 69 6e 65 20 6d 61 73 6b 73 20 75  * Define masks u
07f0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
0800: 20 77 68 69 63 68 20 6b 65 79 77 6f 72 64 73 20   which keywords 
0810: 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2f 0a 23  are allowed.*/.#
0820: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
0830: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 23 20 20  T_ALTERTABLE.#  
0840: 64 65 66 69 6e 65 20 41 4c 54 45 52 20 20 20 20  define ALTER    
0850: 20 20 30 0a 23 65 6c 73 65 0a 23 20 20 64 65 66    0.#else.#  def
0860: 69 6e 65 20 41 4c 54 45 52 20 20 20 20 20 20 30  ine ALTER      0
0870: 78 30 30 30 30 30 30 30 31 0a 23 65 6e 64 69 66  x00000001.#endif
0880: 0a 23 64 65 66 69 6e 65 20 41 4c 57 41 59 53 20  .#define ALWAYS 
0890: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 32        0x00000002
08a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
08b0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 23 20 20 64  MIT_ANALYZE.#  d
08c0: 65 66 69 6e 65 20 41 4e 41 4c 59 5a 45 20 20 20  efine ANALYZE   
08d0: 20 30 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69   0.#else.#  defi
08e0: 6e 65 20 41 4e 41 4c 59 5a 45 20 20 20 20 30 78  ne ANALYZE    0x
08f0: 30 30 30 30 30 30 30 34 0a 23 65 6e 64 69 66 0a  00000004.#endif.
0900: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
0910: 49 54 5f 41 54 54 41 43 48 0a 23 20 20 64 65 66  IT_ATTACH.#  def
0920: 69 6e 65 20 41 54 54 41 43 48 20 20 20 20 20 30  ine ATTACH     0
0930: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
0940: 20 41 54 54 41 43 48 20 20 20 20 20 30 78 30 30   ATTACH     0x00
0950: 30 30 30 30 30 38 0a 23 65 6e 64 69 66 0a 23 69  000008.#endif.#i
0960: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0970: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 23  _AUTOINCREMENT.#
0980: 20 20 64 65 66 69 6e 65 20 41 55 54 4f 49 4e 43    define AUTOINC
0990: 52 20 20 20 30 0a 23 65 6c 73 65 0a 23 20 20 64  R   0.#else.#  d
09a0: 65 66 69 6e 65 20 41 55 54 4f 49 4e 43 52 20 20  efine AUTOINCR  
09b0: 20 30 78 30 30 30 30 30 30 31 30 0a 23 65 6e 64   0x00000010.#end
09c0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
09d0: 5f 4f 4d 49 54 5f 43 41 53 54 0a 23 20 20 64 65  _OMIT_CAST.#  de
09e0: 66 69 6e 65 20 43 41 53 54 20 20 20 20 20 20 20  fine CAST       
09f0: 30 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  0.#else.#  defin
0a00: 65 20 43 41 53 54 20 20 20 20 20 20 20 30 78 30  e CAST       0x0
0a10: 30 30 30 30 30 32 30 0a 23 65 6e 64 69 66 0a 23  0000020.#endif.#
0a20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
0a30: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
0a40: 54 0a 23 20 20 64 65 66 69 6e 65 20 43 4f 4d 50  T.#  define COMP
0a50: 4f 55 4e 44 20 20 20 30 0a 23 65 6c 73 65 0a 23  OUND   0.#else.#
0a60: 20 20 64 65 66 69 6e 65 20 43 4f 4d 50 4f 55 4e    define COMPOUN
0a70: 44 20 20 20 30 78 30 30 30 30 30 30 34 30 0a 23  D   0x00000040.#
0a80: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
0a90: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 46 4c 49 43  ITE_OMIT_CONFLIC
0aa0: 54 5f 43 4c 41 55 53 45 0a 23 20 20 64 65 66 69  T_CLAUSE.#  defi
0ab0: 6e 65 20 43 4f 4e 46 4c 49 43 54 20 20 20 30 0a  ne CONFLICT   0.
0ac0: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
0ad0: 43 4f 4e 46 4c 49 43 54 20 20 20 30 78 30 30 30  CONFLICT   0x000
0ae0: 30 30 30 38 30 0a 23 65 6e 64 69 66 0a 23 69 66  00080.#endif.#if
0af0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b00: 45 58 50 4c 41 49 4e 0a 23 20 20 64 65 66 69 6e  EXPLAIN.#  defin
0b10: 65 20 45 58 50 4c 41 49 4e 20 20 20 20 30 0a 23  e EXPLAIN    0.#
0b20: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 45  else.#  define E
0b30: 58 50 4c 41 49 4e 20 20 20 20 30 78 30 30 30 30  XPLAIN    0x0000
0b40: 30 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  0100.#endif.#ifd
0b50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
0b60: 4f 52 45 49 47 4e 5f 4b 45 59 0a 23 20 20 64 65  OREIGN_KEY.#  de
0b70: 66 69 6e 65 20 46 4b 45 59 20 20 20 20 20 20 20  fine FKEY       
0b80: 30 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  0.#else.#  defin
0b90: 65 20 46 4b 45 59 20 20 20 20 20 20 20 30 78 30  e FKEY       0x0
0ba0: 30 30 30 30 32 30 30 0a 23 65 6e 64 69 66 0a 23  0000200.#endif.#
0bb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
0bc0: 54 5f 50 52 41 47 4d 41 0a 23 20 20 64 65 66 69  T_PRAGMA.#  defi
0bd0: 6e 65 20 50 52 41 47 4d 41 20 20 20 20 20 30 0a  ne PRAGMA     0.
0be0: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
0bf0: 50 52 41 47 4d 41 20 20 20 20 20 30 78 30 30 30  PRAGMA     0x000
0c00: 30 30 34 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  00400.#endif.#if
0c10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0c20: 52 45 49 4e 44 45 58 0a 23 20 20 64 65 66 69 6e  REINDEX.#  defin
0c30: 65 20 52 45 49 4e 44 45 58 20 20 20 20 30 0a 23  e REINDEX    0.#
0c40: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 52  else.#  define R
0c50: 45 49 4e 44 45 58 20 20 20 20 30 78 30 30 30 30  EINDEX    0x0000
0c60: 30 38 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  0800.#endif.#ifd
0c70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0c80: 55 42 51 55 45 52 59 0a 23 20 20 64 65 66 69 6e  UBQUERY.#  defin
0c90: 65 20 53 55 42 51 55 45 52 59 20 20 20 30 0a 23  e SUBQUERY   0.#
0ca0: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 53  else.#  define S
0cb0: 55 42 51 55 45 52 59 20 20 20 30 78 30 30 30 30  UBQUERY   0x0000
0cc0: 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  1000.#endif.#ifd
0cd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
0ce0: 52 49 47 47 45 52 0a 23 20 20 64 65 66 69 6e 65  RIGGER.#  define
0cf0: 20 54 52 49 47 47 45 52 20 20 20 20 30 0a 23 65   TRIGGER    0.#e
0d00: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 54 52  lse.#  define TR
0d10: 49 47 47 45 52 20 20 20 20 30 78 30 30 30 30 32  IGGER    0x00002
0d20: 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  000.#endif.#if d
0d30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 20 26  IT_AUTOVACUUM) &
0d50: 26 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64  & \.    (defined
0d60: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
0d70: 55 55 4d 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  UUM) || defined(
0d80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41  SQLITE_OMIT_ATTA
0d90: 43 48 29 29 0a 23 20 20 64 65 66 69 6e 65 20 56  CH)).#  define V
0da0: 41 43 55 55 4d 20 20 20 20 20 30 0a 23 65 6c 73  ACUUM     0.#els
0db0: 65 0a 23 20 20 64 65 66 69 6e 65 20 56 41 43 55  e.#  define VACU
0dc0: 55 4d 20 20 20 20 20 30 78 30 30 30 30 34 30 30  UM     0x0000400
0dd0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
0de0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
0df0: 0a 23 20 20 64 65 66 69 6e 65 20 56 49 45 57 20  .#  define VIEW 
0e00: 20 20 20 20 20 20 30 0a 23 65 6c 73 65 0a 23 20        0.#else.# 
0e10: 20 64 65 66 69 6e 65 20 56 49 45 57 20 20 20 20   define VIEW    
0e20: 20 20 20 30 78 30 30 30 30 38 30 30 30 0a 23 65     0x00008000.#e
0e30: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
0e40: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
0e50: 41 42 4c 45 0a 23 20 20 64 65 66 69 6e 65 20 56  ABLE.#  define V
0e60: 54 41 42 20 20 20 20 20 20 20 30 0a 23 65 6c 73  TAB       0.#els
0e70: 65 0a 23 20 20 64 65 66 69 6e 65 20 56 54 41 42  e.#  define VTAB
0e80: 20 20 20 20 20 20 20 30 78 30 30 30 31 30 30 30         0x0001000
0e90: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
0ea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
0eb0: 56 41 43 55 55 4d 0a 23 20 20 64 65 66 69 6e 65  VACUUM.#  define
0ec0: 20 41 55 54 4f 56 41 43 55 55 4d 20 30 0a 23 65   AUTOVACUUM 0.#e
0ed0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 41 55  lse.#  define AU
0ee0: 54 4f 56 41 43 55 55 4d 20 30 78 30 30 30 32 30  TOVACUUM 0x00020
0ef0: 30 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  000.#endif../*.*
0f00: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
0f10: 6b 65 79 77 6f 72 64 73 0a 2a 2f 0a 73 74 61 74  keywords.*/.stat
0f20: 69 63 20 4b 65 79 77 6f 72 64 20 61 4b 65 79 77  ic Keyword aKeyw
0f30: 6f 72 64 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ordTable[] = {. 
0f40: 20 7b 20 22 41 42 4f 52 54 22 2c 20 20 20 20 20   { "ABORT",     
0f50: 20 20 20 20 20 20 20 22 54 4b 5f 41 42 4f 52 54         "TK_ABORT
0f60: 22 2c 20 20 20 20 20 20 20 20 43 4f 4e 46 4c 49  ",        CONFLI
0f70: 43 54 7c 54 52 49 47 47 45 52 20 20 20 20 20 20  CT|TRIGGER      
0f80: 20 7d 2c 0a 20 20 7b 20 22 41 44 44 22 2c 20 20   },.  { "ADD",  
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
0fa0: 41 44 44 22 2c 20 20 20 20 20 20 20 20 20 20 41  ADD",          A
0fb0: 4c 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20  LTER            
0fc0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 41 46        },.  { "AF
0fd0: 54 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20  TER",           
0fe0: 20 22 54 4b 5f 41 46 54 45 52 22 2c 20 20 20 20   "TK_AFTER",    
0ff0: 20 20 20 20 54 52 49 47 47 45 52 20 20 20 20 20      TRIGGER     
1000: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1010: 7b 20 22 41 4c 4c 22 2c 20 20 20 20 20 20 20 20  { "ALL",        
1020: 20 20 20 20 20 20 22 54 4b 5f 41 4c 4c 22 2c 20        "TK_ALL", 
1030: 20 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20           ALWAYS 
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1050: 7d 2c 0a 20 20 7b 20 22 41 4c 54 45 52 22 2c 20  },.  { "ALTER", 
1060: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 41             "TK_A
1070: 4c 54 45 52 22 2c 20 20 20 20 20 20 20 20 41 4c  LTER",        AL
1080: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1090: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 41 4e 41       },.  { "ANA
10a0: 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20 20  LYZE",          
10b0: 22 54 4b 5f 41 4e 41 4c 59 5a 45 22 2c 20 20 20  "TK_ANALYZE",   
10c0: 20 20 20 41 4e 41 4c 59 5a 45 20 20 20 20 20 20     ANALYZE      
10d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
10e0: 20 22 41 4e 44 22 2c 20 20 20 20 20 20 20 20 20   "AND",         
10f0: 20 20 20 20 20 22 54 4b 5f 41 4e 44 22 2c 20 20       "TK_AND",  
1100: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1120: 2c 0a 20 20 7b 20 22 41 53 22 2c 20 20 20 20 20  ,.  { "AS",     
1130: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 41 53            "TK_AS
1140: 22 2c 20 20 20 20 20 20 20 20 20 20 20 41 4c 57  ",           ALW
1150: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
1160: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 41 53 43 22      },.  { "ASC"
1170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
1180: 54 4b 5f 41 53 43 22 2c 20 20 20 20 20 20 20 20  TK_ASC",        
1190: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
11a0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
11b0: 22 41 54 54 41 43 48 22 2c 20 20 20 20 20 20 20  "ATTACH",       
11c0: 20 20 20 20 22 54 4b 5f 41 54 54 41 43 48 22 2c      "TK_ATTACH",
11d0: 20 20 20 20 20 20 20 41 54 54 41 43 48 20 20 20         ATTACH   
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
11f0: 0a 20 20 7b 20 22 41 55 54 4f 49 4e 43 52 45 4d  .  { "AUTOINCREM
1200: 45 4e 54 22 2c 20 20 20 20 22 54 4b 5f 41 55 54  ENT",    "TK_AUT
1210: 4f 49 4e 43 52 22 2c 20 20 20 20 20 41 55 54 4f  OINCR",     AUTO
1220: 49 4e 43 52 20 20 20 20 20 20 20 20 20 20 20 20  INCR            
1230: 20 20 20 7d 2c 0a 20 20 7b 20 22 42 45 46 4f 52     },.  { "BEFOR
1240: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 54  E",           "T
1250: 4b 5f 42 45 46 4f 52 45 22 2c 20 20 20 20 20 20  K_BEFORE",      
1260: 20 54 52 49 47 47 45 52 20 20 20 20 20 20 20 20   TRIGGER        
1270: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1280: 42 45 47 49 4e 22 2c 20 20 20 20 20 20 20 20 20  BEGIN",         
1290: 20 20 20 22 54 4b 5f 42 45 47 49 4e 22 2c 20 20     "TK_BEGIN",  
12a0: 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20        ALWAYS    
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
12c0: 20 20 7b 20 22 42 45 54 57 45 45 4e 22 2c 20 20    { "BETWEEN",  
12d0: 20 20 20 20 20 20 20 20 22 54 4b 5f 42 45 54 57          "TK_BETW
12e0: 45 45 4e 22 2c 20 20 20 20 20 20 41 4c 57 41 59  EEN",      ALWAY
12f0: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
1300: 20 20 7d 2c 0a 20 20 7b 20 22 42 59 22 2c 20 20    },.  { "BY",  
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b               "TK
1320: 5f 42 59 22 2c 20 20 20 20 20 20 20 20 20 20 20  _BY",           
1330: 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20  ALWAYS          
1340: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43         },.  { "C
1350: 41 53 43 41 44 45 22 2c 20 20 20 20 20 20 20 20  ASCADE",        
1360: 20 20 22 54 4b 5f 43 41 53 43 41 44 45 22 2c 20    "TK_CASCADE", 
1370: 20 20 20 20 20 46 4b 45 59 20 20 20 20 20 20 20       FKEY       
1380: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1390: 20 7b 20 22 43 41 53 45 22 2c 20 20 20 20 20 20   { "CASE",      
13a0: 20 20 20 20 20 20 20 22 54 4b 5f 43 41 53 45 22         "TK_CASE"
13b0: 2c 20 20 20 20 20 20 20 20 20 41 4c 57 41 59 53  ,         ALWAYS
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 7d 2c 0a 20 20 7b 20 22 43 41 53 54 22 2c 20   },.  { "CAST", 
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
13f0: 43 41 53 54 22 2c 20 20 20 20 20 20 20 20 20 43  CAST",         C
1400: 41 53 54 20 20 20 20 20 20 20 20 20 20 20 20 20  AST             
1410: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43 48        },.  { "CH
1420: 45 43 4b 22 2c 20 20 20 20 20 20 20 20 20 20 20  ECK",           
1430: 20 22 54 4b 5f 43 48 45 43 4b 22 2c 20 20 20 20   "TK_CHECK",    
1440: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
1450: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1460: 7b 20 22 43 4f 4c 4c 41 54 45 22 2c 20 20 20 20  { "COLLATE",    
1470: 20 20 20 20 20 20 22 54 4b 5f 43 4f 4c 4c 41 54        "TK_COLLAT
1480: 45 22 2c 20 20 20 20 20 20 41 4c 57 41 59 53 20  E",      ALWAYS 
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 7d 2c 0a 20 20 7b 20 22 43 4f 4c 55 4d 4e 22 2c  },.  { "COLUMN",
14b0: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 43             "TK_C
14c0: 4f 4c 55 4d 4e 4b 57 22 2c 20 20 20 20 20 41 4c  OLUMNKW",     AL
14d0: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
14e0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43 4f 4d       },.  { "COM
14f0: 4d 49 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  MIT",           
1500: 22 54 4b 5f 43 4f 4d 4d 49 54 22 2c 20 20 20 20  "TK_COMMIT",    
1510: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
1520: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
1530: 20 22 43 4f 4e 46 4c 49 43 54 22 2c 20 20 20 20   "CONFLICT",    
1540: 20 20 20 20 20 22 54 4b 5f 43 4f 4e 46 4c 49 43       "TK_CONFLIC
1550: 54 22 2c 20 20 20 20 20 43 4f 4e 46 4c 49 43 54  T",     CONFLICT
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1570: 2c 0a 20 20 7b 20 22 43 4f 4e 53 54 52 41 49 4e  ,.  { "CONSTRAIN
1580: 54 22 2c 20 20 20 20 20 20 20 22 54 4b 5f 43 4f  T",       "TK_CO
1590: 4e 53 54 52 41 49 4e 54 22 2c 20 20 20 41 4c 57  NSTRAINT",   ALW
15a0: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
15b0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43 52 45 41      },.  { "CREA
15c0: 54 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  TE",           "
15d0: 54 4b 5f 43 52 45 41 54 45 22 2c 20 20 20 20 20  TK_CREATE",     
15e0: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
15f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
1600: 22 43 52 4f 53 53 22 2c 20 20 20 20 20 20 20 20  "CROSS",        
1610: 20 20 20 20 22 54 4b 5f 4a 4f 49 4e 5f 4b 57 22      "TK_JOIN_KW"
1620: 2c 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20  ,      ALWAYS   
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1640: 0a 20 20 7b 20 22 43 55 52 52 45 4e 54 5f 44 41  .  { "CURRENT_DA
1650: 54 45 22 2c 20 20 20 20 20 22 54 4b 5f 43 54 49  TE",     "TK_CTI
1660: 4d 45 5f 4b 57 22 2c 20 20 20 20 20 41 4c 57 41  ME_KW",     ALWA
1670: 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  YS              
1680: 20 20 20 7d 2c 0a 20 20 7b 20 22 43 55 52 52 45     },.  { "CURRE
1690: 4e 54 5f 54 49 4d 45 22 2c 20 20 20 20 20 22 54  NT_TIME",     "T
16a0: 4b 5f 43 54 49 4d 45 5f 4b 57 22 2c 20 20 20 20  K_CTIME_KW",    
16b0: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
16c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
16d0: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
16e0: 50 22 2c 22 54 4b 5f 43 54 49 4d 45 5f 4b 57 22  P","TK_CTIME_KW"
16f0: 2c 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20  ,     ALWAYS    
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1710: 20 20 7b 20 22 44 41 54 41 42 41 53 45 22 2c 20    { "DATABASE", 
1720: 20 20 20 20 20 20 20 20 22 54 4b 5f 44 41 54 41          "TK_DATA
1730: 42 41 53 45 22 2c 20 20 20 20 20 41 54 54 41 43  BASE",     ATTAC
1740: 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
1750: 20 20 7d 2c 0a 20 20 7b 20 22 44 45 46 41 55 4c    },.  { "DEFAUL
1760: 54 22 2c 20 20 20 20 20 20 20 20 20 20 22 54 4b  T",          "TK
1770: 5f 44 45 46 41 55 4c 54 22 2c 20 20 20 20 20 20  _DEFAULT",      
1780: 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20  ALWAYS          
1790: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 44         },.  { "D
17a0: 45 46 45 52 52 45 44 22 2c 20 20 20 20 20 20 20  EFERRED",       
17b0: 20 20 22 54 4b 5f 44 45 46 45 52 52 45 44 22 2c    "TK_DEFERRED",
17c0: 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20       ALWAYS     
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
17e0: 20 7b 20 22 44 45 46 45 52 52 41 42 4c 45 22 2c   { "DEFERRABLE",
17f0: 20 20 20 20 20 20 20 22 54 4b 5f 44 45 46 45 52         "TK_DEFER
1800: 52 41 42 4c 45 22 2c 20 20 20 46 4b 45 59 20 20  RABLE",   FKEY  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 7d 2c 0a 20 20 7b 20 22 44 45 4c 45 54 45 22   },.  { "DELETE"
1830: 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f  ,           "TK_
1840: 44 45 4c 45 54 45 22 2c 20 20 20 20 20 20 20 41  DELETE",       A
1850: 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20  LWAYS           
1860: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 44 45        },.  { "DE
1870: 53 43 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  SC",            
1880: 20 22 54 4b 5f 44 45 53 43 22 2c 20 20 20 20 20   "TK_DESC",     
1890: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
18a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
18b0: 7b 20 22 44 45 54 41 43 48 22 2c 20 20 20 20 20  { "DETACH",     
18c0: 20 20 20 20 20 20 22 54 4b 5f 44 45 54 41 43 48        "TK_DETACH
18d0: 22 2c 20 20 20 20 20 20 20 41 54 54 41 43 48 20  ",       ATTACH 
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 7d 2c 0a 20 20 7b 20 22 44 49 53 54 49 4e 43 54  },.  { "DISTINCT
1900: 22 2c 20 20 20 20 20 20 20 20 20 22 54 4b 5f 44  ",         "TK_D
1910: 49 53 54 49 4e 43 54 22 2c 20 20 20 20 20 41 4c  ISTINCT",     AL
1920: 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20  WAYS            
1930: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 44 52 4f       },.  { "DRO
1940: 50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  P",             
1950: 22 54 4b 5f 44 52 4f 50 22 2c 20 20 20 20 20 20  "TK_DROP",      
1960: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
1970: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
1980: 20 22 45 4e 44 22 2c 20 20 20 20 20 20 20 20 20   "END",         
1990: 20 20 20 20 20 22 54 4b 5f 45 4e 44 22 2c 20 20       "TK_END",  
19a0: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
19c0: 2c 0a 20 20 7b 20 22 45 41 43 48 22 2c 20 20 20  ,.  { "EACH",   
19d0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 45 41            "TK_EA
19e0: 43 48 22 2c 20 20 20 20 20 20 20 20 20 54 52 49  CH",         TRI
19f0: 47 47 45 52 20 20 20 20 20 20 20 20 20 20 20 20  GGER            
1a00: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 45 4c 53 45      },.  { "ELSE
1a10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
1a20: 54 4b 5f 45 4c 53 45 22 2c 20 20 20 20 20 20 20  TK_ELSE",       
1a30: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
1a40: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
1a50: 22 45 53 43 41 50 45 22 2c 20 20 20 20 20 20 20  "ESCAPE",       
1a60: 20 20 20 20 22 54 4b 5f 45 53 43 41 50 45 22 2c      "TK_ESCAPE",
1a70: 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20         ALWAYS   
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1a90: 0a 20 20 7b 20 22 45 58 43 45 50 54 22 2c 20 20  .  { "EXCEPT",  
1aa0: 20 20 20 20 20 20 20 20 20 22 54 4b 5f 45 58 43           "TK_EXC
1ab0: 45 50 54 22 2c 20 20 20 20 20 20 20 43 4f 4d 50  EPT",       COMP
1ac0: 4f 55 4e 44 20 20 20 20 20 20 20 20 20 20 20 20  OUND            
1ad0: 20 20 20 7d 2c 0a 20 20 7b 20 22 45 58 43 4c 55     },.  { "EXCLU
1ae0: 53 49 56 45 22 2c 20 20 20 20 20 20 20 20 22 54  SIVE",        "T
1af0: 4b 5f 45 58 43 4c 55 53 49 56 45 22 2c 20 20 20  K_EXCLUSIVE",   
1b00: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
1b10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1b20: 45 58 49 53 54 53 22 2c 20 20 20 20 20 20 20 20  EXISTS",        
1b30: 20 20 20 22 54 4b 5f 45 58 49 53 54 53 22 2c 20     "TK_EXISTS", 
1b40: 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20        ALWAYS    
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1b60: 20 20 7b 20 22 45 58 50 4c 41 49 4e 22 2c 20 20    { "EXPLAIN",  
1b70: 20 20 20 20 20 20 20 20 22 54 4b 5f 45 58 50 4c          "TK_EXPL
1b80: 41 49 4e 22 2c 20 20 20 20 20 20 45 58 50 4c 41  AIN",      EXPLA
1b90: 49 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IN              
1ba0: 20 20 7d 2c 0a 20 20 7b 20 22 46 41 49 4c 22 2c    },.  { "FAIL",
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b               "TK
1bc0: 5f 46 41 49 4c 22 2c 20 20 20 20 20 20 20 20 20  _FAIL",         
1bd0: 43 4f 4e 46 4c 49 43 54 7c 54 52 49 47 47 45 52  CONFLICT|TRIGGER
1be0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 46         },.  { "F
1bf0: 4f 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OR",            
1c00: 20 20 22 54 4b 5f 46 4f 52 22 2c 20 20 20 20 20    "TK_FOR",     
1c10: 20 20 20 20 20 54 52 49 47 47 45 52 20 20 20 20       TRIGGER    
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1c30: 20 7b 20 22 46 4f 52 45 49 47 4e 22 2c 20 20 20   { "FOREIGN",   
1c40: 20 20 20 20 20 20 20 22 54 4b 5f 46 4f 52 45 49         "TK_FOREI
1c50: 47 4e 22 2c 20 20 20 20 20 20 46 4b 45 59 20 20  GN",      FKEY  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 7d 2c 0a 20 20 7b 20 22 46 52 4f 4d 22 2c 20   },.  { "FROM", 
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
1c90: 46 52 4f 4d 22 2c 20 20 20 20 20 20 20 20 20 41  FROM",         A
1ca0: 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20  LWAYS           
1cb0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 46 55        },.  { "FU
1cc0: 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  LL",            
1cd0: 20 22 54 4b 5f 4a 4f 49 4e 5f 4b 57 22 2c 20 20   "TK_JOIN_KW",  
1ce0: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
1cf0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1d00: 7b 20 22 47 4c 4f 42 22 2c 20 20 20 20 20 20 20  { "GLOB",       
1d10: 20 20 20 20 20 20 22 54 4b 5f 4c 49 4b 45 5f 4b        "TK_LIKE_K
1d20: 57 22 2c 20 20 20 20 20 20 41 4c 57 41 59 53 20  W",      ALWAYS 
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 7d 2c 0a 20 20 7b 20 22 47 52 4f 55 50 22 2c 20  },.  { "GROUP", 
1d50: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 47             "TK_G
1d60: 52 4f 55 50 22 2c 20 20 20 20 20 20 20 20 41 4c  ROUP",        AL
1d70: 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20  WAYS            
1d80: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 48 41 56       },.  { "HAV
1d90: 49 4e 47 22 2c 20 20 20 20 20 20 20 20 20 20 20  ING",           
1da0: 22 54 4b 5f 48 41 56 49 4e 47 22 2c 20 20 20 20  "TK_HAVING",    
1db0: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
1dc0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
1dd0: 20 22 49 46 22 2c 20 20 20 20 20 20 20 20 20 20   "IF",          
1de0: 20 20 20 20 20 22 54 4b 5f 49 46 22 2c 20 20 20       "TK_IF",   
1df0: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1e10: 2c 0a 20 20 7b 20 22 49 47 4e 4f 52 45 22 2c 20  ,.  { "IGNORE", 
1e20: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 49 47            "TK_IG
1e30: 4e 4f 52 45 22 2c 20 20 20 20 20 20 20 43 4f 4e  NORE",       CON
1e40: 46 4c 49 43 54 7c 54 52 49 47 47 45 52 20 20 20  FLICT|TRIGGER   
1e50: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 49 4d 4d 45      },.  { "IMME
1e60: 44 49 41 54 45 22 2c 20 20 20 20 20 20 20 20 22  DIATE",        "
1e70: 54 4b 5f 49 4d 4d 45 44 49 41 54 45 22 2c 20 20  TK_IMMEDIATE",  
1e80: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
1e90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
1ea0: 22 49 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  "IN",           
1eb0: 20 20 20 20 22 54 4b 5f 49 4e 22 2c 20 20 20 20      "TK_IN",    
1ec0: 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20         ALWAYS   
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1ee0: 0a 20 20 7b 20 22 49 4e 44 45 58 22 2c 20 20 20  .  { "INDEX",   
1ef0: 20 20 20 20 20 20 20 20 20 22 54 4b 5f 49 4e 44           "TK_IND
1f00: 45 58 22 2c 20 20 20 20 20 20 20 20 41 4c 57 41  EX",        ALWA
1f10: 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  YS              
1f20: 20 20 20 7d 2c 0a 20 20 7b 20 22 49 4e 44 45 58     },.  { "INDEX
1f30: 45 44 22 2c 20 20 20 20 20 20 20 20 20 20 22 54  ED",          "T
1f40: 4b 5f 49 4e 44 45 58 45 44 22 2c 20 20 20 20 20  K_INDEXED",     
1f50: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
1f60: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1f70: 49 4e 49 54 49 41 4c 4c 59 22 2c 20 20 20 20 20  INITIALLY",     
1f80: 20 20 20 22 54 4b 5f 49 4e 49 54 49 41 4c 4c 59     "TK_INITIALLY
1f90: 22 2c 20 20 20 20 46 4b 45 59 20 20 20 20 20 20  ",    FKEY      
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1fb0: 20 20 7b 20 22 49 4e 4e 45 52 22 2c 20 20 20 20    { "INNER",    
1fc0: 20 20 20 20 20 20 20 20 22 54 4b 5f 4a 4f 49 4e          "TK_JOIN
1fd0: 5f 4b 57 22 2c 20 20 20 20 20 20 41 4c 57 41 59  _KW",      ALWAY
1fe0: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
1ff0: 20 20 7d 2c 0a 20 20 7b 20 22 49 4e 53 45 52 54    },.  { "INSERT
2000: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b  ",           "TK
2010: 5f 49 4e 53 45 52 54 22 2c 20 20 20 20 20 20 20  _INSERT",       
2020: 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20  ALWAYS          
2030: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 49         },.  { "I
2040: 4e 53 54 45 41 44 22 2c 20 20 20 20 20 20 20 20  NSTEAD",        
2050: 20 20 22 54 4b 5f 49 4e 53 54 45 41 44 22 2c 20    "TK_INSTEAD", 
2060: 20 20 20 20 20 54 52 49 47 47 45 52 20 20 20 20       TRIGGER    
2070: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2080: 20 7b 20 22 49 4e 54 45 52 53 45 43 54 22 2c 20   { "INTERSECT", 
2090: 20 20 20 20 20 20 20 22 54 4b 5f 49 4e 54 45 52         "TK_INTER
20a0: 53 45 43 54 22 2c 20 20 20 20 43 4f 4d 50 4f 55  SECT",    COMPOU
20b0: 4e 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ND              
20c0: 20 7d 2c 0a 20 20 7b 20 22 49 4e 54 4f 22 2c 20   },.  { "INTO", 
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
20e0: 49 4e 54 4f 22 2c 20 20 20 20 20 20 20 20 20 41  INTO",         A
20f0: 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20  LWAYS           
2100: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 49 53        },.  { "IS
2110: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2120: 20 22 54 4b 5f 49 53 22 2c 20 20 20 20 20 20 20   "TK_IS",       
2130: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
2140: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2150: 7b 20 22 49 53 4e 55 4c 4c 22 2c 20 20 20 20 20  { "ISNULL",     
2160: 20 20 20 20 20 20 22 54 4b 5f 49 53 4e 55 4c 4c        "TK_ISNULL
2170: 22 2c 20 20 20 20 20 20 20 41 4c 57 41 59 53 20  ",       ALWAYS 
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 7d 2c 0a 20 20 7b 20 22 4a 4f 49 4e 22 2c 20 20  },.  { "JOIN",  
21a0: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4a             "TK_J
21b0: 4f 49 4e 22 2c 20 20 20 20 20 20 20 20 20 41 4c  OIN",         AL
21c0: 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20  WAYS            
21d0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4b 45 59       },.  { "KEY
21e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
21f0: 22 54 4b 5f 4b 45 59 22 2c 20 20 20 20 20 20 20  "TK_KEY",       
2200: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
2210: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
2220: 20 22 4c 45 46 54 22 2c 20 20 20 20 20 20 20 20   "LEFT",        
2230: 20 20 20 20 20 22 54 4b 5f 4a 4f 49 4e 5f 4b 57       "TK_JOIN_KW
2240: 22 2c 20 20 20 20 20 20 41 4c 57 41 59 53 20 20  ",      ALWAYS  
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2260: 2c 0a 20 20 7b 20 22 4c 49 4b 45 22 2c 20 20 20  ,.  { "LIKE",   
2270: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4c 49            "TK_LI
2280: 4b 45 5f 4b 57 22 2c 20 20 20 20 20 20 41 4c 57  KE_KW",      ALW
2290: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
22a0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4c 49 4d 49      },.  { "LIMI
22b0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  T",            "
22c0: 54 4b 5f 4c 49 4d 49 54 22 2c 20 20 20 20 20 20  TK_LIMIT",      
22d0: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
22e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
22f0: 22 4d 41 54 43 48 22 2c 20 20 20 20 20 20 20 20  "MATCH",        
2300: 20 20 20 20 22 54 4b 5f 4d 41 54 43 48 22 2c 20      "TK_MATCH", 
2310: 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20         ALWAYS   
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2330: 0a 20 20 7b 20 22 4e 41 54 55 52 41 4c 22 2c 20  .  { "NATURAL", 
2340: 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4a 4f 49           "TK_JOI
2350: 4e 5f 4b 57 22 2c 20 20 20 20 20 20 41 4c 57 41  N_KW",      ALWA
2360: 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  YS              
2370: 20 20 20 7d 2c 0a 20 20 7b 20 22 4e 4f 54 22 2c     },.  { "NOT",
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54                "T
2390: 4b 5f 4e 4f 54 22 2c 20 20 20 20 20 20 20 20 20  K_NOT",         
23a0: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
23b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
23c0: 4e 4f 54 4e 55 4c 4c 22 2c 20 20 20 20 20 20 20  NOTNULL",       
23d0: 20 20 20 22 54 4b 5f 4e 4f 54 4e 55 4c 4c 22 2c     "TK_NOTNULL",
23e0: 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20        ALWAYS    
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2400: 20 20 7b 20 22 4e 55 4c 4c 22 2c 20 20 20 20 20    { "NULL",     
2410: 20 20 20 20 20 20 20 20 22 54 4b 5f 4e 55 4c 4c          "TK_NULL
2420: 22 2c 20 20 20 20 20 20 20 20 20 41 4c 57 41 59  ",         ALWAY
2430: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
2440: 20 20 7d 2c 0a 20 20 7b 20 22 4f 46 22 2c 20 20    },.  { "OF",  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b               "TK
2460: 5f 4f 46 22 2c 20 20 20 20 20 20 20 20 20 20 20  _OF",           
2470: 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20  ALWAYS          
2480: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4f         },.  { "O
2490: 46 46 53 45 54 22 2c 20 20 20 20 20 20 20 20 20  FFSET",         
24a0: 20 20 22 54 4b 5f 4f 46 46 53 45 54 22 2c 20 20    "TK_OFFSET",  
24b0: 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20       ALWAYS     
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
24d0: 20 7b 20 22 4f 4e 22 2c 20 20 20 20 20 20 20 20   { "ON",        
24e0: 20 20 20 20 20 20 20 22 54 4b 5f 4f 4e 22 2c 20         "TK_ON", 
24f0: 20 20 20 20 20 20 20 20 20 20 41 4c 57 41 59 53            ALWAYS
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 7d 2c 0a 20 20 7b 20 22 4f 52 22 2c 20 20 20   },.  { "OR",   
2520: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
2530: 4f 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 41  OR",           A
2540: 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20  LWAYS           
2550: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4f 52        },.  { "OR
2560: 44 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20  DER",           
2570: 20 22 54 4b 5f 4f 52 44 45 52 22 2c 20 20 20 20   "TK_ORDER",    
2580: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
2590: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
25a0: 7b 20 22 4f 55 54 45 52 22 2c 20 20 20 20 20 20  { "OUTER",      
25b0: 20 20 20 20 20 20 22 54 4b 5f 4a 4f 49 4e 5f 4b        "TK_JOIN_K
25c0: 57 22 2c 20 20 20 20 20 20 41 4c 57 41 59 53 20  W",      ALWAYS 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 7d 2c 0a 20 20 7b 20 22 50 4c 41 4e 22 2c 20 20  },.  { "PLAN",  
25f0: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 50             "TK_P
2600: 4c 41 4e 22 2c 20 20 20 20 20 20 20 20 20 45 58  LAN",         EX
2610: 50 4c 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  PLAIN           
2620: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 50 52 41       },.  { "PRA
2630: 47 4d 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  GMA",           
2640: 22 54 4b 5f 50 52 41 47 4d 41 22 2c 20 20 20 20  "TK_PRAGMA",    
2650: 20 20 20 50 52 41 47 4d 41 20 20 20 20 20 20 20     PRAGMA       
2660: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
2670: 20 22 50 52 49 4d 41 52 59 22 2c 20 20 20 20 20   "PRIMARY",     
2680: 20 20 20 20 20 22 54 4b 5f 50 52 49 4d 41 52 59       "TK_PRIMARY
2690: 22 2c 20 20 20 20 20 20 41 4c 57 41 59 53 20 20  ",      ALWAYS  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
26b0: 2c 0a 20 20 7b 20 22 51 55 45 52 59 22 2c 20 20  ,.  { "QUERY",  
26c0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 51 55            "TK_QU
26d0: 45 52 59 22 2c 20 20 20 20 20 20 20 20 45 58 50  ERY",        EXP
26e0: 4c 41 49 4e 20 20 20 20 20 20 20 20 20 20 20 20  LAIN            
26f0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 52 41 49 53      },.  { "RAIS
2700: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  E",            "
2710: 54 4b 5f 52 41 49 53 45 22 2c 20 20 20 20 20 20  TK_RAISE",      
2720: 20 20 54 52 49 47 47 45 52 20 20 20 20 20 20 20    TRIGGER       
2730: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
2740: 22 52 45 46 45 52 45 4e 43 45 53 22 2c 20 20 20  "REFERENCES",   
2750: 20 20 20 20 22 54 4b 5f 52 45 46 45 52 45 4e 43      "TK_REFERENC
2760: 45 53 22 2c 20 20 20 46 4b 45 59 20 20 20 20 20  ES",   FKEY     
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2780: 0a 20 20 7b 20 22 52 45 47 45 58 50 22 2c 20 20  .  { "REGEXP",  
2790: 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4c 49 4b           "TK_LIK
27a0: 45 5f 4b 57 22 2c 20 20 20 20 20 20 41 4c 57 41  E_KW",      ALWA
27b0: 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  YS              
27c0: 20 20 20 7d 2c 0a 20 20 7b 20 22 52 45 49 4e 44     },.  { "REIND
27d0: 45 58 22 2c 20 20 20 20 20 20 20 20 20 20 22 54  EX",          "T
27e0: 4b 5f 52 45 49 4e 44 45 58 22 2c 20 20 20 20 20  K_REINDEX",     
27f0: 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
2800: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
2810: 52 45 4c 45 41 53 45 22 2c 20 20 20 20 20 20 20  RELEASE",       
2820: 20 20 20 22 54 4b 5f 52 45 4c 45 41 53 45 22 2c     "TK_RELEASE",
2830: 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20        ALWAYS    
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2850: 20 20 7b 20 22 52 45 4e 41 4d 45 22 2c 20 20 20    { "RENAME",   
2860: 20 20 20 20 20 20 20 20 22 54 4b 5f 52 45 4e 41          "TK_RENA
2870: 4d 45 22 2c 20 20 20 20 20 20 20 41 4c 54 45 52  ME",       ALTER
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 7d 2c 0a 20 20 7b 20 22 52 45 50 4c 41 43    },.  { "REPLAC
28a0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 54 4b  E",          "TK
28b0: 5f 52 45 50 4c 41 43 45 22 2c 20 20 20 20 20 20  _REPLACE",      
28c0: 43 4f 4e 46 4c 49 43 54 20 20 20 20 20 20 20 20  CONFLICT        
28d0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 52         },.  { "R
28e0: 45 53 54 52 49 43 54 22 2c 20 20 20 20 20 20 20  ESTRICT",       
28f0: 20 20 22 54 4b 5f 52 45 53 54 52 49 43 54 22 2c    "TK_RESTRICT",
2900: 20 20 20 20 20 46 4b 45 59 20 20 20 20 20 20 20       FKEY       
2910: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2920: 20 7b 20 22 52 49 47 48 54 22 2c 20 20 20 20 20   { "RIGHT",     
2930: 20 20 20 20 20 20 20 22 54 4b 5f 4a 4f 49 4e 5f         "TK_JOIN_
2940: 4b 57 22 2c 20 20 20 20 20 20 41 4c 57 41 59 53  KW",      ALWAYS
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 7d 2c 0a 20 20 7b 20 22 52 4f 4c 4c 42 41 43   },.  { "ROLLBAC
2970: 4b 22 2c 20 20 20 20 20 20 20 20 20 22 54 4b 5f  K",         "TK_
2980: 52 4f 4c 4c 42 41 43 4b 22 2c 20 20 20 20 20 41  ROLLBACK",     A
2990: 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20  LWAYS           
29a0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 52 4f        },.  { "RO
29b0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
29c0: 20 22 54 4b 5f 52 4f 57 22 2c 20 20 20 20 20 20   "TK_ROW",      
29d0: 20 20 20 20 54 52 49 47 47 45 52 20 20 20 20 20      TRIGGER     
29e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
29f0: 7b 20 22 53 41 56 45 50 4f 49 4e 54 22 2c 20 20  { "SAVEPOINT",  
2a00: 20 20 20 20 20 20 22 54 4b 5f 53 41 56 45 50 4f        "TK_SAVEPO
2a10: 49 4e 54 22 2c 20 20 20 20 41 4c 57 41 59 53 20  INT",    ALWAYS 
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 7d 2c 0a 20 20 7b 20 22 53 45 4c 45 43 54 22 2c  },.  { "SELECT",
2a40: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 53             "TK_S
2a50: 45 4c 45 43 54 22 2c 20 20 20 20 20 20 20 41 4c  ELECT",       AL
2a60: 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20  WAYS            
2a70: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 53 45 54       },.  { "SET
2a80: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2a90: 22 54 4b 5f 53 45 54 22 2c 20 20 20 20 20 20 20  "TK_SET",       
2aa0: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
2ab0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
2ac0: 20 22 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20   "TABLE",       
2ad0: 20 20 20 20 20 22 54 4b 5f 54 41 42 4c 45 22 2c       "TK_TABLE",
2ae0: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2b00: 2c 0a 20 20 7b 20 22 54 45 4d 50 22 2c 20 20 20  ,.  { "TEMP",   
2b10: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 54 45            "TK_TE
2b20: 4d 50 22 2c 20 20 20 20 20 20 20 20 20 41 4c 57  MP",         ALW
2b30: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
2b40: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 54 45 4d 50      },.  { "TEMP
2b50: 4f 52 41 52 59 22 2c 20 20 20 20 20 20 20 20 22  ORARY",        "
2b60: 54 4b 5f 54 45 4d 50 22 2c 20 20 20 20 20 20 20  TK_TEMP",       
2b70: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
2b80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
2b90: 22 54 48 45 4e 22 2c 20 20 20 20 20 20 20 20 20  "THEN",         
2ba0: 20 20 20 20 22 54 4b 5f 54 48 45 4e 22 2c 20 20      "TK_THEN",  
2bb0: 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20         ALWAYS   
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2bd0: 0a 20 20 7b 20 22 54 4f 22 2c 20 20 20 20 20 20  .  { "TO",      
2be0: 20 20 20 20 20 20 20 20 20 22 54 4b 5f 54 4f 22           "TK_TO"
2bf0: 2c 20 20 20 20 20 20 20 20 20 20 20 41 4c 57 41  ,           ALWA
2c00: 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  YS              
2c10: 20 20 20 7d 2c 0a 20 20 7b 20 22 54 52 41 4e 53     },.  { "TRANS
2c20: 41 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 22 54  ACTION",      "T
2c30: 4b 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20  K_TRANSACTION", 
2c40: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
2c50: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
2c60: 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20  TRIGGER",       
2c70: 20 20 20 22 54 4b 5f 54 52 49 47 47 45 52 22 2c     "TK_TRIGGER",
2c80: 20 20 20 20 20 20 54 52 49 47 47 45 52 20 20 20        TRIGGER   
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2ca0: 20 20 7b 20 22 55 4e 49 4f 4e 22 2c 20 20 20 20    { "UNION",    
2cb0: 20 20 20 20 20 20 20 20 22 54 4b 5f 55 4e 49 4f          "TK_UNIO
2cc0: 4e 22 2c 20 20 20 20 20 20 20 20 43 4f 4d 50 4f  N",        COMPO
2cd0: 55 4e 44 20 20 20 20 20 20 20 20 20 20 20 20 20  UND             
2ce0: 20 20 7d 2c 0a 20 20 7b 20 22 55 4e 49 51 55 45    },.  { "UNIQUE
2cf0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b  ",           "TK
2d00: 5f 55 4e 49 51 55 45 22 2c 20 20 20 20 20 20 20  _UNIQUE",       
2d10: 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20  ALWAYS          
2d20: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 55         },.  { "U
2d30: 50 44 41 54 45 22 2c 20 20 20 20 20 20 20 20 20  PDATE",         
2d40: 20 20 22 54 4b 5f 55 50 44 41 54 45 22 2c 20 20    "TK_UPDATE",  
2d50: 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20       ALWAYS     
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2d70: 20 7b 20 22 55 53 49 4e 47 22 2c 20 20 20 20 20   { "USING",     
2d80: 20 20 20 20 20 20 20 22 54 4b 5f 55 53 49 4e 47         "TK_USING
2d90: 22 2c 20 20 20 20 20 20 20 20 41 4c 57 41 59 53  ",        ALWAYS
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 7d 2c 0a 20 20 7b 20 22 56 41 43 55 55 4d 22   },.  { "VACUUM"
2dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f  ,           "TK_
2dd0: 56 41 43 55 55 4d 22 2c 20 20 20 20 20 20 20 56  VACUUM",       V
2de0: 41 43 55 55 4d 20 20 20 20 20 20 20 20 20 20 20  ACUUM           
2df0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 56 41        },.  { "VA
2e00: 4c 55 45 53 22 2c 20 20 20 20 20 20 20 20 20 20  LUES",          
2e10: 20 22 54 4b 5f 56 41 4c 55 45 53 22 2c 20 20 20   "TK_VALUES",   
2e20: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
2e30: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2e40: 7b 20 22 56 49 45 57 22 2c 20 20 20 20 20 20 20  { "VIEW",       
2e50: 20 20 20 20 20 20 22 54 4b 5f 56 49 45 57 22 2c        "TK_VIEW",
2e60: 20 20 20 20 20 20 20 20 20 56 49 45 57 20 20 20           VIEW   
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 7d 2c 0a 20 20 7b 20 22 56 49 52 54 55 41 4c 22  },.  { "VIRTUAL"
2e90: 2c 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 56  ,          "TK_V
2ea0: 49 52 54 55 41 4c 22 2c 20 20 20 20 20 20 56 54  IRTUAL",      VT
2eb0: 41 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AB              
2ec0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 57 48 45       },.  { "WHE
2ed0: 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  N",             
2ee0: 22 54 4b 5f 57 48 45 4e 22 2c 20 20 20 20 20 20  "TK_WHEN",      
2ef0: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
2f00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
2f10: 20 22 57 48 45 52 45 22 2c 20 20 20 20 20 20 20   "WHERE",       
2f20: 20 20 20 20 20 22 54 4b 5f 57 48 45 52 45 22 2c       "TK_WHERE",
2f30: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2f50: 2c 0a 7d 3b 0a 0a 2f 2a 20 4e 75 6d 62 65 72 20  ,.};../* Number 
2f60: 6f 66 20 6b 65 79 77 6f 72 64 73 20 2a 2f 0a 73  of keywords */.s
2f70: 74 61 74 69 63 20 69 6e 74 20 6e 4b 65 79 77 6f  tatic int nKeywo
2f80: 72 64 20 3d 20 28 73 69 7a 65 6f 66 28 61 4b 65  rd = (sizeof(aKe
2f90: 79 77 6f 72 64 54 61 62 6c 65 29 2f 73 69 7a 65  ywordTable)/size
2fa0: 6f 66 28 61 4b 65 79 77 6f 72 64 54 61 62 6c 65  of(aKeywordTable
2fb0: 5b 30 5d 29 29 3b 0a 0a 2f 2a 20 41 6e 20 61 72  [0]));../* An ar
2fc0: 72 61 79 20 74 6f 20 6d 61 70 20 61 6c 6c 20 75  ray to map all u
2fd0: 70 70 65 72 2d 63 61 73 65 20 63 68 61 72 61 63  pper-case charac
2fe0: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 69 72 20  ters into their 
2ff0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
3000: 20 6c 6f 77 65 72 2d 63 61 73 65 20 63 68 61 72   lower-case char
3010: 61 63 74 65 72 2e 20 0a 2a 2f 0a 63 6f 6e 73 74  acter. .*/.const
3020: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
3030: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
3040: 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30  er[] = {.      0
3050: 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
3060: 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 38  ,  5,  6,  7,  8
3070: 2c 20 20 39 2c 20 31 30 2c 20 31 31 2c 20 31 32  ,  9, 10, 11, 12
3080: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
3090: 2c 20 31 37 2c 0a 20 20 20 20 20 31 38 2c 20 31  , 17,.     18, 1
30a0: 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32  9, 20, 21, 22, 2
30b0: 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 20 32  3, 24, 25, 26, 2
30c0: 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33  7, 28, 29, 30, 3
30d0: 31 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c 20 33  1, 32, 33, 34, 3
30e0: 35 2c 0a 20 20 20 20 20 33 36 2c 20 33 37 2c 20  5,.     36, 37, 
30f0: 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c 20  38, 39, 40, 41, 
3100: 34 32 2c 20 34 33 2c 20 34 34 2c 20 34 35 2c 20  42, 43, 44, 45, 
3110: 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 39 2c 20  46, 47, 48, 49, 
3120: 35 30 2c 20 35 31 2c 20 35 32 2c 20 35 33 2c 0a  50, 51, 52, 53,.
3130: 20 20 20 20 20 35 34 2c 20 35 35 2c 20 35 36 2c       54, 55, 56,
3140: 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 36 30 2c   57, 58, 59, 60,
3150: 20 36 31 2c 20 36 32 2c 20 36 33 2c 20 36 34 2c   61, 62, 63, 64,
3160: 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c   97, 98, 99,100,
3170: 31 30 31 2c 31 30 32 2c 31 30 33 2c 0a 20 20 20  101,102,103,.   
3180: 20 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37   104,105,106,107
3190: 2c 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31  ,108,109,110,111
31a0: 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35  ,112,113,114,115
31b0: 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39  ,116,117,118,119
31c0: 2c 31 32 30 2c 31 32 31 2c 0a 20 20 20 20 31 32  ,120,121,.    12
31d0: 32 2c 20 39 31 2c 20 39 32 2c 20 39 33 2c 20 39  2, 91, 92, 93, 9
31e0: 34 2c 20 39 35 2c 20 39 36 2c 20 39 37 2c 20 39  4, 95, 96, 97, 9
31f0: 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31 30  8, 99,100,101,10
3200: 32 2c 31 30 33 2c 31 30 34 2c 31 30 35 2c 31 30  2,103,104,105,10
3210: 36 2c 31 30 37 2c 0a 20 20 20 20 31 30 38 2c 31  6,107,.    108,1
3220: 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c 31  09,110,111,112,1
3230: 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c 31  13,114,115,116,1
3240: 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c 31  17,118,119,120,1
3250: 32 31 2c 31 32 32 2c 31 32 33 2c 31 32 34 2c 31  21,122,123,124,1
3260: 32 35 2c 0a 20 20 20 20 31 32 36 2c 31 32 37 2c  25,.    126,127,
3270: 31 32 38 2c 31 32 39 2c 31 33 30 2c 31 33 31 2c  128,129,130,131,
3280: 31 33 32 2c 31 33 33 2c 31 33 34 2c 31 33 35 2c  132,133,134,135,
3290: 31 33 36 2c 31 33 37 2c 31 33 38 2c 31 33 39 2c  136,137,138,139,
32a0: 31 34 30 2c 31 34 31 2c 31 34 32 2c 31 34 33 2c  140,141,142,143,
32b0: 0a 20 20 20 20 31 34 34 2c 31 34 35 2c 31 34 36  .    144,145,146
32c0: 2c 31 34 37 2c 31 34 38 2c 31 34 39 2c 31 35 30  ,147,148,149,150
32d0: 2c 31 35 31 2c 31 35 32 2c 31 35 33 2c 31 35 34  ,151,152,153,154
32e0: 2c 31 35 35 2c 31 35 36 2c 31 35 37 2c 31 35 38  ,155,156,157,158
32f0: 2c 31 35 39 2c 31 36 30 2c 31 36 31 2c 0a 20 20  ,159,160,161,.  
3300: 20 20 31 36 32 2c 31 36 33 2c 31 36 34 2c 31 36    162,163,164,16
3310: 35 2c 31 36 36 2c 31 36 37 2c 31 36 38 2c 31 36  5,166,167,168,16
3320: 39 2c 31 37 30 2c 31 37 31 2c 31 37 32 2c 31 37  9,170,171,172,17
3330: 33 2c 31 37 34 2c 31 37 35 2c 31 37 36 2c 31 37  3,174,175,176,17
3340: 37 2c 31 37 38 2c 31 37 39 2c 0a 20 20 20 20 31  7,178,179,.    1
3350: 38 30 2c 31 38 31 2c 31 38 32 2c 31 38 33 2c 31  80,181,182,183,1
3360: 38 34 2c 31 38 35 2c 31 38 36 2c 31 38 37 2c 31  84,185,186,187,1
3370: 38 38 2c 31 38 39 2c 31 39 30 2c 31 39 31 2c 31  88,189,190,191,1
3380: 39 32 2c 31 39 33 2c 31 39 34 2c 31 39 35 2c 31  92,193,194,195,1
3390: 39 36 2c 31 39 37 2c 0a 20 20 20 20 31 39 38 2c  96,197,.    198,
33a0: 31 39 39 2c 32 30 30 2c 32 30 31 2c 32 30 32 2c  199,200,201,202,
33b0: 32 30 33 2c 32 30 34 2c 32 30 35 2c 32 30 36 2c  203,204,205,206,
33c0: 32 30 37 2c 32 30 38 2c 32 30 39 2c 32 31 30 2c  207,208,209,210,
33d0: 32 31 31 2c 32 31 32 2c 32 31 33 2c 32 31 34 2c  211,212,213,214,
33e0: 32 31 35 2c 0a 20 20 20 20 32 31 36 2c 32 31 37  215,.    216,217
33f0: 2c 32 31 38 2c 32 31 39 2c 32 32 30 2c 32 32 31  ,218,219,220,221
3400: 2c 32 32 32 2c 32 32 33 2c 32 32 34 2c 32 32 35  ,222,223,224,225
3410: 2c 32 32 36 2c 32 32 37 2c 32 32 38 2c 32 32 39  ,226,227,228,229
3420: 2c 32 33 30 2c 32 33 31 2c 32 33 32 2c 32 33 33  ,230,231,232,233
3430: 2c 0a 20 20 20 20 32 33 34 2c 32 33 35 2c 32 33  ,.    234,235,23
3440: 36 2c 32 33 37 2c 32 33 38 2c 32 33 39 2c 32 34  6,237,238,239,24
3450: 30 2c 32 34 31 2c 32 34 32 2c 32 34 33 2c 32 34  0,241,242,243,24
3460: 34 2c 32 34 35 2c 32 34 36 2c 32 34 37 2c 32 34  4,245,246,247,24
3470: 38 2c 32 34 39 2c 32 35 30 2c 32 35 31 2c 0a 20  8,249,250,251,. 
3480: 20 20 20 32 35 32 2c 32 35 33 2c 32 35 34 2c 32     252,253,254,2
3490: 35 35 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 55 70  55.};.#define Up
34a0: 70 65 72 54 6f 4c 6f 77 65 72 20 73 71 6c 69 74  perToLower sqlit
34b0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 0a 0a  e3UpperToLower..
34c0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 69 6f  /*.** Comparisio
34d0: 6e 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74  n function for t
34e0: 77 6f 20 4b 65 79 77 6f 72 64 20 72 65 63 6f 72  wo Keyword recor
34f0: 64 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ds.*/.static int
3500: 20 6b 65 79 77 6f 72 64 43 6f 6d 70 61 72 65 31   keywordCompare1
3510: 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20  (const void *a, 
3520: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a  const void *b){.
3530: 20 20 63 6f 6e 73 74 20 4b 65 79 77 6f 72 64 20    const Keyword 
3540: 2a 70 41 20 3d 20 28 4b 65 79 77 6f 72 64 2a 29  *pA = (Keyword*)
3550: 61 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 77 6f  a;.  const Keywo
3560: 72 64 20 2a 70 42 20 3d 20 28 4b 65 79 77 6f 72  rd *pB = (Keywor
3570: 64 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  d*)b;.  int n = 
3580: 70 41 2d 3e 6c 65 6e 20 2d 20 70 42 2d 3e 6c 65  pA->len - pB->le
3590: 6e 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  n;.  if( n==0 ){
35a0: 0a 20 20 20 20 6e 20 3d 20 73 74 72 63 6d 70 28  .    n = strcmp(
35b0: 70 41 2d 3e 7a 4e 61 6d 65 2c 20 70 42 2d 3e 7a  pA->zName, pB->z
35c0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Name);.  }.  ret
35d0: 75 72 6e 20 6e 3b 0a 7d 0a 73 74 61 74 69 63 20  urn n;.}.static 
35e0: 69 6e 74 20 6b 65 79 77 6f 72 64 43 6f 6d 70 61  int keywordCompa
35f0: 72 65 32 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  re2(const void *
3600: 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62  a, const void *b
3610: 29 7b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 77 6f  ){.  const Keywo
3620: 72 64 20 2a 70 41 20 3d 20 28 4b 65 79 77 6f 72  rd *pA = (Keywor
3630: 64 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 4b 65  d*)a;.  const Ke
3640: 79 77 6f 72 64 20 2a 70 42 20 3d 20 28 4b 65 79  yword *pB = (Key
3650: 77 6f 72 64 2a 29 62 3b 0a 20 20 69 6e 74 20 6e  word*)b;.  int n
3660: 20 3d 20 70 42 2d 3e 6c 6f 6e 67 65 73 74 53 75   = pB->longestSu
3670: 66 66 69 78 20 2d 20 70 41 2d 3e 6c 6f 6e 67 65  ffix - pA->longe
3680: 73 74 53 75 66 66 69 78 3b 0a 20 20 69 66 28 20  stSuffix;.  if( 
3690: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20  n==0 ){.    n = 
36a0: 73 74 72 63 6d 70 28 70 41 2d 3e 7a 4e 61 6d 65  strcmp(pA->zName
36b0: 2c 20 70 42 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  , pB->zName);.  
36c0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
36d0: 73 74 61 74 69 63 20 69 6e 74 20 6b 65 79 77 6f  static int keywo
36e0: 72 64 43 6f 6d 70 61 72 65 33 28 63 6f 6e 73 74  rdCompare3(const
36f0: 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20   void *a, const 
3700: 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73  void *b){.  cons
3710: 74 20 4b 65 79 77 6f 72 64 20 2a 70 41 20 3d 20  t Keyword *pA = 
3720: 28 4b 65 79 77 6f 72 64 2a 29 61 3b 0a 20 20 63  (Keyword*)a;.  c
3730: 6f 6e 73 74 20 4b 65 79 77 6f 72 64 20 2a 70 42  onst Keyword *pB
3740: 20 3d 20 28 4b 65 79 77 6f 72 64 2a 29 62 3b 0a   = (Keyword*)b;.
3750: 20 20 69 6e 74 20 6e 20 3d 20 70 41 2d 3e 6f 66    int n = pA->of
3760: 66 73 65 74 20 2d 20 70 42 2d 3e 6f 66 66 73 65  fset - pB->offse
3770: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  t;.  return n;.}
3780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3790: 20 4b 65 79 77 6f 72 64 54 61 62 6c 65 20 65 6e   KeywordTable en
37a0: 74 72 79 20 77 69 74 68 20 74 68 65 20 67 69 76  try with the giv
37b0: 65 6e 20 69 64 0a 2a 2f 0a 73 74 61 74 69 63 20  en id.*/.static 
37c0: 4b 65 79 77 6f 72 64 20 2a 66 69 6e 64 42 79 49  Keyword *findByI
37d0: 64 28 69 6e 74 20 69 64 29 7b 0a 20 20 69 6e 74  d(int id){.  int
37e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
37f0: 3c 6e 4b 65 79 77 6f 72 64 3b 20 69 2b 2b 29 7b  <nKeyword; i++){
3800: 0a 20 20 20 20 69 66 28 20 61 4b 65 79 77 6f 72  .    if( aKeywor
3810: 64 54 61 62 6c 65 5b 69 5d 2e 69 64 3d 3d 69 64  dTable[i].id==id
3820: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
3830: 72 65 74 75 72 6e 20 26 61 4b 65 79 77 6f 72 64  return &aKeyword
3840: 54 61 62 6c 65 5b 69 5d 3b 0a 7d 0a 0a 2f 2a 0a  Table[i];.}../*.
3850: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3860: 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 2e 20 20  does the work.  
3870: 54 68 65 20 67 65 6e 65 72 61 74 65 64 20 63 6f  The generated co
3880: 64 65 20 69 73 20 70 72 69 6e 74 65 64 20 6f 6e  de is printed on
3890: 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 6f 75 74   standard.** out
38a0: 70 75 74 2e 0a 2a 2f 0a 69 6e 74 20 6d 61 69 6e  put..*/.int main
38b0: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
38c0: 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69  **argv){.  int i
38d0: 2c 20 6a 2c 20 6b 2c 20 68 3b 0a 20 20 69 6e 74  , j, k, h;.  int
38e0: 20 62 65 73 74 53 69 7a 65 2c 20 62 65 73 74 43   bestSize, bestC
38f0: 6f 75 6e 74 3b 0a 20 20 69 6e 74 20 63 6f 75 6e  ount;.  int coun
3900: 74 3b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  t;.  int nChar;.
3910: 20 20 69 6e 74 20 74 6f 74 61 6c 4c 65 6e 20 3d    int totalLen =
3920: 20 30 3b 0a 20 20 69 6e 74 20 61 48 61 73 68 5b   0;.  int aHash[
3930: 31 30 30 30 5d 3b 20 20 2f 2a 20 31 30 30 30 20  1000];  /* 1000 
3940: 69 73 20 6d 75 63 68 20 62 69 67 67 65 72 20 74  is much bigger t
3950: 68 61 6e 20 6e 4b 65 79 77 6f 72 64 20 2a 2f 0a  han nKeyword */.
3960: 20 20 63 68 61 72 20 7a 54 65 78 74 5b 32 30 30    char zText[200
3970: 30 5d 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  0];..  /* Remove
3980: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
3990: 65 20 6c 69 73 74 20 6f 66 20 6b 65 79 77 6f 72  e list of keywor
39a0: 64 73 20 74 68 61 74 20 68 61 76 65 20 6d 61 73  ds that have mas
39b0: 6b 3d 3d 30 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  k==0 */.  for(i=
39c0: 6a 3d 30 3b 20 69 3c 6e 4b 65 79 77 6f 72 64 3b  j=0; i<nKeyword;
39d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
39e0: 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 2e  KeywordTable[i].
39f0: 6d 61 73 6b 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  mask==0 ) contin
3a00: 75 65 3b 0a 20 20 20 20 69 66 28 20 6a 3c 69 20  ue;.    if( j<i 
3a10: 29 7b 0a 20 20 20 20 20 20 61 4b 65 79 77 6f 72  ){.      aKeywor
3a20: 64 54 61 62 6c 65 5b 6a 5d 20 3d 20 61 4b 65 79  dTable[j] = aKey
3a30: 77 6f 72 64 54 61 62 6c 65 5b 69 5d 3b 0a 20 20  wordTable[i];.  
3a40: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
3a50: 0a 20 20 6e 4b 65 79 77 6f 72 64 20 3d 20 6a 3b  .  nKeyword = j;
3a60: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
3a70: 68 65 20 6c 65 6e 67 74 68 73 20 6f 66 20 73 74  he lengths of st
3a80: 72 69 6e 67 73 20 61 6e 64 20 68 61 73 68 65 73  rings and hashes
3a90: 20 66 6f 72 20 61 6c 6c 20 65 6e 74 72 69 65 73   for all entries
3aa0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
3ab0: 69 3c 6e 4b 65 79 77 6f 72 64 3b 20 69 2b 2b 29  i<nKeyword; i++)
3ac0: 7b 0a 20 20 20 20 4b 65 79 77 6f 72 64 20 2a 70  {.    Keyword *p
3ad0: 20 3d 20 26 61 4b 65 79 77 6f 72 64 54 61 62 6c   = &aKeywordTabl
3ae0: 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 6c 65 6e  e[i];.    p->len
3af0: 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61   = strlen(p->zNa
3b00: 6d 65 29 3b 0a 20 20 20 20 74 6f 74 61 6c 4c 65  me);.    totalLe
3b10: 6e 20 2b 3d 20 70 2d 3e 6c 65 6e 3b 0a 20 20 20  n += p->len;.   
3b20: 20 70 2d 3e 68 61 73 68 20 3d 20 28 55 70 70 65   p->hash = (Uppe
3b30: 72 54 6f 4c 6f 77 65 72 5b 28 69 6e 74 29 70 2d  rToLower[(int)p-
3b40: 3e 7a 4e 61 6d 65 5b 30 5d 5d 2a 34 29 20 5e 0a  >zName[0]]*4) ^.
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 55                (U
3b60: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 69 6e 74  pperToLower[(int
3b70: 29 70 2d 3e 7a 4e 61 6d 65 5b 70 2d 3e 6c 65 6e  )p->zName[p->len
3b80: 2d 31 5d 5d 2a 33 29 20 5e 20 70 2d 3e 6c 65 6e  -1]]*3) ^ p->len
3b90: 3b 0a 20 20 20 20 70 2d 3e 69 64 20 3d 20 69 2b  ;.    p->id = i+
3ba0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 6f 72  1;.  }..  /* Sor
3bb0: 74 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  t the table from
3bc0: 20 73 68 6f 72 74 65 73 74 20 74 6f 20 6c 6f 6e   shortest to lon
3bd0: 67 65 73 74 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  gest keyword */.
3be0: 20 20 71 73 6f 72 74 28 61 4b 65 79 77 6f 72 64    qsort(aKeyword
3bf0: 54 61 62 6c 65 2c 20 6e 4b 65 79 77 6f 72 64 2c  Table, nKeyword,
3c00: 20 73 69 7a 65 6f 66 28 61 4b 65 79 77 6f 72 64   sizeof(aKeyword
3c10: 54 61 62 6c 65 5b 30 5d 29 2c 20 6b 65 79 77 6f  Table[0]), keywo
3c20: 72 64 43 6f 6d 70 61 72 65 31 29 3b 0a 0a 20 20  rdCompare1);..  
3c30: 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 73 68 6f 72  /* Look for shor
3c40: 74 20 6b 65 79 77 6f 72 64 73 20 65 6d 62 65 64  t keywords embed
3c50: 64 65 64 20 69 6e 20 6c 6f 6e 67 65 72 20 6b 65  ded in longer ke
3c60: 79 77 6f 72 64 73 20 2a 2f 0a 20 20 66 6f 72 28  ywords */.  for(
3c70: 69 3d 6e 4b 65 79 77 6f 72 64 2d 32 3b 20 69 3e  i=nKeyword-2; i>
3c80: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 4b 65  =0; i--){.    Ke
3c90: 79 77 6f 72 64 20 2a 70 20 3d 20 26 61 4b 65 79  yword *p = &aKey
3ca0: 77 6f 72 64 54 61 62 6c 65 5b 69 5d 3b 0a 20 20  wordTable[i];.  
3cb0: 20 20 66 6f 72 28 6a 3d 6e 4b 65 79 77 6f 72 64    for(j=nKeyword
3cc0: 2d 31 3b 20 6a 3e 69 20 26 26 20 70 2d 3e 73 75  -1; j>i && p->su
3cd0: 62 73 74 72 49 64 3d 3d 30 3b 20 6a 2d 2d 29 7b  bstrId==0; j--){
3ce0: 0a 20 20 20 20 20 20 4b 65 79 77 6f 72 64 20 2a  .      Keyword *
3cf0: 70 4f 74 68 65 72 20 3d 20 26 61 4b 65 79 77 6f  pOther = &aKeywo
3d00: 72 64 54 61 62 6c 65 5b 6a 5d 3b 0a 20 20 20 20  rdTable[j];.    
3d10: 20 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 73 75    if( pOther->su
3d20: 62 73 74 72 49 64 20 29 20 63 6f 6e 74 69 6e 75  bstrId ) continu
3d30: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 74  e;.      if( pOt
3d40: 68 65 72 2d 3e 6c 65 6e 3c 3d 70 2d 3e 6c 65 6e  her->len<=p->len
3d50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3d60: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 70     for(k=0; k<=p
3d70: 4f 74 68 65 72 2d 3e 6c 65 6e 2d 70 2d 3e 6c 65  Other->len-p->le
3d80: 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; k++){.       
3d90: 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 2d 3e 7a   if( memcmp(p->z
3da0: 4e 61 6d 65 2c 20 26 70 4f 74 68 65 72 2d 3e 7a  Name, &pOther->z
3db0: 4e 61 6d 65 5b 6b 5d 2c 20 70 2d 3e 6c 65 6e 29  Name[k], p->len)
3dc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
3dd0: 20 70 2d 3e 73 75 62 73 74 72 49 64 20 3d 20 70   p->substrId = p
3de0: 4f 74 68 65 72 2d 3e 69 64 3b 0a 20 20 20 20 20  Other->id;.     
3df0: 20 20 20 20 20 70 2d 3e 73 75 62 73 74 72 4f 66       p->substrOf
3e00: 66 73 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20  fset = k;.      
3e10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3e20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3e30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
3e40: 70 75 74 65 20 74 68 65 20 6c 6f 6e 67 65 73 74  pute the longest
3e50: 53 75 66 66 69 78 20 76 61 6c 75 65 20 66 6f 72  Suffix value for
3e60: 20 65 76 65 72 79 20 77 6f 72 64 20 2a 2f 0a 20   every word */. 
3e70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79   for(i=0; i<nKey
3e80: 77 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  word; i++){.    
3e90: 4b 65 79 77 6f 72 64 20 2a 70 20 3d 20 26 61 4b  Keyword *p = &aK
3ea0: 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 3b 0a  eywordTable[i];.
3eb0: 20 20 20 20 69 66 28 20 70 2d 3e 73 75 62 73 74      if( p->subst
3ec0: 72 49 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rId ) continue;.
3ed0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
3ee0: 4b 65 79 77 6f 72 64 3b 20 6a 2b 2b 29 7b 0a 20  Keyword; j++){. 
3ef0: 20 20 20 20 20 4b 65 79 77 6f 72 64 20 2a 70 4f       Keyword *pO
3f00: 74 68 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  ther;.      if( 
3f10: 6a 3d 3d 69 20 29 20 63 6f 6e 74 69 6e 75 65 3b  j==i ) continue;
3f20: 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
3f30: 26 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 6a  &aKeywordTable[j
3f40: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 74  ];.      if( pOt
3f50: 68 65 72 2d 3e 73 75 62 73 74 72 49 64 20 29 20  her->substrId ) 
3f60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3f70: 66 6f 72 28 6b 3d 70 2d 3e 6c 6f 6e 67 65 73 74  for(k=p->longest
3f80: 53 75 66 66 69 78 2b 31 3b 20 6b 3c 70 2d 3e 6c  Suffix+1; k<p->l
3f90: 65 6e 20 26 26 20 6b 3c 70 4f 74 68 65 72 2d 3e  en && k<pOther->
3fa0: 6c 65 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  len; k++){.     
3fb0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
3fc0: 2d 3e 7a 4e 61 6d 65 5b 70 2d 3e 6c 65 6e 2d 6b  ->zName[p->len-k
3fd0: 5d 2c 20 70 4f 74 68 65 72 2d 3e 7a 4e 61 6d 65  ], pOther->zName
3fe0: 2c 20 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , k)==0 ){.     
3ff0: 20 20 20 20 20 70 2d 3e 6c 6f 6e 67 65 73 74 53       p->longestS
4000: 75 66 66 69 78 20 3d 20 6b 3b 0a 20 20 20 20 20  uffix = k;.     
4010: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4020: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 6f 72   }.  }..  /* Sor
4030: 74 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  t the table into
4040: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 62   reverse order b
4050: 79 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 71 73  y length */.  qs
4060: 6f 72 74 28 61 4b 65 79 77 6f 72 64 54 61 62 6c  ort(aKeywordTabl
4070: 65 2c 20 6e 4b 65 79 77 6f 72 64 2c 20 73 69 7a  e, nKeyword, siz
4080: 65 6f 66 28 61 4b 65 79 77 6f 72 64 54 61 62 6c  eof(aKeywordTabl
4090: 65 5b 30 5d 29 2c 20 6b 65 79 77 6f 72 64 43 6f  e[0]), keywordCo
40a0: 6d 70 61 72 65 32 29 3b 0a 0a 20 20 2f 2a 20 46  mpare2);..  /* F
40b0: 69 6c 6c 20 69 6e 20 74 68 65 20 6f 66 66 73 65  ill in the offse
40c0: 74 20 66 6f 72 20 61 6c 6c 20 65 6e 74 72 69 65  t for all entrie
40d0: 73 20 2a 2f 0a 20 20 6e 43 68 61 72 20 3d 20 30  s */.  nChar = 0
40e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
40f0: 4b 65 79 77 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20  Keyword; i++){. 
4100: 20 20 20 4b 65 79 77 6f 72 64 20 2a 70 20 3d 20     Keyword *p = 
4110: 26 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69  &aKeywordTable[i
4120: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 66  ];.    if( p->of
4130: 66 73 65 74 3e 30 20 7c 7c 20 70 2d 3e 73 75 62  fset>0 || p->sub
4140: 73 74 72 49 64 20 29 20 63 6f 6e 74 69 6e 75 65  strId ) continue
4150: 3b 0a 20 20 20 20 70 2d 3e 6f 66 66 73 65 74 20  ;.    p->offset 
4160: 3d 20 6e 43 68 61 72 3b 0a 20 20 20 20 6e 43 68  = nChar;.    nCh
4170: 61 72 20 2b 3d 20 70 2d 3e 6c 65 6e 3b 0a 20 20  ar += p->len;.  
4180: 20 20 66 6f 72 28 6b 3d 70 2d 3e 6c 65 6e 2d 31    for(k=p->len-1
4190: 3b 20 6b 3e 3d 31 3b 20 6b 2d 2d 29 7b 0a 20 20  ; k>=1; k--){.  
41a0: 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
41b0: 3c 6e 4b 65 79 77 6f 72 64 3b 20 6a 2b 2b 29 7b  <nKeyword; j++){
41c0: 0a 20 20 20 20 20 20 20 20 4b 65 79 77 6f 72 64  .        Keyword
41d0: 20 2a 70 4f 74 68 65 72 20 3d 20 26 61 4b 65 79   *pOther = &aKey
41e0: 77 6f 72 64 54 61 62 6c 65 5b 6a 5d 3b 0a 20 20  wordTable[j];.  
41f0: 20 20 20 20 20 20 69 66 28 20 70 4f 74 68 65 72        if( pOther
4200: 2d 3e 6f 66 66 73 65 74 3e 30 20 7c 7c 20 70 4f  ->offset>0 || pO
4210: 74 68 65 72 2d 3e 73 75 62 73 74 72 49 64 20 29  ther->substrId )
4220: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4230: 20 20 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6c     if( pOther->l
4240: 65 6e 3c 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65  en<=k ) continue
4250: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ;.        if( me
4260: 6d 63 6d 70 28 26 70 2d 3e 7a 4e 61 6d 65 5b 70  mcmp(&p->zName[p
4270: 2d 3e 6c 65 6e 2d 6b 5d 2c 20 70 4f 74 68 65 72  ->len-k], pOther
4280: 2d 3e 7a 4e 61 6d 65 2c 20 6b 29 3d 3d 30 20 29  ->zName, k)==0 )
4290: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 20 3d 20  {.          p = 
42a0: 70 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20  pOther;.        
42b0: 20 20 70 2d 3e 6f 66 66 73 65 74 20 3d 20 6e 43    p->offset = nC
42c0: 68 61 72 20 2d 20 6b 3b 0a 20 20 20 20 20 20 20  har - k;.       
42d0: 20 20 20 6e 43 68 61 72 20 3d 20 70 2d 3e 6f 66     nChar = p->of
42e0: 66 73 65 74 20 2b 20 70 2d 3e 6c 65 6e 3b 0a 20  fset + p->len;. 
42f0: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d           p->zNam
4300: 65 20 2b 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  e += k;.        
4310: 20 20 70 2d 3e 6c 65 6e 20 2d 3d 20 6b 3b 0a 20    p->len -= k;. 
4320: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 72 65 66           p->pref
4330: 69 78 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  ix = k;.        
4340: 20 20 6a 20 3d 20 69 3b 0a 20 20 20 20 20 20 20    j = i;.       
4350: 20 20 20 6b 20 3d 20 70 2d 3e 6c 65 6e 3b 0a 20     k = p->len;. 
4360: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
4380: 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 77 6f 72 64  (i=0; i<nKeyword
4390: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4b 65 79 77  ; i++){.    Keyw
43a0: 6f 72 64 20 2a 70 20 3d 20 26 61 4b 65 79 77 6f  ord *p = &aKeywo
43b0: 72 64 54 61 62 6c 65 5b 69 5d 3b 0a 20 20 20 20  rdTable[i];.    
43c0: 69 66 28 20 70 2d 3e 73 75 62 73 74 72 49 64 20  if( p->substrId 
43d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 66 66 73  ){.      p->offs
43e0: 65 74 20 3d 20 66 69 6e 64 42 79 49 64 28 70 2d  et = findById(p-
43f0: 3e 73 75 62 73 74 72 49 64 29 2d 3e 6f 66 66 73  >substrId)->offs
4400: 65 74 20 2b 20 70 2d 3e 73 75 62 73 74 72 4f 66  et + p->substrOf
4410: 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fset;.    }.  }.
4420: 0a 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 74  .  /* Sort the t
4430: 61 62 6c 65 20 62 79 20 6f 66 66 73 65 74 20 2a  able by offset *
4440: 2f 0a 20 20 71 73 6f 72 74 28 61 4b 65 79 77 6f  /.  qsort(aKeywo
4450: 72 64 54 61 62 6c 65 2c 20 6e 4b 65 79 77 6f 72  rdTable, nKeywor
4460: 64 2c 20 73 69 7a 65 6f 66 28 61 4b 65 79 77 6f  d, sizeof(aKeywo
4470: 72 64 54 61 62 6c 65 5b 30 5d 29 2c 20 6b 65 79  rdTable[0]), key
4480: 77 6f 72 64 43 6f 6d 70 61 72 65 33 29 3b 0a 0a  wordCompare3);..
4490: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
44a0: 68 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20  how big to make 
44b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69  the hash table i
44c0: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 69 6e 69 6d  n order to minim
44d0: 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d  ize the.  ** num
44e0: 62 65 72 20 6f 66 20 63 6f 6c 6c 69 73 69 6f 6e  ber of collision
44f0: 73 20 2a 2f 0a 20 20 62 65 73 74 53 69 7a 65 20  s */.  bestSize 
4500: 3d 20 6e 4b 65 79 77 6f 72 64 3b 0a 20 20 62 65  = nKeyword;.  be
4510: 73 74 43 6f 75 6e 74 20 3d 20 6e 4b 65 79 77 6f  stCount = nKeywo
4520: 72 64 2a 6e 4b 65 79 77 6f 72 64 3b 0a 20 20 66  rd*nKeyword;.  f
4530: 6f 72 28 69 3d 6e 4b 65 79 77 6f 72 64 2f 32 3b  or(i=nKeyword/2;
4540: 20 69 3c 3d 32 2a 6e 4b 65 79 77 6f 72 64 3b 20   i<=2*nKeyword; 
4550: 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  i++){.    for(j=
4560: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20 61 48 61  0; j<i; j++) aHa
4570: 73 68 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 66  sh[j] = 0;.    f
4580: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 4b 65 79 77 6f  or(j=0; j<nKeywo
4590: 72 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  rd; j++){.      
45a0: 68 20 3d 20 61 4b 65 79 77 6f 72 64 54 61 62 6c  h = aKeywordTabl
45b0: 65 5b 6a 5d 2e 68 61 73 68 20 25 20 69 3b 0a 20  e[j].hash % i;. 
45c0: 20 20 20 20 20 61 48 61 73 68 5b 68 5d 20 2a 3d       aHash[h] *=
45d0: 20 32 3b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   2;.      aHash[
45e0: 68 5d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  h]++;.    }.    
45f0: 66 6f 72 28 6a 3d 63 6f 75 6e 74 3d 30 3b 20 6a  for(j=count=0; j
4600: 3c 69 3b 20 6a 2b 2b 29 20 63 6f 75 6e 74 20 2b  <i; j++) count +
4610: 3d 20 61 48 61 73 68 5b 6a 5d 3b 0a 20 20 20 20  = aHash[j];.    
4620: 69 66 28 20 63 6f 75 6e 74 3c 62 65 73 74 43 6f  if( count<bestCo
4630: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 62 65 73  unt ){.      bes
4640: 74 43 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a  tCount = count;.
4650: 20 20 20 20 20 20 62 65 73 74 53 69 7a 65 20 3d        bestSize =
4660: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   i;.    }.  }.. 
4670: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
4680: 68 61 73 68 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  hash */.  for(i=
4690: 30 3b 20 69 3c 62 65 73 74 53 69 7a 65 3b 20 69  0; i<bestSize; i
46a0: 2b 2b 29 20 61 48 61 73 68 5b 69 5d 20 3d 20 30  ++) aHash[i] = 0
46b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
46c0: 4b 65 79 77 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20  Keyword; i++){. 
46d0: 20 20 20 68 20 3d 20 61 4b 65 79 77 6f 72 64 54     h = aKeywordT
46e0: 61 62 6c 65 5b 69 5d 2e 68 61 73 68 20 25 20 62  able[i].hash % b
46f0: 65 73 74 53 69 7a 65 3b 0a 20 20 20 20 61 4b 65  estSize;.    aKe
4700: 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 2e 69 4e  ywordTable[i].iN
4710: 65 78 74 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a  ext = aHash[h];.
4720: 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 69      aHash[h] = i
4730: 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  +1;.  }..  /* Be
4740: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
4750: 6f 64 65 20 2a 2f 0a 20 20 70 72 69 6e 74 66 28  ode */.  printf(
4760: 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 70  "%s", zHdr);.  p
4770: 72 69 6e 74 66 28 22 2f 2a 20 48 61 73 68 20 73  rintf("/* Hash s
4780: 63 6f 72 65 3a 20 25 64 20 2a 2f 5c 6e 22 2c 20  core: %d */\n", 
4790: 62 65 73 74 43 6f 75 6e 74 29 3b 0a 20 20 70 72  bestCount);.  pr
47a0: 69 6e 74 66 28 22 73 74 61 74 69 63 20 69 6e 74  intf("static int
47b0: 20 6b 65 79 77 6f 72 64 43 6f 64 65 28 63 6f 6e   keywordCode(con
47c0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
47d0: 6e 29 7b 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74  n){\n");.  print
47e0: 66 28 22 20 20 2f 2a 20 7a 54 65 78 74 5b 5d 20  f("  /* zText[] 
47f0: 65 6e 63 6f 64 65 73 20 25 64 20 62 79 74 65 73  encodes %d bytes
4800: 20 6f 66 20 6b 65 79 77 6f 72 64 73 20 69 6e 20   of keywords in 
4810: 25 64 20 62 79 74 65 73 20 2a 2f 5c 6e 22 2c 0a  %d bytes */\n",.
4820: 20 20 20 20 20 20 20 20 20 20 74 6f 74 61 6c 4c            totalL
4830: 65 6e 20 2b 20 6e 4b 65 79 77 6f 72 64 2c 20 6e  en + nKeyword, n
4840: 43 68 61 72 2b 31 20 29 3b 0a 20 20 66 6f 72 28  Char+1 );.  for(
4850: 69 3d 6a 3d 6b 3d 30 3b 20 69 3c 6e 4b 65 79 77  i=j=k=0; i<nKeyw
4860: 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4b  ord; i++){.    K
4870: 65 79 77 6f 72 64 20 2a 70 20 3d 20 26 61 4b 65  eyword *p = &aKe
4880: 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 3b 0a 20  ywordTable[i];. 
4890: 20 20 20 69 66 28 20 70 2d 3e 73 75 62 73 74 72     if( p->substr
48a0: 49 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  Id ) continue;. 
48b0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 78 74     memcpy(&zText
48c0: 5b 6b 5d 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  [k], p->zName, p
48d0: 2d 3e 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  ->len);.    k +=
48e0: 20 70 2d 3e 6c 65 6e 3b 0a 20 20 20 20 69 66 28   p->len;.    if(
48f0: 20 6a 2b 70 2d 3e 6c 65 6e 3e 37 30 20 29 7b 0a   j+p->len>70 ){.
4900: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 2a        printf("%*
4910: 73 20 2a 2f 5c 6e 22 2c 20 37 34 2d 6a 2c 20 22  s */\n", 74-j, "
4920: 22 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ");.      j = 0;
4930: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
4940: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69  ==0 ){.      pri
4950: 6e 74 66 28 22 20 20 2f 2a 20 20 20 22 29 3b 0a  ntf("  /*   ");.
4960: 20 20 20 20 20 20 6a 20 3d 20 38 3b 0a 20 20 20        j = 8;.   
4970: 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25   }.    printf("%
4980: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
4990: 20 20 20 6a 20 2b 3d 20 70 2d 3e 6c 65 6e 3b 0a     j += p->len;.
49a0: 20 20 7d 0a 20 20 69 66 28 20 6a 3e 30 20 29 7b    }.  if( j>0 ){
49b0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 2a 73  .    printf("%*s
49c0: 20 2a 2f 5c 6e 22 2c 20 37 34 2d 6a 2c 20 22 22   */\n", 74-j, ""
49d0: 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28  );.  }.  printf(
49e0: 22 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  "  static const 
49f0: 63 68 61 72 20 7a 54 65 78 74 5b 25 64 5d 20 3d  char zText[%d] =
4a00: 20 7b 5c 6e 22 2c 20 6e 43 68 61 72 29 3b 0a 20   {\n", nChar);. 
4a10: 20 7a 54 65 78 74 5b 6e 43 68 61 72 5d 20 3d 20   zText[nChar] = 
4a20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
4a30: 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<k; i++){.    i
4a40: 66 28 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( j==0 ){.     
4a50: 20 70 72 69 6e 74 66 28 22 20 20 20 20 22 29 3b   printf("    ");
4a60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
4a70: 54 65 78 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  Text[i]==0 ){.  
4a80: 20 20 20 20 70 72 69 6e 74 66 28 22 30 22 29 3b      printf("0");
4a90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4aa0: 20 20 70 72 69 6e 74 66 28 22 27 25 63 27 2c 22    printf("'%c',"
4ab0: 2c 20 7a 54 65 78 74 5b 69 5d 29 3b 0a 20 20 20  , zText[i]);.   
4ac0: 20 7d 0a 20 20 20 20 6a 20 2b 3d 20 34 3b 0a 20   }.    j += 4;. 
4ad0: 20 20 20 69 66 28 20 6a 3e 36 38 20 29 7b 0a 20     if( j>68 ){. 
4ae0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22       printf("\n"
4af0: 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  );.      j = 0;.
4b00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4b10: 6a 3e 30 20 29 20 70 72 69 6e 74 66 28 22 5c 6e  j>0 ) printf("\n
4b20: 22 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20  ");.  printf("  
4b30: 7d 3b 5c 6e 22 29 3b 0a 0a 20 20 70 72 69 6e 74  };\n");..  print
4b40: 66 28 22 20 20 73 74 61 74 69 63 20 63 6f 6e 73  f("  static cons
4b50: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4b60: 61 48 61 73 68 5b 25 64 5d 20 3d 20 7b 5c 6e 22  aHash[%d] = {\n"
4b70: 2c 20 62 65 73 74 53 69 7a 65 29 3b 0a 20 20 66  , bestSize);.  f
4b80: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 62 65 73 74  or(i=j=0; i<best
4b90: 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Size; i++){.    
4ba0: 69 66 28 20 6a 3d 3d 30 20 29 20 70 72 69 6e 74  if( j==0 ) print
4bb0: 66 28 22 20 20 20 20 22 29 3b 0a 20 20 20 20 70  f("    ");.    p
4bc0: 72 69 6e 74 66 28 22 20 25 33 64 2c 22 2c 20 61  rintf(" %3d,", a
4bd0: 48 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 6a 2b  Hash[i]);.    j+
4be0: 2b 3b 0a 20 20 20 20 69 66 28 20 6a 3e 31 32 20  +;.    if( j>12 
4bf0: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
4c00: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 6a 20 3d  "\n");.      j =
4c10: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
4c20: 70 72 69 6e 74 66 28 22 25 73 20 20 7d 3b 5c 6e  printf("%s  };\n
4c30: 22 2c 20 6a 3d 3d 30 20 3f 20 22 22 20 3a 20 22  ", j==0 ? "" : "
4c40: 5c 6e 22 29 3b 20 20 20 20 0a 0a 20 20 70 72 69  \n");    ..  pri
4c50: 6e 74 66 28 22 20 20 73 74 61 74 69 63 20 63 6f  ntf("  static co
4c60: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4c70: 72 20 61 4e 65 78 74 5b 25 64 5d 20 3d 20 7b 5c  r aNext[%d] = {\
4c80: 6e 22 2c 20 6e 4b 65 79 77 6f 72 64 29 3b 0a 20  n", nKeyword);. 
4c90: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 4b   for(i=j=0; i<nK
4ca0: 65 79 77 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20 20  eyword; i++){.  
4cb0: 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 70 72 69    if( j==0 ) pri
4cc0: 6e 74 66 28 22 20 20 20 20 22 29 3b 0a 20 20 20  ntf("    ");.   
4cd0: 20 70 72 69 6e 74 66 28 22 20 25 33 64 2c 22 2c   printf(" %3d,",
4ce0: 20 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69   aKeywordTable[i
4cf0: 5d 2e 69 4e 65 78 74 29 3b 0a 20 20 20 20 6a 2b  ].iNext);.    j+
4d00: 2b 3b 0a 20 20 20 20 69 66 28 20 6a 3e 31 32 20  +;.    if( j>12 
4d10: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
4d20: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 6a 20 3d  "\n");.      j =
4d30: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
4d40: 70 72 69 6e 74 66 28 22 25 73 20 20 7d 3b 5c 6e  printf("%s  };\n
4d50: 22 2c 20 6a 3d 3d 30 20 3f 20 22 22 20 3a 20 22  ", j==0 ? "" : "
4d60: 5c 6e 22 29 3b 20 20 20 20 0a 0a 20 20 70 72 69  \n");    ..  pri
4d70: 6e 74 66 28 22 20 20 73 74 61 74 69 63 20 63 6f  ntf("  static co
4d80: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4d90: 72 20 61 4c 65 6e 5b 25 64 5d 20 3d 20 7b 5c 6e  r aLen[%d] = {\n
4da0: 22 2c 20 6e 4b 65 79 77 6f 72 64 29 3b 0a 20 20  ", nKeyword);.  
4db0: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 4b 65  for(i=j=0; i<nKe
4dc0: 79 77 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  yword; i++){.   
4dd0: 20 69 66 28 20 6a 3d 3d 30 20 29 20 70 72 69 6e   if( j==0 ) prin
4de0: 74 66 28 22 20 20 20 20 22 29 3b 0a 20 20 20 20  tf("    ");.    
4df0: 70 72 69 6e 74 66 28 22 20 25 33 64 2c 22 2c 20  printf(" %3d,", 
4e00: 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d  aKeywordTable[i]
4e10: 2e 6c 65 6e 2b 61 4b 65 79 77 6f 72 64 54 61 62  .len+aKeywordTab
4e20: 6c 65 5b 69 5d 2e 70 72 65 66 69 78 29 3b 0a 20  le[i].prefix);. 
4e30: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 69 66 28 20     j++;.    if( 
4e40: 6a 3e 31 32 20 29 7b 0a 20 20 20 20 20 20 70 72  j>12 ){.      pr
4e50: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
4e60: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    j = 0;.    }. 
4e70: 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 25 73 20   }.  printf("%s 
4e80: 20 7d 3b 5c 6e 22 2c 20 6a 3d 3d 30 20 3f 20 22   };\n", j==0 ? "
4e90: 22 20 3a 20 22 5c 6e 22 29 3b 20 20 20 20 0a 0a  " : "\n");    ..
4ea0: 20 20 70 72 69 6e 74 66 28 22 20 20 73 74 61 74    printf("  stat
4eb0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
4ec0: 64 20 73 68 6f 72 74 20 69 6e 74 20 61 4f 66 66  d short int aOff
4ed0: 73 65 74 5b 25 64 5d 20 3d 20 7b 5c 6e 22 2c 20  set[%d] = {\n", 
4ee0: 6e 4b 65 79 77 6f 72 64 29 3b 0a 20 20 66 6f 72  nKeyword);.  for
4ef0: 28 69 3d 6a 3d 30 3b 20 69 3c 6e 4b 65 79 77 6f  (i=j=0; i<nKeywo
4f00: 72 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rd; i++){.    if
4f10: 28 20 6a 3d 3d 30 20 29 20 70 72 69 6e 74 66 28  ( j==0 ) printf(
4f20: 22 20 20 20 20 22 29 3b 0a 20 20 20 20 70 72 69  "    ");.    pri
4f30: 6e 74 66 28 22 20 25 33 64 2c 22 2c 20 61 4b 65  ntf(" %3d,", aKe
4f40: 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 2e 6f 66  ywordTable[i].of
4f50: 66 73 65 74 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  fset);.    j++;.
4f60: 20 20 20 20 69 66 28 20 6a 3e 31 32 20 29 7b 0a      if( j>12 ){.
4f70: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e        printf("\n
4f80: 22 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ");.      j = 0;
4f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 72 69  .    }.  }.  pri
4fa0: 6e 74 66 28 22 25 73 20 20 7d 3b 5c 6e 22 2c 20  ntf("%s  };\n", 
4fb0: 6a 3d 3d 30 20 3f 20 22 22 20 3a 20 22 5c 6e 22  j==0 ? "" : "\n"
4fc0: 29 3b 0a 0a 20 20 70 72 69 6e 74 66 28 22 20 20  );..  printf("  
4fd0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
4fe0: 69 67 6e 65 64 20 63 68 61 72 20 61 43 6f 64 65  igned char aCode
4ff0: 5b 25 64 5d 20 3d 20 7b 5c 6e 22 2c 20 6e 4b 65  [%d] = {\n", nKe
5000: 79 77 6f 72 64 29 3b 0a 20 20 66 6f 72 28 69 3d  yword);.  for(i=
5010: 6a 3d 30 3b 20 69 3c 6e 4b 65 79 77 6f 72 64 3b  j=0; i<nKeyword;
5020: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
5030: 2a 7a 54 6f 6b 65 6e 20 3d 20 61 4b 65 79 77 6f  *zToken = aKeywo
5040: 72 64 54 61 62 6c 65 5b 69 5d 2e 7a 54 6f 6b 65  rdTable[i].zToke
5050: 6e 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 6a  nType;.    if( j
5060: 3d 3d 30 20 29 20 70 72 69 6e 74 66 28 22 20 20  ==0 ) printf("  
5070: 20 20 22 29 3b 0a 20 20 20 20 70 72 69 6e 74 66    ");.    printf
5080: 28 22 25 73 2c 25 2a 73 22 2c 20 7a 54 6f 6b 65  ("%s,%*s", zToke
5090: 6e 2c 20 28 69 6e 74 29 28 31 34 2d 73 74 72 6c  n, (int)(14-strl
50a0: 65 6e 28 7a 54 6f 6b 65 6e 29 29 2c 20 22 22 29  en(zToken)), "")
50b0: 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 69  ;.    j++;.    i
50c0: 66 28 20 6a 3e 3d 35 20 29 7b 0a 20 20 20 20 20  f( j>=5 ){.     
50d0: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
50e0: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
50f0: 7d 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22  }.  }.  printf("
5100: 25 73 20 20 7d 3b 5c 6e 22 2c 20 6a 3d 3d 30 20  %s  };\n", j==0 
5110: 3f 20 22 22 20 3a 20 22 5c 6e 22 29 3b 0a 0a 20  ? "" : "\n");.. 
5120: 20 70 72 69 6e 74 66 28 22 20 20 69 6e 74 20 68   printf("  int h
5130: 2c 20 69 3b 5c 6e 22 29 3b 0a 20 20 70 72 69 6e  , i;\n");.  prin
5140: 74 66 28 22 20 20 69 66 28 20 6e 3c 32 20 29 20  tf("  if( n<2 ) 
5150: 72 65 74 75 72 6e 20 54 4b 5f 49 44 3b 5c 6e 22  return TK_ID;\n"
5160: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 68  );.  printf("  h
5170: 20 3d 20 28 28 63 68 61 72 4d 61 70 28 7a 5b 30   = ((charMap(z[0
5180: 5d 29 2a 34 29 20 5e 5c 6e 22 0a 20 20 20 20 20  ])*4) ^\n".     
5190: 20 20 20 20 22 20 20 20 20 20 20 28 63 68 61 72      "      (char
51a0: 4d 61 70 28 7a 5b 6e 2d 31 5d 29 2a 33 29 20 5e  Map(z[n-1])*3) ^
51b0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
51c0: 20 20 20 20 6e 29 20 25 25 20 25 64 3b 5c 6e 22      n) %% %d;\n"
51d0: 2c 20 62 65 73 74 53 69 7a 65 29 3b 0a 20 20 70  , bestSize);.  p
51e0: 72 69 6e 74 66 28 22 20 20 66 6f 72 28 69 3d 28  rintf("  for(i=(
51f0: 28 69 6e 74 29 61 48 61 73 68 5b 68 5d 29 2d 31  (int)aHash[h])-1
5200: 3b 20 69 3e 3d 30 3b 20 69 3d 28 28 69 6e 74 29  ; i>=0; i=((int)
5210: 61 4e 65 78 74 5b 69 5d 29 2d 31 29 7b 5c 6e 22  aNext[i])-1){\n"
5220: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 20  );.  printf("   
5230: 20 69 66 28 20 61 4c 65 6e 5b 69 5d 3d 3d 6e 20   if( aLen[i]==n 
5240: 26 26 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  &&".            
5250: 20 20 20 20 20 20 20 22 20 73 71 6c 69 74 65 33         " sqlite3
5260: 53 74 72 4e 49 43 6d 70 28 26 7a 54 65 78 74 5b  StrNICmp(&zText[
5270: 61 4f 66 66 73 65 74 5b 69 5d 5d 2c 7a 2c 6e 29  aOffset[i]],z,n)
5280: 3d 3d 30 20 29 7b 5c 6e 22 29 3b 0a 20 20 66 6f  ==0 ){\n");.  fo
5290: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 77 6f 72  r(i=0; i<nKeywor
52a0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69  d; i++){.    pri
52b0: 6e 74 66 28 22 20 20 20 20 20 20 74 65 73 74 63  ntf("      testc
52c0: 61 73 65 28 20 69 3d 3d 25 64 20 29 3b 20 2f 2a  ase( i==%d ); /*
52d0: 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
52e0: 20 20 20 20 20 20 69 2c 20 61 4b 65 79 77 6f 72        i, aKeywor
52f0: 64 54 61 62 6c 65 5b 69 5d 2e 7a 54 6f 6b 65 6e  dTable[i].zToken
5300: 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 70 72 69  Type);.  }.  pri
5310: 6e 74 66 28 22 20 20 20 20 20 20 72 65 74 75 72  ntf("      retur
5320: 6e 20 61 43 6f 64 65 5b 69 5d 3b 5c 6e 22 29 3b  n aCode[i];\n");
5330: 0a 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 7d  .  printf("    }
5340: 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74 66 28 22  \n");.  printf("
5350: 20 20 7d 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74    }\n");.  print
5360: 66 28 22 20 20 72 65 74 75 72 6e 20 54 4b 5f 49  f("  return TK_I
5370: 44 3b 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74 66  D;\n");.  printf
5380: 28 22 7d 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74  ("}\n");.  print
5390: 66 28 22 69 6e 74 20 73 71 6c 69 74 65 33 4b 65  f("int sqlite3Ke
53a0: 79 77 6f 72 64 43 6f 64 65 28 63 6f 6e 73 74 20  ywordCode(const 
53b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
53c0: 2c 20 69 6e 74 20 6e 29 7b 5c 6e 22 29 3b 0a 20  , int n){\n");. 
53d0: 20 70 72 69 6e 74 66 28 22 20 20 72 65 74 75 72   printf("  retur
53e0: 6e 20 6b 65 79 77 6f 72 64 43 6f 64 65 28 28 63  n keywordCode((c
53f0: 68 61 72 2a 29 7a 2c 20 6e 29 3b 5c 6e 22 29 3b  har*)z, n);\n");
5400: 0a 20 20 70 72 69 6e 74 66 28 22 7d 5c 6e 22 29  .  printf("}\n")
5410: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ;..  return 0;.}
5420: 0a                                               .