/ Hex Artifact Content
Login

Artifact 18e45fb1c39ed3020b3bc2e133fc65e88c229eed:


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 43 75 72 73 6f 72 20 73 75 70 70 6f 72 74  * Cursor support
0100: 20 69 73 20 6f 66 66 20 62 79 20 64 65 66 61 75   is off by defau
0110: 6c 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  lt..*/.#if !defi
0120: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0130: 45 5f 43 55 52 53 4f 52 29 20 26 26 20 21 64 65  E_CURSOR) && !de
0140: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0150: 54 5f 43 55 52 53 4f 52 29 0a 23 20 64 65 66 69  T_CURSOR).# defi
0160: 6e 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ne SQLITE_OMIT_C
0170: 55 52 53 4f 52 20 31 0a 23 65 6e 64 69 66 0a 0a  URSOR 1.#endif..
0180: 2f 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 6b 65  /*.** All the ke
0190: 79 77 6f 72 64 73 20 6f 66 20 74 68 65 20 53 51  ywords of the SQ
01a0: 4c 20 6c 61 6e 67 75 61 67 65 20 61 72 65 20 73  L language are s
01b0: 74 6f 72 65 64 20 61 73 20 69 6e 20 61 20 68 61  tored as in a ha
01c0: 73 68 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6d 70  sh.** table comp
01d0: 6f 73 65 64 20 6f 66 20 69 6e 73 74 61 6e 63 65  osed of instance
01e0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
01f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
0200: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0210: 4b 65 79 77 6f 72 64 20 4b 65 79 77 6f 72 64 3b  Keyword Keyword;
0220: 0a 73 74 72 75 63 74 20 4b 65 79 77 6f 72 64 20  .struct Keyword 
0230: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
0240: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0250: 6b 65 79 77 6f 72 64 20 6e 61 6d 65 20 2a 2f 0a  keyword name */.
0260: 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 54 79    char *zTokenTy
0270: 70 65 3b 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  pe;    /* Token 
0280: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 6b  value for this k
0290: 65 79 77 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  eyword */.  int 
02a0: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
02b0: 20 2f 2a 20 43 6f 64 65 20 74 68 69 73 20 6b 65   /* Code this ke
02c0: 79 77 6f 72 64 20 69 66 20 6e 6f 6e 2d 7a 65 72  yword if non-zer
02d0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 64 3b 20 20  o */.  int id;  
02e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
02f0: 6e 69 71 75 65 20 49 44 20 66 6f 72 20 74 68 69  nique ID for thi
0300: 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  s record */.  in
0310: 74 20 68 61 73 68 3b 20 20 20 20 20 20 20 20 20  t hash;         
0320: 20 20 20 2f 2a 20 48 61 73 68 20 6f 6e 20 74 68     /* Hash on th
0330: 65 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 69  e keyword */.  i
0340: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
0350: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
0360: 20 73 74 61 72 74 20 6f 66 20 6e 61 6d 65 20 73   start of name s
0370: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6c  tring */.  int l
0380: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
0390: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 69  /* Length of thi
03a0: 73 20 6b 65 79 77 6f 72 64 2c 20 6e 6f 74 20 63  s keyword, not c
03b0: 6f 75 6e 74 69 6e 67 20 66 69 6e 61 6c 20 5c 30  ounting final \0
03c0: 30 30 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 66  00 */.  int pref
03d0: 69 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ix;          /* 
03e0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
03f0: 74 65 72 73 20 69 6e 20 70 72 65 66 69 78 20 2a  ters in prefix *
0400: 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 3b 20 20  /.  int iNext;  
0410: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
0420: 78 20 69 6e 20 61 4b 65 79 77 6f 72 64 54 61 62  x in aKeywordTab
0430: 6c 65 5b 5d 20 6f 66 20 6e 65 78 74 20 77 69 74  le[] of next wit
0440: 68 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  h same hash */. 
0450: 20 69 6e 74 20 73 75 62 73 74 72 49 64 3b 20 20   int substrId;  
0460: 20 20 20 20 20 20 2f 2a 20 49 64 20 74 6f 20 61        /* Id to a
0470: 6e 6f 74 68 65 72 20 6b 65 79 77 6f 72 64 20 74  nother keyword t
0480: 68 69 73 20 6b 65 79 77 6f 72 64 20 69 73 20 65  his keyword is e
0490: 6d 62 65 64 64 65 64 20 69 6e 20 2a 2f 0a 20 20  mbedded in */.  
04a0: 69 6e 74 20 73 75 62 73 74 72 4f 66 66 73 65 74  int substrOffset
04b0: 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69  ;    /* Offset i
04c0: 6e 74 6f 20 73 75 62 73 74 72 49 64 20 66 6f 72  nto substrId for
04d0: 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6b   start of this k
04e0: 65 79 77 6f 72 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  eyword */.};../*
04f0: 0a 2a 2a 20 44 65 66 69 6e 65 20 6d 61 73 6b 73  .** Define masks
0500: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
0510: 6e 65 20 77 68 69 63 68 20 6b 65 79 77 6f 72 64  ne which keyword
0520: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2f  s are allowed.*/
0530: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0540: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 23  MIT_ALTERTABLE.#
0550: 20 20 64 65 66 69 6e 65 20 41 4c 54 45 52 20 20    define ALTER  
0560: 20 20 20 20 30 0a 23 65 6c 73 65 0a 23 20 20 64      0.#else.#  d
0570: 65 66 69 6e 65 20 41 4c 54 45 52 20 20 20 20 20  efine ALTER     
0580: 20 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e   1.#endif.#defin
0590: 65 20 41 4c 57 41 59 53 20 20 20 20 20 32 0a 23  e ALWAYS     2.#
05a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
05b0: 54 5f 41 54 54 41 43 48 0a 23 20 20 64 65 66 69  T_ATTACH.#  defi
05c0: 6e 65 20 41 54 54 41 43 48 20 20 20 20 20 30 0a  ne ATTACH     0.
05d0: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
05e0: 41 54 54 41 43 48 20 20 20 20 20 34 0a 23 65 6e  ATTACH     4.#en
05f0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
0600: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
0610: 4d 45 4e 54 0a 23 20 20 64 65 66 69 6e 65 20 41  MENT.#  define A
0620: 55 54 4f 49 4e 43 52 20 20 20 30 0a 23 65 6c 73  UTOINCR   0.#els
0630: 65 0a 23 20 20 64 65 66 69 6e 65 20 41 55 54 4f  e.#  define AUTO
0640: 49 4e 43 52 20 20 20 38 0a 23 65 6e 64 69 66 0a  INCR   8.#endif.
0650: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
0660: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
0670: 43 54 0a 23 20 20 64 65 66 69 6e 65 20 43 4f 4d  CT.#  define COM
0680: 50 4f 55 4e 44 20 20 20 30 0a 23 65 6c 73 65 0a  POUND   0.#else.
0690: 23 20 20 64 65 66 69 6e 65 20 43 4f 4d 50 4f 55  #  define COMPOU
06a0: 4e 44 20 20 20 31 36 0a 23 65 6e 64 69 66 0a 23  ND   16.#endif.#
06b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
06c0: 54 5f 43 4f 4e 46 4c 49 43 54 5f 43 4c 41 55 53  T_CONFLICT_CLAUS
06d0: 45 0a 23 20 20 64 65 66 69 6e 65 20 43 4f 4e 46  E.#  define CONF
06e0: 4c 49 43 54 20 20 20 30 0a 23 65 6c 73 65 0a 23  LICT   0.#else.#
06f0: 20 20 64 65 66 69 6e 65 20 43 4f 4e 46 4c 49 43    define CONFLIC
0700: 54 20 20 20 33 32 0a 23 65 6e 64 69 66 0a 23 69  T   32.#endif.#i
0710: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0720: 5f 43 55 52 53 4f 52 0a 23 20 20 64 65 66 69 6e  _CURSOR.#  defin
0730: 65 20 43 55 52 53 4f 52 20 20 20 20 20 30 0a 23  e CURSOR     0.#
0740: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43  else.#  define C
0750: 55 52 53 4f 52 20 20 20 20 20 36 34 0a 23 65 6e  URSOR     64.#en
0760: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
0770: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 23  E_OMIT_EXPLAIN.#
0780: 20 20 64 65 66 69 6e 65 20 45 58 50 4c 41 49 4e    define EXPLAIN
0790: 20 20 20 20 30 0a 23 65 6c 73 65 0a 23 20 20 64      0.#else.#  d
07a0: 65 66 69 6e 65 20 45 58 50 4c 41 49 4e 20 20 20  efine EXPLAIN   
07b0: 20 31 32 38 0a 23 65 6e 64 69 66 0a 23 69 66 64   128.#endif.#ifd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
07d0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 23 20 20 64 65  OREIGN_KEY.#  de
07e0: 66 69 6e 65 20 46 4b 45 59 20 20 20 20 20 20 20  fine FKEY       
07f0: 30 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  0.#else.#  defin
0800: 65 20 46 4b 45 59 20 20 20 20 20 20 20 32 35 36  e FKEY       256
0810: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
0820: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
0830: 41 0a 23 20 20 64 65 66 69 6e 65 20 50 52 41 47  A.#  define PRAG
0840: 4d 41 20 20 20 20 20 30 0a 23 65 6c 73 65 0a 23  MA     0.#else.#
0850: 20 20 64 65 66 69 6e 65 20 50 52 41 47 4d 41 20    define PRAGMA 
0860: 20 20 20 20 35 31 32 0a 23 65 6e 64 69 66 0a 23      512.#endif.#
0870: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
0880: 54 5f 52 45 49 4e 44 45 58 0a 23 20 20 64 65 66  T_REINDEX.#  def
0890: 69 6e 65 20 52 45 49 4e 44 45 58 20 20 20 20 30  ine REINDEX    0
08a0: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
08b0: 20 52 45 49 4e 44 45 58 20 20 20 20 31 30 32 34   REINDEX    1024
08c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
08d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
08e0: 45 52 59 0a 23 20 20 64 65 66 69 6e 65 20 53 55  ERY.#  define SU
08f0: 42 51 55 45 52 59 20 20 20 30 0a 23 65 6c 73 65  BQUERY   0.#else
0900: 0a 23 20 20 64 65 66 69 6e 65 20 53 55 42 51 55  .#  define SUBQU
0910: 45 52 59 20 20 20 32 30 34 38 0a 23 65 6e 64 69  ERY   2048.#endi
0920: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
0930: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 23 20 20  OMIT_TRIGGER.#  
0940: 64 65 66 69 6e 65 20 54 52 49 47 47 45 52 20 20  define TRIGGER  
0950: 20 20 30 0a 23 65 6c 73 65 0a 23 20 20 64 65 66    0.#else.#  def
0960: 69 6e 65 20 54 52 49 47 47 45 52 20 20 20 20 34  ine TRIGGER    4
0970: 30 39 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  096.#endif.#ifde
0980: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
0990: 43 55 55 4d 0a 23 20 20 64 65 66 69 6e 65 20 56  CUUM.#  define V
09a0: 41 43 55 55 4d 20 20 20 20 20 30 0a 23 65 6c 73  ACUUM     0.#els
09b0: 65 0a 23 20 20 64 65 66 69 6e 65 20 56 41 43 55  e.#  define VACU
09c0: 55 4d 20 20 20 20 20 38 31 39 32 0a 23 65 6e 64  UM     8192.#end
09d0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
09e0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20 20 64 65  _OMIT_VIEW.#  de
09f0: 66 69 6e 65 20 56 49 45 57 20 20 20 20 20 20 20  fine VIEW       
0a00: 30 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  0.#else.#  defin
0a10: 65 20 56 49 45 57 20 20 20 20 20 20 20 31 36 33  e VIEW       163
0a20: 38 34 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  84.#endif.../*.*
0a30: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
0a40: 6b 65 79 77 6f 72 64 73 0a 2a 2f 0a 73 74 61 74  keywords.*/.stat
0a50: 69 63 20 4b 65 79 77 6f 72 64 20 61 4b 65 79 77  ic Keyword aKeyw
0a60: 6f 72 64 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ordTable[] = {. 
0a70: 20 7b 20 22 41 42 4f 52 54 22 2c 20 20 20 20 20   { "ABORT",     
0a80: 20 20 20 20 20 20 20 22 54 4b 5f 41 42 4f 52 54         "TK_ABORT
0a90: 22 2c 20 20 20 20 20 20 20 20 43 4f 4e 46 4c 49  ",        CONFLI
0aa0: 43 54 7c 54 52 49 47 47 45 52 20 20 20 20 20 20  CT|TRIGGER      
0ab0: 20 7d 2c 0a 20 20 7b 20 22 41 42 53 4f 4c 55 54   },.  { "ABSOLUT
0ac0: 45 22 2c 20 20 20 20 20 20 20 20 20 22 54 4b 5f  E",         "TK_
0ad0: 41 42 53 4f 4c 55 54 45 22 2c 20 20 20 20 20 43  ABSOLUTE",     C
0ae0: 55 52 53 4f 52 20 20 20 20 20 20 20 20 20 20 20  URSOR           
0af0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 41 46        },.  { "AF
0b00: 54 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20  TER",           
0b10: 20 22 54 4b 5f 41 46 54 45 52 22 2c 20 20 20 20   "TK_AFTER",    
0b20: 20 20 20 20 54 52 49 47 47 45 52 20 20 20 20 20      TRIGGER     
0b30: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0b40: 7b 20 22 41 4c 4c 22 2c 20 20 20 20 20 20 20 20  { "ALL",        
0b50: 20 20 20 20 20 20 22 54 4b 5f 41 4c 4c 22 2c 20        "TK_ALL", 
0b60: 20 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20           ALWAYS 
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 7d 2c 0a 20 20 7b 20 22 41 4c 54 45 52 22 2c 20  },.  { "ALTER", 
0b90: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 41             "TK_A
0ba0: 4c 54 45 52 22 2c 20 20 20 20 20 20 20 20 41 4c  LTER",        AL
0bb0: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
0bc0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 41 4e 44       },.  { "AND
0bd0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
0be0: 22 54 4b 5f 41 4e 44 22 2c 20 20 20 20 20 20 20  "TK_AND",       
0bf0: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
0c00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
0c10: 20 22 41 53 22 2c 20 20 20 20 20 20 20 20 20 20   "AS",          
0c20: 20 20 20 20 20 22 54 4b 5f 41 53 22 2c 20 20 20       "TK_AS",   
0c30: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
0c50: 2c 0a 20 20 7b 20 22 41 53 43 22 2c 20 20 20 20  ,.  { "ASC",    
0c60: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 41 53            "TK_AS
0c70: 43 22 2c 20 20 20 20 20 20 20 20 20 20 41 4c 57  C",          ALW
0c80: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
0c90: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 41 54 54 41      },.  { "ATTA
0ca0: 43 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  CH",           "
0cb0: 54 4b 5f 41 54 54 41 43 48 22 2c 20 20 20 20 20  TK_ATTACH",     
0cc0: 20 20 41 54 54 41 43 48 20 20 20 20 20 20 20 20    ATTACH        
0cd0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0ce0: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22 2c  "AUTOINCREMENT",
0cf0: 20 20 20 20 22 54 4b 5f 41 55 54 4f 49 4e 43 52      "TK_AUTOINCR
0d00: 22 2c 20 20 20 20 20 41 55 54 4f 49 4e 43 52 20  ",     AUTOINCR 
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
0d20: 0a 20 20 7b 20 22 42 45 46 4f 52 45 22 2c 20 20  .  { "BEFORE",  
0d30: 20 20 20 20 20 20 20 20 20 22 54 4b 5f 42 45 46           "TK_BEF
0d40: 4f 52 45 22 2c 20 20 20 20 20 20 20 54 52 49 47  ORE",       TRIG
0d50: 47 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  GER             
0d60: 20 20 20 7d 2c 0a 20 20 7b 20 22 42 45 47 49 4e     },.  { "BEGIN
0d70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 54  ",            "T
0d80: 4b 5f 42 45 47 49 4e 22 2c 20 20 20 20 20 20 20  K_BEGIN",       
0d90: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
0da0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
0db0: 42 45 54 57 45 45 4e 22 2c 20 20 20 20 20 20 20  BETWEEN",       
0dc0: 20 20 20 22 54 4b 5f 42 45 54 57 45 45 4e 22 2c     "TK_BETWEEN",
0dd0: 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20        ALWAYS    
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
0df0: 20 20 7b 20 22 42 59 22 2c 20 20 20 20 20 20 20    { "BY",       
0e00: 20 20 20 20 20 20 20 20 22 54 4b 5f 42 59 22 2c          "TK_BY",
0e10: 20 20 20 20 20 20 20 20 20 20 20 41 4c 57 41 59             ALWAY
0e20: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
0e30: 20 20 7d 2c 0a 20 20 7b 20 22 43 41 53 43 41 44    },.  { "CASCAD
0e40: 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 54 4b  E",          "TK
0e50: 5f 43 41 53 43 41 44 45 22 2c 20 20 20 20 20 20  _CASCADE",      
0e60: 46 4b 45 59 20 20 20 20 20 20 20 20 20 20 20 20  FKEY            
0e70: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43         },.  { "C
0e80: 41 53 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  ASE",           
0e90: 20 20 22 54 4b 5f 43 41 53 45 22 2c 20 20 20 20    "TK_CASE",    
0ea0: 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20       ALWAYS     
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
0ec0: 20 7b 20 22 43 48 45 43 4b 22 2c 20 20 20 20 20   { "CHECK",     
0ed0: 20 20 20 20 20 20 20 22 54 4b 5f 43 48 45 43 4b         "TK_CHECK
0ee0: 22 2c 20 20 20 20 20 20 20 20 41 4c 57 41 59 53  ",        ALWAYS
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 20 7d 2c 0a 20 20 7b 20 22 43 4c 4f 53 45 22 2c   },.  { "CLOSE",
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
0f20: 43 4c 4f 53 45 22 2c 20 20 20 20 20 20 20 20 43  CLOSE",        C
0f30: 55 52 53 4f 52 20 20 20 20 20 20 20 20 20 20 20  URSOR           
0f40: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43 4f        },.  { "CO
0f50: 4c 4c 41 54 45 22 2c 20 20 20 20 20 20 20 20 20  LLATE",         
0f60: 20 22 54 4b 5f 43 4f 4c 4c 41 54 45 22 2c 20 20   "TK_COLLATE",  
0f70: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
0f80: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0f90: 7b 20 22 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20  { "COMMIT",     
0fa0: 20 20 20 20 20 20 22 54 4b 5f 43 4f 4d 4d 49 54        "TK_COMMIT
0fb0: 22 2c 20 20 20 20 20 20 20 41 4c 57 41 59 53 20  ",       ALWAYS 
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 7d 2c 0a 20 20 7b 20 22 43 4f 4e 46 4c 49 43 54  },.  { "CONFLICT
0fe0: 22 2c 20 20 20 20 20 20 20 20 20 22 54 4b 5f 43  ",         "TK_C
0ff0: 4f 4e 46 4c 49 43 54 22 2c 20 20 20 20 20 43 4f  ONFLICT",     CO
1000: 4e 46 4c 49 43 54 20 20 20 20 20 20 20 20 20 20  NFLICT          
1010: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43 4f 4e       },.  { "CON
1020: 53 54 52 41 49 4e 54 22 2c 20 20 20 20 20 20 20  STRAINT",       
1030: 22 54 4b 5f 43 4f 4e 53 54 52 41 49 4e 54 22 2c  "TK_CONSTRAINT",
1040: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
1050: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
1060: 20 22 43 52 45 41 54 45 22 2c 20 20 20 20 20 20   "CREATE",      
1070: 20 20 20 20 20 22 54 4b 5f 43 52 45 41 54 45 22       "TK_CREATE"
1080: 2c 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20  ,       ALWAYS  
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10a0: 2c 0a 20 20 7b 20 22 43 52 4f 53 53 22 2c 20 20  ,.  { "CROSS",  
10b0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4a 4f            "TK_JO
10c0: 49 4e 5f 4b 57 22 2c 20 20 20 20 20 20 41 4c 57  IN_KW",      ALW
10d0: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
10e0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43 55 52 53      },.  { "CURS
10f0: 4f 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  OR",           "
1100: 54 4b 5f 43 55 52 53 4f 52 22 2c 20 20 20 20 20  TK_CURSOR",     
1110: 20 20 43 55 52 53 4f 52 20 20 20 20 20 20 20 20    CURSOR        
1120: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
1130: 22 43 55 52 52 45 4e 54 22 2c 20 20 20 20 20 20  "CURRENT",      
1140: 20 20 20 20 22 54 4b 5f 43 55 52 52 45 4e 54 22      "TK_CURRENT"
1150: 2c 20 20 20 20 20 20 43 55 52 53 4f 52 20 20 20  ,      CURSOR   
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1170: 0a 20 20 7b 20 22 43 55 52 52 45 4e 54 5f 44 41  .  { "CURRENT_DA
1180: 54 45 22 2c 20 20 20 20 20 22 54 4b 5f 43 44 41  TE",     "TK_CDA
1190: 54 45 22 2c 20 20 20 20 20 20 20 20 41 4c 57 41  TE",        ALWA
11a0: 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  YS              
11b0: 20 20 20 7d 2c 0a 20 20 7b 20 22 43 55 52 52 45     },.  { "CURRE
11c0: 4e 54 5f 54 49 4d 45 22 2c 20 20 20 20 20 22 54  NT_TIME",     "T
11d0: 4b 5f 43 54 49 4d 45 22 2c 20 20 20 20 20 20 20  K_CTIME",       
11e0: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
11f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1200: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
1210: 50 22 2c 22 54 4b 5f 43 54 49 4d 45 53 54 41 4d  P","TK_CTIMESTAM
1220: 50 22 2c 20 20 20 41 4c 57 41 59 53 20 20 20 20  P",   ALWAYS    
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1240: 20 20 7b 20 22 44 41 54 41 42 41 53 45 22 2c 20    { "DATABASE", 
1250: 20 20 20 20 20 20 20 20 22 54 4b 5f 44 41 54 41          "TK_DATA
1260: 42 41 53 45 22 2c 20 20 20 20 20 41 54 54 41 43  BASE",     ATTAC
1270: 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
1280: 20 20 7d 2c 0a 20 20 7b 20 22 44 45 43 4c 41 52    },.  { "DECLAR
1290: 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 54 4b  E",          "TK
12a0: 5f 44 45 43 4c 41 52 45 22 2c 20 20 20 20 20 20  _DECLARE",      
12b0: 43 55 52 53 4f 52 20 20 20 20 20 20 20 20 20 20  CURSOR          
12c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 44         },.  { "D
12d0: 45 46 41 55 4c 54 22 2c 20 20 20 20 20 20 20 20  EFAULT",        
12e0: 20 20 22 54 4b 5f 44 45 46 41 55 4c 54 22 2c 20    "TK_DEFAULT", 
12f0: 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20       ALWAYS     
1300: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1310: 20 7b 20 22 44 45 46 45 52 52 45 44 22 2c 20 20   { "DEFERRED",  
1320: 20 20 20 20 20 20 20 22 54 4b 5f 44 45 46 45 52         "TK_DEFER
1330: 52 45 44 22 2c 20 20 20 20 20 41 4c 57 41 59 53  RED",     ALWAYS
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 7d 2c 0a 20 20 7b 20 22 44 45 46 45 52 52 41   },.  { "DEFERRA
1360: 42 4c 45 22 2c 20 20 20 20 20 20 20 22 54 4b 5f  BLE",       "TK_
1370: 44 45 46 45 52 52 41 42 4c 45 22 2c 20 20 20 46  DEFERRABLE",   F
1380: 4b 45 59 20 20 20 20 20 20 20 20 20 20 20 20 20  KEY             
1390: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 44 45        },.  { "DE
13a0: 4c 45 54 45 22 2c 20 20 20 20 20 20 20 20 20 20  LETE",          
13b0: 20 22 54 4b 5f 44 45 4c 45 54 45 22 2c 20 20 20   "TK_DELETE",   
13c0: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
13d0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
13e0: 7b 20 22 44 45 53 43 22 2c 20 20 20 20 20 20 20  { "DESC",       
13f0: 20 20 20 20 20 20 22 54 4b 5f 44 45 53 43 22 2c        "TK_DESC",
1400: 20 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20           ALWAYS 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 7d 2c 0a 20 20 7b 20 22 44 45 54 41 43 48 22 2c  },.  { "DETACH",
1430: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 44             "TK_D
1440: 45 54 41 43 48 22 2c 20 20 20 20 20 20 20 41 54  ETACH",       AT
1450: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
1460: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 44 49 53       },.  { "DIS
1470: 54 49 4e 43 54 22 2c 20 20 20 20 20 20 20 20 20  TINCT",         
1480: 22 54 4b 5f 44 49 53 54 49 4e 43 54 22 2c 20 20  "TK_DISTINCT",  
1490: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
14a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
14b0: 20 22 44 52 4f 50 22 2c 20 20 20 20 20 20 20 20   "DROP",        
14c0: 20 20 20 20 20 22 54 4b 5f 44 52 4f 50 22 2c 20       "TK_DROP", 
14d0: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
14f0: 2c 0a 20 20 7b 20 22 45 4e 44 22 2c 20 20 20 20  ,.  { "END",    
1500: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 45 4e            "TK_EN
1510: 44 22 2c 20 20 20 20 20 20 20 20 20 20 41 4c 57  D",          ALW
1520: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
1530: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 45 41 43 48      },.  { "EACH
1540: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
1550: 54 4b 5f 45 41 43 48 22 2c 20 20 20 20 20 20 20  TK_EACH",       
1560: 20 20 54 52 49 47 47 45 52 20 20 20 20 20 20 20    TRIGGER       
1570: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
1580: 22 45 4c 53 45 22 2c 20 20 20 20 20 20 20 20 20  "ELSE",         
1590: 20 20 20 20 22 54 4b 5f 45 4c 53 45 22 2c 20 20      "TK_ELSE",  
15a0: 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20         ALWAYS   
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
15c0: 0a 20 20 7b 20 22 45 53 43 41 50 45 22 2c 20 20  .  { "ESCAPE",  
15d0: 20 20 20 20 20 20 20 20 20 22 54 4b 5f 45 53 43           "TK_ESC
15e0: 41 50 45 22 2c 20 20 20 20 20 20 20 41 4c 57 41  APE",       ALWA
15f0: 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  YS              
1600: 20 20 20 7d 2c 0a 20 20 7b 20 22 45 58 43 45 50     },.  { "EXCEP
1610: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 54  T",           "T
1620: 4b 5f 45 58 43 45 50 54 22 2c 20 20 20 20 20 20  K_EXCEPT",      
1630: 20 43 4f 4d 50 4f 55 4e 44 20 20 20 20 20 20 20   COMPOUND       
1640: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1650: 45 58 43 4c 55 53 49 56 45 22 2c 20 20 20 20 20  EXCLUSIVE",     
1660: 20 20 20 22 54 4b 5f 45 58 43 4c 55 53 49 56 45     "TK_EXCLUSIVE
1670: 22 2c 20 20 20 20 41 4c 57 41 59 53 20 20 20 20  ",    ALWAYS    
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1690: 20 20 7b 20 22 45 58 49 53 54 53 22 2c 20 20 20    { "EXISTS",   
16a0: 20 20 20 20 20 20 20 20 22 54 4b 5f 45 58 49 53          "TK_EXIS
16b0: 54 53 22 2c 20 20 20 20 20 20 20 53 55 42 51 55  TS",       SUBQU
16c0: 45 52 59 20 20 20 20 20 20 20 20 20 20 20 20 20  ERY             
16d0: 20 20 7d 2c 0a 20 20 7b 20 22 45 58 50 4c 41 49    },.  { "EXPLAI
16e0: 4e 22 2c 20 20 20 20 20 20 20 20 20 20 22 54 4b  N",          "TK
16f0: 5f 45 58 50 4c 41 49 4e 22 2c 20 20 20 20 20 20  _EXPLAIN",      
1700: 45 58 50 4c 41 49 4e 20 20 20 20 20 20 20 20 20  EXPLAIN         
1710: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 46         },.  { "F
1720: 41 49 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20  AIL",           
1730: 20 20 22 54 4b 5f 46 41 49 4c 22 2c 20 20 20 20    "TK_FAIL",    
1740: 20 20 20 20 20 43 4f 4e 46 4c 49 43 54 7c 54 52       CONFLICT|TR
1750: 49 47 47 45 52 20 20 20 20 20 20 20 7d 2c 0a 20  IGGER       },. 
1760: 20 7b 20 22 46 45 54 43 48 22 2c 20 20 20 20 20   { "FETCH",     
1770: 20 20 20 20 20 20 20 22 54 4b 5f 46 45 54 43 48         "TK_FETCH
1780: 22 2c 20 20 20 20 20 20 20 20 43 55 52 53 4f 52  ",        CURSOR
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 7d 2c 0a 20 20 7b 20 22 46 49 52 53 54 22 2c   },.  { "FIRST",
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
17c0: 46 49 52 53 54 22 2c 20 20 20 20 20 20 20 20 43  FIRST",        C
17d0: 55 52 53 4f 52 20 20 20 20 20 20 20 20 20 20 20  URSOR           
17e0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 46 4f        },.  { "FO
17f0: 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  R",             
1800: 20 22 54 4b 5f 46 4f 52 22 2c 20 20 20 20 20 20   "TK_FOR",      
1810: 20 20 20 20 54 52 49 47 47 45 52 7c 43 55 52 53      TRIGGER|CURS
1820: 4f 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  OR         },.  
1830: 7b 20 22 46 4f 52 45 49 47 4e 22 2c 20 20 20 20  { "FOREIGN",    
1840: 20 20 20 20 20 20 22 54 4b 5f 46 4f 52 45 49 47        "TK_FOREIG
1850: 4e 22 2c 20 20 20 20 20 20 46 4b 45 59 20 20 20  N",      FKEY   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 7d 2c 0a 20 20 7b 20 22 46 52 4f 4d 22 2c 20 20  },.  { "FROM",  
1880: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 46             "TK_F
1890: 52 4f 4d 22 2c 20 20 20 20 20 20 20 20 20 41 4c  ROM",         AL
18a0: 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20  WAYS            
18b0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 46 55 4c       },.  { "FUL
18c0: 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  L",             
18d0: 22 54 4b 5f 4a 4f 49 4e 5f 4b 57 22 2c 20 20 20  "TK_JOIN_KW",   
18e0: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
18f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
1900: 20 22 47 4c 4f 42 22 2c 20 20 20 20 20 20 20 20   "GLOB",        
1910: 20 20 20 20 20 22 54 4b 5f 47 4c 4f 42 22 2c 20       "TK_GLOB", 
1920: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1940: 2c 0a 20 20 7b 20 22 47 52 4f 55 50 22 2c 20 20  ,.  { "GROUP",  
1950: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 47 52            "TK_GR
1960: 4f 55 50 22 2c 20 20 20 20 20 20 20 20 41 4c 57  OUP",        ALW
1970: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
1980: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 48 41 56 49      },.  { "HAVI
1990: 4e 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  NG",           "
19a0: 54 4b 5f 48 41 56 49 4e 47 22 2c 20 20 20 20 20  TK_HAVING",     
19b0: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
19c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
19d0: 22 49 47 4e 4f 52 45 22 2c 20 20 20 20 20 20 20  "IGNORE",       
19e0: 20 20 20 20 22 54 4b 5f 49 47 4e 4f 52 45 22 2c      "TK_IGNORE",
19f0: 20 20 20 20 20 20 20 43 4f 4e 46 4c 49 43 54 7c         CONFLICT|
1a00: 54 52 49 47 47 45 52 20 20 20 20 20 20 20 7d 2c  TRIGGER       },
1a10: 0a 20 20 7b 20 22 49 4d 4d 45 44 49 41 54 45 22  .  { "IMMEDIATE"
1a20: 2c 20 20 20 20 20 20 20 20 22 54 4b 5f 49 4d 4d  ,        "TK_IMM
1a30: 45 44 49 41 54 45 22 2c 20 20 20 20 41 4c 57 41  EDIATE",    ALWA
1a40: 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  YS              
1a50: 20 20 20 7d 2c 0a 20 20 7b 20 22 49 4e 22 2c 20     },.  { "IN", 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54                "T
1a70: 4b 5f 49 4e 22 2c 20 20 20 20 20 20 20 20 20 20  K_IN",          
1a80: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
1a90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1aa0: 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 20 20  INDEX",         
1ab0: 20 20 20 22 54 4b 5f 49 4e 44 45 58 22 2c 20 20     "TK_INDEX",  
1ac0: 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20        ALWAYS    
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1ae0: 20 20 7b 20 22 49 4e 49 54 49 41 4c 4c 59 22 2c    { "INITIALLY",
1af0: 20 20 20 20 20 20 20 20 22 54 4b 5f 49 4e 49 54          "TK_INIT
1b00: 49 41 4c 4c 59 22 2c 20 20 20 20 46 4b 45 59 20  IALLY",    FKEY 
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 7d 2c 0a 20 20 7b 20 22 49 4e 4e 45 52 22    },.  { "INNER"
1b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b  ,            "TK
1b40: 5f 4a 4f 49 4e 5f 4b 57 22 2c 20 20 20 20 20 20  _JOIN_KW",      
1b50: 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20  ALWAYS          
1b60: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 49         },.  { "I
1b70: 4e 53 45 52 54 22 2c 20 20 20 20 20 20 20 20 20  NSERT",         
1b80: 20 20 22 54 4b 5f 49 4e 53 45 52 54 22 2c 20 20    "TK_INSERT",  
1b90: 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20       ALWAYS     
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1bb0: 20 7b 20 22 49 4e 53 54 45 41 44 22 2c 20 20 20   { "INSTEAD",   
1bc0: 20 20 20 20 20 20 20 22 54 4b 5f 49 4e 53 54 45         "TK_INSTE
1bd0: 41 44 22 2c 20 20 20 20 20 20 54 52 49 47 47 45  AD",      TRIGGE
1be0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1bf0: 20 7d 2c 0a 20 20 7b 20 22 49 4e 54 45 52 53 45   },.  { "INTERSE
1c00: 43 54 22 2c 20 20 20 20 20 20 20 20 22 54 4b 5f  CT",        "TK_
1c10: 49 4e 54 45 52 53 45 43 54 22 2c 20 20 20 20 43  INTERSECT",    C
1c20: 4f 4d 50 4f 55 4e 44 20 20 20 20 20 20 20 20 20  OMPOUND         
1c30: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 49 4e        },.  { "IN
1c40: 54 4f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TO",            
1c50: 20 22 54 4b 5f 49 4e 54 4f 22 2c 20 20 20 20 20   "TK_INTO",     
1c60: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
1c70: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1c80: 7b 20 22 49 53 22 2c 20 20 20 20 20 20 20 20 20  { "IS",         
1c90: 20 20 20 20 20 20 22 54 4b 5f 49 53 22 2c 20 20        "TK_IS",  
1ca0: 20 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20           ALWAYS 
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 7d 2c 0a 20 20 7b 20 22 49 53 4e 55 4c 4c 22 2c  },.  { "ISNULL",
1cd0: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 49             "TK_I
1ce0: 53 4e 55 4c 4c 22 2c 20 20 20 20 20 20 20 41 4c  SNULL",       AL
1cf0: 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20  WAYS            
1d00: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4a 4f 49       },.  { "JOI
1d10: 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  N",             
1d20: 22 54 4b 5f 4a 4f 49 4e 22 2c 20 20 20 20 20 20  "TK_JOIN",      
1d30: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
1d40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
1d50: 20 22 4b 45 59 22 2c 20 20 20 20 20 20 20 20 20   "KEY",         
1d60: 20 20 20 20 20 22 54 4b 5f 4b 45 59 22 2c 20 20       "TK_KEY",  
1d70: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d90: 2c 0a 20 20 7b 20 22 4c 45 46 54 22 2c 20 20 20  ,.  { "LEFT",   
1da0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4a 4f            "TK_JO
1db0: 49 4e 5f 4b 57 22 2c 20 20 20 20 20 20 41 4c 57  IN_KW",      ALW
1dc0: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
1dd0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4c 49 4b 45      },.  { "LIKE
1de0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
1df0: 54 4b 5f 4c 49 4b 45 22 2c 20 20 20 20 20 20 20  TK_LIKE",       
1e00: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
1e10: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
1e20: 22 4c 49 4d 49 54 22 2c 20 20 20 20 20 20 20 20  "LIMIT",        
1e30: 20 20 20 20 22 54 4b 5f 4c 49 4d 49 54 22 2c 20      "TK_LIMIT", 
1e40: 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20         ALWAYS   
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1e60: 0a 20 20 7b 20 22 4d 41 54 43 48 22 2c 20 20 20  .  { "MATCH",   
1e70: 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4d 41 54           "TK_MAT
1e80: 43 48 22 2c 20 20 20 20 20 20 20 20 41 4c 57 41  CH",        ALWA
1e90: 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  YS              
1ea0: 20 20 20 7d 2c 0a 20 20 7b 20 22 4e 41 54 55 52     },.  { "NATUR
1eb0: 41 4c 22 2c 20 20 20 20 20 20 20 20 20 20 22 54  AL",          "T
1ec0: 4b 5f 4a 4f 49 4e 5f 4b 57 22 2c 20 20 20 20 20  K_JOIN_KW",     
1ed0: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
1ee0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1ef0: 4e 45 58 54 22 2c 20 20 20 20 20 20 20 20 20 20  NEXT",          
1f00: 20 20 20 22 54 4b 5f 4e 45 58 54 22 2c 20 20 20     "TK_NEXT",   
1f10: 20 20 20 20 20 20 43 55 52 53 4f 52 20 20 20 20        CURSOR    
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1f30: 20 20 7b 20 22 4e 4f 54 22 2c 20 20 20 20 20 20    { "NOT",      
1f40: 20 20 20 20 20 20 20 20 22 54 4b 5f 4e 4f 54 22          "TK_NOT"
1f50: 2c 20 20 20 20 20 20 20 20 20 20 41 4c 57 41 59  ,          ALWAY
1f60: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
1f70: 20 20 7d 2c 0a 20 20 7b 20 22 4e 4f 54 4e 55 4c    },.  { "NOTNUL
1f80: 4c 22 2c 20 20 20 20 20 20 20 20 20 20 22 54 4b  L",          "TK
1f90: 5f 4e 4f 54 4e 55 4c 4c 22 2c 20 20 20 20 20 20  _NOTNULL",      
1fa0: 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20  ALWAYS          
1fb0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4e         },.  { "N
1fc0: 55 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20  ULL",           
1fd0: 20 20 22 54 4b 5f 4e 55 4c 4c 22 2c 20 20 20 20    "TK_NULL",    
1fe0: 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20       ALWAYS     
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2000: 20 7b 20 22 4f 46 22 2c 20 20 20 20 20 20 20 20   { "OF",        
2010: 20 20 20 20 20 20 20 22 54 4b 5f 4f 46 22 2c 20         "TK_OF", 
2020: 20 20 20 20 20 20 20 20 20 20 41 4c 57 41 59 53            ALWAYS
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 7d 2c 0a 20 20 7b 20 22 4f 46 46 53 45 54 22   },.  { "OFFSET"
2050: 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f  ,           "TK_
2060: 4f 46 46 53 45 54 22 2c 20 20 20 20 20 20 20 41  OFFSET",       A
2070: 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20  LWAYS           
2080: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4f 4e        },.  { "ON
2090: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
20a0: 20 22 54 4b 5f 4f 4e 22 2c 20 20 20 20 20 20 20   "TK_ON",       
20b0: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
20c0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
20d0: 7b 20 22 4f 52 22 2c 20 20 20 20 20 20 20 20 20  { "OR",         
20e0: 20 20 20 20 20 20 22 54 4b 5f 4f 52 22 2c 20 20        "TK_OR",  
20f0: 20 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20           ALWAYS 
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 7d 2c 0a 20 20 7b 20 22 4f 52 44 45 52 22 2c 20  },.  { "ORDER", 
2120: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4f             "TK_O
2130: 52 44 45 52 22 2c 20 20 20 20 20 20 20 20 41 4c  RDER",        AL
2140: 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20  WAYS            
2150: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4f 55 54       },.  { "OUT
2160: 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ER",            
2170: 22 54 4b 5f 4a 4f 49 4e 5f 4b 57 22 2c 20 20 20  "TK_JOIN_KW",   
2180: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
2190: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
21a0: 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20   "PRAGMA",      
21b0: 20 20 20 20 20 22 54 4b 5f 50 52 41 47 4d 41 22       "TK_PRAGMA"
21c0: 2c 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 20  ,       PRAGMA  
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
21e0: 2c 0a 20 20 7b 20 22 50 52 49 4f 52 22 2c 20 20  ,.  { "PRIOR",  
21f0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 50 52            "TK_PR
2200: 49 4f 52 22 2c 20 20 20 20 20 20 20 20 43 55 52  IOR",        CUR
2210: 53 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  SOR             
2220: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 50 52 49 4d      },.  { "PRIM
2230: 41 52 59 22 2c 20 20 20 20 20 20 20 20 20 20 22  ARY",          "
2240: 54 4b 5f 50 52 49 4d 41 52 59 22 2c 20 20 20 20  TK_PRIMARY",    
2250: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
2260: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
2270: 22 52 41 49 53 45 22 2c 20 20 20 20 20 20 20 20  "RAISE",        
2280: 20 20 20 20 22 54 4b 5f 52 41 49 53 45 22 2c 20      "TK_RAISE", 
2290: 20 20 20 20 20 20 20 54 52 49 47 47 45 52 20 20         TRIGGER  
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
22b0: 0a 20 20 7b 20 22 52 45 46 45 52 45 4e 43 45 53  .  { "REFERENCES
22c0: 22 2c 20 20 20 20 20 20 20 22 54 4b 5f 52 45 46  ",       "TK_REF
22d0: 45 52 45 4e 43 45 53 22 2c 20 20 20 46 4b 45 59  ERENCES",   FKEY
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 7d 2c 0a 20 20 7b 20 22 52 45 49 4e 44     },.  { "REIND
2300: 45 58 22 2c 20 20 20 20 20 20 20 20 20 20 22 54  EX",          "T
2310: 4b 5f 52 45 49 4e 44 45 58 22 2c 20 20 20 20 20  K_REINDEX",     
2320: 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
2330: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
2340: 52 45 4c 41 54 49 56 45 22 2c 20 20 20 20 20 20  RELATIVE",      
2350: 20 20 20 22 54 4b 5f 52 45 4c 41 54 49 56 45 22     "TK_RELATIVE"
2360: 2c 20 20 20 20 20 43 55 52 53 4f 52 20 20 20 20  ,     CURSOR    
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2380: 20 20 7b 20 22 52 45 4e 41 4d 45 22 2c 20 20 20    { "RENAME",   
2390: 20 20 20 20 20 20 20 20 22 54 4b 5f 52 45 4e 41          "TK_RENA
23a0: 4d 45 22 2c 20 20 20 20 20 20 20 41 4c 54 45 52  ME",       ALTER
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 7d 2c 0a 20 20 7b 20 22 52 45 50 4c 41 43    },.  { "REPLAC
23d0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 54 4b  E",          "TK
23e0: 5f 52 45 50 4c 41 43 45 22 2c 20 20 20 20 20 20  _REPLACE",      
23f0: 43 4f 4e 46 4c 49 43 54 20 20 20 20 20 20 20 20  CONFLICT        
2400: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 52         },.  { "R
2410: 45 53 54 52 49 43 54 22 2c 20 20 20 20 20 20 20  ESTRICT",       
2420: 20 20 22 54 4b 5f 52 45 53 54 52 49 43 54 22 2c    "TK_RESTRICT",
2430: 20 20 20 20 20 46 4b 45 59 20 20 20 20 20 20 20       FKEY       
2440: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2450: 20 7b 20 22 52 49 47 48 54 22 2c 20 20 20 20 20   { "RIGHT",     
2460: 20 20 20 20 20 20 20 22 54 4b 5f 4a 4f 49 4e 5f         "TK_JOIN_
2470: 4b 57 22 2c 20 20 20 20 20 20 41 4c 57 41 59 53  KW",      ALWAYS
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 7d 2c 0a 20 20 7b 20 22 52 4f 4c 4c 42 41 43   },.  { "ROLLBAC
24a0: 4b 22 2c 20 20 20 20 20 20 20 20 20 22 54 4b 5f  K",         "TK_
24b0: 52 4f 4c 4c 42 41 43 4b 22 2c 20 20 20 20 20 41  ROLLBACK",     A
24c0: 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20  LWAYS           
24d0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 52 4f        },.  { "RO
24e0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
24f0: 20 22 54 4b 5f 52 4f 57 22 2c 20 20 20 20 20 20   "TK_ROW",      
2500: 20 20 20 20 54 52 49 47 47 45 52 20 20 20 20 20      TRIGGER     
2510: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2520: 7b 20 22 53 45 4c 45 43 54 22 2c 20 20 20 20 20  { "SELECT",     
2530: 20 20 20 20 20 20 22 54 4b 5f 53 45 4c 45 43 54        "TK_SELECT
2540: 22 2c 20 20 20 20 20 20 20 41 4c 57 41 59 53 20  ",       ALWAYS 
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 7d 2c 0a 20 20 7b 20 22 53 45 54 22 2c 20 20 20  },.  { "SET",   
2570: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 53             "TK_S
2580: 45 54 22 2c 20 20 20 20 20 20 20 20 20 20 41 4c  ET",          AL
2590: 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20  WAYS            
25a0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 53 54 41       },.  { "STA
25b0: 54 45 4d 45 4e 54 22 2c 20 20 20 20 20 20 20 20  TEMENT",        
25c0: 22 54 4b 5f 53 54 41 54 45 4d 45 4e 54 22 2c 20  "TK_STATEMENT", 
25d0: 20 20 20 54 52 49 47 47 45 52 20 20 20 20 20 20     TRIGGER      
25e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
25f0: 20 22 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20   "TABLE",       
2600: 20 20 20 20 20 22 54 4b 5f 54 41 42 4c 45 22 2c       "TK_TABLE",
2610: 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20          ALWAYS  
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2630: 2c 0a 20 20 7b 20 22 54 45 4d 50 22 2c 20 20 20  ,.  { "TEMP",   
2640: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 54 45            "TK_TE
2650: 4d 50 22 2c 20 20 20 20 20 20 20 20 20 41 4c 57  MP",         ALW
2660: 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
2670: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 54 45 4d 50      },.  { "TEMP
2680: 4f 52 41 52 59 22 2c 20 20 20 20 20 20 20 20 22  ORARY",        "
2690: 54 4b 5f 54 45 4d 50 22 2c 20 20 20 20 20 20 20  TK_TEMP",       
26a0: 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20    ALWAYS        
26b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
26c0: 22 54 48 45 4e 22 2c 20 20 20 20 20 20 20 20 20  "THEN",         
26d0: 20 20 20 20 22 54 4b 5f 54 48 45 4e 22 2c 20 20      "TK_THEN",  
26e0: 20 20 20 20 20 20 20 41 4c 57 41 59 53 20 20 20         ALWAYS   
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2700: 0a 20 20 7b 20 22 54 4f 22 2c 20 20 20 20 20 20  .  { "TO",      
2710: 20 20 20 20 20 20 20 20 20 22 54 4b 5f 54 4f 22           "TK_TO"
2720: 2c 20 20 20 20 20 20 20 20 20 20 20 41 4c 54 45  ,           ALTE
2730: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
2740: 20 20 20 7d 2c 0a 20 20 7b 20 22 54 52 41 4e 53     },.  { "TRANS
2750: 41 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 22 54  ACTION",      "T
2760: 4b 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20  K_TRANSACTION", 
2770: 20 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20   ALWAYS         
2780: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
2790: 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20  TRIGGER",       
27a0: 20 20 20 22 54 4b 5f 54 52 49 47 47 45 52 22 2c     "TK_TRIGGER",
27b0: 20 20 20 20 20 20 54 52 49 47 47 45 52 20 20 20        TRIGGER   
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
27d0: 20 20 7b 20 22 55 4e 49 4f 4e 22 2c 20 20 20 20    { "UNION",    
27e0: 20 20 20 20 20 20 20 20 22 54 4b 5f 55 4e 49 4f          "TK_UNIO
27f0: 4e 22 2c 20 20 20 20 20 20 20 20 43 4f 4d 50 4f  N",        COMPO
2800: 55 4e 44 20 20 20 20 20 20 20 20 20 20 20 20 20  UND             
2810: 20 20 7d 2c 0a 20 20 7b 20 22 55 4e 49 51 55 45    },.  { "UNIQUE
2820: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b  ",           "TK
2830: 5f 55 4e 49 51 55 45 22 2c 20 20 20 20 20 20 20  _UNIQUE",       
2840: 41 4c 57 41 59 53 20 20 20 20 20 20 20 20 20 20  ALWAYS          
2850: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 55         },.  { "U
2860: 50 44 41 54 45 22 2c 20 20 20 20 20 20 20 20 20  PDATE",         
2870: 20 20 22 54 4b 5f 55 50 44 41 54 45 22 2c 20 20    "TK_UPDATE",  
2880: 20 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20       ALWAYS     
2890: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
28a0: 20 7b 20 22 55 53 49 4e 47 22 2c 20 20 20 20 20   { "USING",     
28b0: 20 20 20 20 20 20 20 22 54 4b 5f 55 53 49 4e 47         "TK_USING
28c0: 22 2c 20 20 20 20 20 20 20 20 41 4c 57 41 59 53  ",        ALWAYS
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 7d 2c 0a 20 20 7b 20 22 56 41 43 55 55 4d 22   },.  { "VACUUM"
28f0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f  ,           "TK_
2900: 56 41 43 55 55 4d 22 2c 20 20 20 20 20 20 20 56  VACUUM",       V
2910: 41 43 55 55 4d 20 20 20 20 20 20 20 20 20 20 20  ACUUM           
2920: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 56 41        },.  { "VA
2930: 4c 55 45 53 22 2c 20 20 20 20 20 20 20 20 20 20  LUES",          
2940: 20 22 54 4b 5f 56 41 4c 55 45 53 22 2c 20 20 20   "TK_VALUES",   
2950: 20 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20      ALWAYS      
2960: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2970: 7b 20 22 56 49 45 57 22 2c 20 20 20 20 20 20 20  { "VIEW",       
2980: 20 20 20 20 20 20 22 54 4b 5f 56 49 45 57 22 2c        "TK_VIEW",
2990: 20 20 20 20 20 20 20 20 20 56 49 45 57 20 20 20           VIEW   
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 7d 2c 0a 20 20 7b 20 22 57 48 45 4e 22 2c 20 20  },.  { "WHEN",  
29c0: 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 57             "TK_W
29d0: 48 45 4e 22 2c 20 20 20 20 20 20 20 20 20 41 4c  HEN",         AL
29e0: 57 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20  WAYS            
29f0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 57 48 45       },.  { "WHE
2a00: 52 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RE",            
2a10: 22 54 4b 5f 57 48 45 52 45 22 2c 20 20 20 20 20  "TK_WHERE",     
2a20: 20 20 20 41 4c 57 41 59 53 20 20 20 20 20 20 20     ALWAYS       
2a30: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 7d 3b 0a            },.};.
2a40: 0a 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65  ./* Number of ke
2a50: 79 77 6f 72 64 73 20 2a 2f 0a 73 74 61 74 69 63  ywords */.static
2a60: 20 69 6e 74 20 4e 4b 45 59 57 4f 52 44 20 3d 20   int NKEYWORD = 
2a70: 28 73 69 7a 65 6f 66 28 61 4b 65 79 77 6f 72 64  (sizeof(aKeyword
2a80: 54 61 62 6c 65 29 2f 73 69 7a 65 6f 66 28 61 4b  Table)/sizeof(aK
2a90: 65 79 77 6f 72 64 54 61 62 6c 65 5b 30 5d 29 29  eywordTable[0]))
2aa0: 3b 0a 0a 2f 2a 20 41 6e 20 61 72 72 61 79 20 74  ;../* An array t
2ab0: 6f 20 6d 61 70 20 61 6c 6c 20 75 70 70 65 72 2d  o map all upper-
2ac0: 63 61 73 65 20 63 68 61 72 61 63 74 65 72 73 20  case characters 
2ad0: 69 6e 74 6f 20 74 68 65 69 72 20 63 6f 72 72 65  into their corre
2ae0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6c 6f 77 65  sponding.** lowe
2af0: 72 2d 63 61 73 65 20 63 68 61 72 61 63 74 65 72  r-case character
2b00: 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 75 6e 73 69  . .*/.const unsi
2b10: 67 6e 65 64 20 63 68 61 72 20 73 71 6c 69 74 65  gned char sqlite
2b20: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 5d 20  3UpperToLower[] 
2b30: 3d 20 7b 0a 20 20 20 20 20 20 30 2c 20 20 31 2c  = {.      0,  1,
2b40: 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c    2,  3,  4,  5,
2b50: 20 20 36 2c 20 20 37 2c 20 20 38 2c 20 20 39 2c    6,  7,  8,  9,
2b60: 20 31 30 2c 20 31 31 2c 20 31 32 2c 20 31 33 2c   10, 11, 12, 13,
2b70: 20 31 34 2c 20 31 35 2c 20 31 36 2c 20 31 37 2c   14, 15, 16, 17,
2b80: 0a 20 20 20 20 20 31 38 2c 20 31 39 2c 20 32 30  .     18, 19, 20
2b90: 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34  , 21, 22, 23, 24
2ba0: 2c 20 32 35 2c 20 32 36 2c 20 32 37 2c 20 32 38  , 25, 26, 27, 28
2bb0: 2c 20 32 39 2c 20 33 30 2c 20 33 31 2c 20 33 32  , 29, 30, 31, 32
2bc0: 2c 20 33 33 2c 20 33 34 2c 20 33 35 2c 0a 20 20  , 33, 34, 35,.  
2bd0: 20 20 20 33 36 2c 20 33 37 2c 20 33 38 2c 20 33     36, 37, 38, 3
2be0: 39 2c 20 34 30 2c 20 34 31 2c 20 34 32 2c 20 34  9, 40, 41, 42, 4
2bf0: 33 2c 20 34 34 2c 20 34 35 2c 20 34 36 2c 20 34  3, 44, 45, 46, 4
2c00: 37 2c 20 34 38 2c 20 34 39 2c 20 35 30 2c 20 35  7, 48, 49, 50, 5
2c10: 31 2c 20 35 32 2c 20 35 33 2c 0a 20 20 20 20 20  1, 52, 53,.     
2c20: 35 34 2c 20 35 35 2c 20 35 36 2c 20 35 37 2c 20  54, 55, 56, 57, 
2c30: 35 38 2c 20 35 39 2c 20 36 30 2c 20 36 31 2c 20  58, 59, 60, 61, 
2c40: 36 32 2c 20 36 33 2c 20 36 34 2c 20 39 37 2c 20  62, 63, 64, 97, 
2c50: 39 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31  98, 99,100,101,1
2c60: 30 32 2c 31 30 33 2c 0a 20 20 20 20 31 30 34 2c  02,103,.    104,
2c70: 31 30 35 2c 31 30 36 2c 31 30 37 2c 31 30 38 2c  105,106,107,108,
2c80: 31 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c  109,110,111,112,
2c90: 31 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c  113,114,115,116,
2ca0: 31 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c  117,118,119,120,
2cb0: 31 32 31 2c 0a 20 20 20 20 31 32 32 2c 20 39 31  121,.    122, 91
2cc0: 2c 20 39 32 2c 20 39 33 2c 20 39 34 2c 20 39 35  , 92, 93, 94, 95
2cd0: 2c 20 39 36 2c 20 39 37 2c 20 39 38 2c 20 39 39  , 96, 97, 98, 99
2ce0: 2c 31 30 30 2c 31 30 31 2c 31 30 32 2c 31 30 33  ,100,101,102,103
2cf0: 2c 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37  ,104,105,106,107
2d00: 2c 0a 20 20 20 20 31 30 38 2c 31 30 39 2c 31 31  ,.    108,109,11
2d10: 30 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c 31 31  0,111,112,113,11
2d20: 34 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c 31 31  4,115,116,117,11
2d30: 38 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c 31 32  8,119,120,121,12
2d40: 32 2c 31 32 33 2c 31 32 34 2c 31 32 35 2c 0a 20  2,123,124,125,. 
2d50: 20 20 20 31 32 36 2c 31 32 37 2c 31 32 38 2c 31     126,127,128,1
2d60: 32 39 2c 31 33 30 2c 31 33 31 2c 31 33 32 2c 31  29,130,131,132,1
2d70: 33 33 2c 31 33 34 2c 31 33 35 2c 31 33 36 2c 31  33,134,135,136,1
2d80: 33 37 2c 31 33 38 2c 31 33 39 2c 31 34 30 2c 31  37,138,139,140,1
2d90: 34 31 2c 31 34 32 2c 31 34 33 2c 0a 20 20 20 20  41,142,143,.    
2da0: 31 34 34 2c 31 34 35 2c 31 34 36 2c 31 34 37 2c  144,145,146,147,
2db0: 31 34 38 2c 31 34 39 2c 31 35 30 2c 31 35 31 2c  148,149,150,151,
2dc0: 31 35 32 2c 31 35 33 2c 31 35 34 2c 31 35 35 2c  152,153,154,155,
2dd0: 31 35 36 2c 31 35 37 2c 31 35 38 2c 31 35 39 2c  156,157,158,159,
2de0: 31 36 30 2c 31 36 31 2c 0a 20 20 20 20 31 36 32  160,161,.    162
2df0: 2c 31 36 33 2c 31 36 34 2c 31 36 35 2c 31 36 36  ,163,164,165,166
2e00: 2c 31 36 37 2c 31 36 38 2c 31 36 39 2c 31 37 30  ,167,168,169,170
2e10: 2c 31 37 31 2c 31 37 32 2c 31 37 33 2c 31 37 34  ,171,172,173,174
2e20: 2c 31 37 35 2c 31 37 36 2c 31 37 37 2c 31 37 38  ,175,176,177,178
2e30: 2c 31 37 39 2c 0a 20 20 20 20 31 38 30 2c 31 38  ,179,.    180,18
2e40: 31 2c 31 38 32 2c 31 38 33 2c 31 38 34 2c 31 38  1,182,183,184,18
2e50: 35 2c 31 38 36 2c 31 38 37 2c 31 38 38 2c 31 38  5,186,187,188,18
2e60: 39 2c 31 39 30 2c 31 39 31 2c 31 39 32 2c 31 39  9,190,191,192,19
2e70: 33 2c 31 39 34 2c 31 39 35 2c 31 39 36 2c 31 39  3,194,195,196,19
2e80: 37 2c 0a 20 20 20 20 31 39 38 2c 31 39 39 2c 32  7,.    198,199,2
2e90: 30 30 2c 32 30 31 2c 32 30 32 2c 32 30 33 2c 32  00,201,202,203,2
2ea0: 30 34 2c 32 30 35 2c 32 30 36 2c 32 30 37 2c 32  04,205,206,207,2
2eb0: 30 38 2c 32 30 39 2c 32 31 30 2c 32 31 31 2c 32  08,209,210,211,2
2ec0: 31 32 2c 32 31 33 2c 32 31 34 2c 32 31 35 2c 0a  12,213,214,215,.
2ed0: 20 20 20 20 32 31 36 2c 32 31 37 2c 32 31 38 2c      216,217,218,
2ee0: 32 31 39 2c 32 32 30 2c 32 32 31 2c 32 32 32 2c  219,220,221,222,
2ef0: 32 32 33 2c 32 32 34 2c 32 32 35 2c 32 32 36 2c  223,224,225,226,
2f00: 32 32 37 2c 32 32 38 2c 32 32 39 2c 32 33 30 2c  227,228,229,230,
2f10: 32 33 31 2c 32 33 32 2c 32 33 33 2c 0a 20 20 20  231,232,233,.   
2f20: 20 32 33 34 2c 32 33 35 2c 32 33 36 2c 32 33 37   234,235,236,237
2f30: 2c 32 33 38 2c 32 33 39 2c 32 34 30 2c 32 34 31  ,238,239,240,241
2f40: 2c 32 34 32 2c 32 34 33 2c 32 34 34 2c 32 34 35  ,242,243,244,245
2f50: 2c 32 34 36 2c 32 34 37 2c 32 34 38 2c 32 34 39  ,246,247,248,249
2f60: 2c 32 35 30 2c 32 35 31 2c 0a 20 20 20 20 32 35  ,250,251,.    25
2f70: 32 2c 32 35 33 2c 32 35 34 2c 32 35 35 0a 7d 3b  2,253,254,255.};
2f80: 0a 23 64 65 66 69 6e 65 20 55 70 70 65 72 54 6f  .#define UpperTo
2f90: 4c 6f 77 65 72 20 73 71 6c 69 74 65 33 55 70 70  Lower sqlite3Upp
2fa0: 65 72 54 6f 4c 6f 77 65 72 0a 0a 2f 2a 0a 2a 2a  erToLower../*.**
2fb0: 20 43 6f 6d 70 61 72 69 73 69 6f 6e 20 66 75 6e   Comparision fun
2fc0: 63 74 69 6f 6e 20 66 6f 72 20 74 77 6f 20 4b 65  ction for two Ke
2fd0: 79 77 6f 72 64 20 72 65 63 6f 72 64 73 0a 2a 2f  yword records.*/
2fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6b 65 79 77  .static int keyw
2ff0: 6f 72 64 43 6f 6d 70 61 72 65 31 28 63 6f 6e 73  ordCompare1(cons
3000: 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74  t void *a, const
3010: 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e   void *b){.  con
3020: 73 74 20 4b 65 79 77 6f 72 64 20 2a 70 41 20 3d  st Keyword *pA =
3030: 20 28 4b 65 79 77 6f 72 64 2a 29 61 3b 0a 20 20   (Keyword*)a;.  
3040: 63 6f 6e 73 74 20 4b 65 79 77 6f 72 64 20 2a 70  const Keyword *p
3050: 42 20 3d 20 28 4b 65 79 77 6f 72 64 2a 29 62 3b  B = (Keyword*)b;
3060: 0a 20 20 69 6e 74 20 6e 20 3d 20 70 41 2d 3e 6c  .  int n = pA->l
3070: 65 6e 20 2d 20 70 42 2d 3e 6c 65 6e 3b 0a 20 20  en - pB->len;.  
3080: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
3090: 6e 20 3d 20 73 74 72 63 6d 70 28 70 41 2d 3e 7a  n = strcmp(pA->z
30a0: 4e 61 6d 65 2c 20 70 42 2d 3e 7a 4e 61 6d 65 29  Name, pB->zName)
30b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
30c0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6b  ;.}.static int k
30d0: 65 79 77 6f 72 64 43 6f 6d 70 61 72 65 32 28 63  eywordCompare2(c
30e0: 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f  onst void *a, co
30f0: 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20  nst void *b){.  
3100: 63 6f 6e 73 74 20 4b 65 79 77 6f 72 64 20 2a 70  const Keyword *p
3110: 41 20 3d 20 28 4b 65 79 77 6f 72 64 2a 29 61 3b  A = (Keyword*)a;
3120: 0a 20 20 63 6f 6e 73 74 20 4b 65 79 77 6f 72 64  .  const Keyword
3130: 20 2a 70 42 20 3d 20 28 4b 65 79 77 6f 72 64 2a   *pB = (Keyword*
3140: 29 62 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74  )b;.  int n = st
3150: 72 63 6d 70 28 70 41 2d 3e 7a 4e 61 6d 65 2c 20  rcmp(pA->zName, 
3160: 70 42 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  pB->zName);.  re
3170: 74 75 72 6e 20 6e 3b 0a 7d 0a 73 74 61 74 69 63  turn n;.}.static
3180: 20 69 6e 74 20 6b 65 79 77 6f 72 64 43 6f 6d 70   int keywordComp
3190: 61 72 65 33 28 63 6f 6e 73 74 20 76 6f 69 64 20  are3(const void 
31a0: 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
31b0: 62 29 7b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 77  b){.  const Keyw
31c0: 6f 72 64 20 2a 70 41 20 3d 20 28 4b 65 79 77 6f  ord *pA = (Keywo
31d0: 72 64 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 4b  rd*)a;.  const K
31e0: 65 79 77 6f 72 64 20 2a 70 42 20 3d 20 28 4b 65  eyword *pB = (Ke
31f0: 79 77 6f 72 64 2a 29 62 3b 0a 20 20 69 6e 74 20  yword*)b;.  int 
3200: 6e 20 3d 20 70 41 2d 3e 6f 66 66 73 65 74 20 2d  n = pA->offset -
3210: 20 70 42 2d 3e 6f 66 66 73 65 74 3b 0a 20 20 72   pB->offset;.  r
3220: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
3230: 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79 77 6f  * Return a Keywo
3240: 72 64 54 61 62 6c 65 20 65 6e 74 72 79 20 77 69  rdTable entry wi
3250: 74 68 20 74 68 65 20 67 69 76 65 6e 20 69 64 0a  th the given id.
3260: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 77 6f 72  */.static Keywor
3270: 64 20 2a 66 69 6e 64 42 79 49 64 28 69 6e 74 20  d *findById(int 
3280: 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  id){.  int i;.  
3290: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 4b 45 59 57  for(i=0; i<NKEYW
32a0: 4f 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ORD; i++){.    i
32b0: 66 28 20 61 4b 65 79 77 6f 72 64 54 61 62 6c 65  f( aKeywordTable
32c0: 5b 69 5d 2e 69 64 3d 3d 69 64 20 29 20 62 72 65  [i].id==id ) bre
32d0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
32e0: 20 26 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b   &aKeywordTable[
32f0: 69 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  i];.}../*.** Thi
3300: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
3310: 68 65 20 77 6f 72 6b 2e 20 20 54 68 65 20 67 65  he work.  The ge
3320: 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 73 20  nerated code is 
3330: 70 72 69 6e 74 65 64 20 6f 6e 20 73 74 61 6e 64  printed on stand
3340: 61 72 64 0a 2a 2a 20 6f 75 74 70 75 74 2e 0a 2a  ard.** output..*
3350: 2f 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  /.int main(int a
3360: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
3370: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
3380: 2c 20 68 3b 0a 20 20 69 6e 74 20 62 65 73 74 53  , h;.  int bestS
3390: 69 7a 65 2c 20 62 65 73 74 43 6f 75 6e 74 3b 0a  ize, bestCount;.
33a0: 20 20 69 6e 74 20 63 6f 75 6e 74 3b 0a 20 20 69    int count;.  i
33b0: 6e 74 20 6e 43 68 61 72 3b 0a 20 20 69 6e 74 20  nt nChar;.  int 
33c0: 61 48 61 73 68 5b 31 30 30 30 5d 3b 20 20 2f 2a  aHash[1000];  /*
33d0: 20 31 30 30 30 20 69 73 20 6d 75 63 68 20 62 69   1000 is much bi
33e0: 67 67 65 72 20 74 68 61 6e 20 4e 4b 45 59 57 4f  gger than NKEYWO
33f0: 52 44 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 6d 6f  RD */..  /* Remo
3400: 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
3410: 74 68 65 20 6c 69 73 74 20 6f 66 20 6b 65 79 77  the list of keyw
3420: 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 20 6d  ords that have m
3430: 61 73 6b 3d 3d 30 20 2a 2f 0a 20 20 66 6f 72 28  ask==0 */.  for(
3440: 69 3d 6a 3d 30 3b 20 69 3c 4e 4b 45 59 57 4f 52  i=j=0; i<NKEYWOR
3450: 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  D; i++){.    if(
3460: 20 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69   aKeywordTable[i
3470: 5d 2e 6d 61 73 6b 3d 3d 30 20 29 20 63 6f 6e 74  ].mask==0 ) cont
3480: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6a 3c  inue;.    if( j<
3490: 69 20 29 7b 0a 20 20 20 20 20 20 61 4b 65 79 77  i ){.      aKeyw
34a0: 6f 72 64 54 61 62 6c 65 5b 6a 5d 20 3d 20 61 4b  ordTable[j] = aK
34b0: 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 3b 0a  eywordTable[i];.
34c0: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
34d0: 20 7d 0a 20 20 4e 4b 45 59 57 4f 52 44 20 3d 20   }.  NKEYWORD = 
34e0: 6a 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  j;..  /* Fill in
34f0: 20 74 68 65 20 6c 65 6e 67 74 68 73 20 6f 66 20   the lengths of 
3500: 73 74 72 69 6e 67 73 20 61 6e 64 20 68 61 73 68  strings and hash
3510: 65 73 20 66 6f 72 20 61 6c 6c 20 65 6e 74 72 69  es for all entri
3520: 65 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  es. */.  for(i=0
3530: 3b 20 69 3c 4e 4b 45 59 57 4f 52 44 3b 20 69 2b  ; i<NKEYWORD; i+
3540: 2b 29 7b 0a 20 20 20 20 4b 65 79 77 6f 72 64 20  +){.    Keyword 
3550: 2a 70 20 3d 20 26 61 4b 65 79 77 6f 72 64 54 61  *p = &aKeywordTa
3560: 62 6c 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 6c  ble[i];.    p->l
3570: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  en = strlen(p->z
3580: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 68 61  Name);.    p->ha
3590: 73 68 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65  sh = UpperToLowe
35a0: 72 5b 70 2d 3e 7a 4e 61 6d 65 5b 30 5d 5d 2a 35  r[p->zName[0]]*5
35b0: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
35c0: 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 70 2d   UpperToLower[p-
35d0: 3e 7a 4e 61 6d 65 5b 70 2d 3e 6c 65 6e 2d 31 5d  >zName[p->len-1]
35e0: 5d 2a 33 20 2b 20 70 2d 3e 6c 65 6e 3b 0a 20 20  ]*3 + p->len;.  
35f0: 20 20 70 2d 3e 69 64 20 3d 20 69 2b 31 3b 0a 20    p->id = i+1;. 
3600: 20 7d 0a 0a 20 20 2f 2a 20 53 6f 72 74 20 74 68   }..  /* Sort th
3610: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 73 68 6f  e table from sho
3620: 72 74 65 73 74 20 74 6f 20 6c 6f 6e 67 65 73 74  rtest to longest
3630: 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 71 73   keyword */.  qs
3640: 6f 72 74 28 61 4b 65 79 77 6f 72 64 54 61 62 6c  ort(aKeywordTabl
3650: 65 2c 20 4e 4b 45 59 57 4f 52 44 2c 20 73 69 7a  e, NKEYWORD, siz
3660: 65 6f 66 28 61 4b 65 79 77 6f 72 64 54 61 62 6c  eof(aKeywordTabl
3670: 65 5b 30 5d 29 2c 20 6b 65 79 77 6f 72 64 43 6f  e[0]), keywordCo
3680: 6d 70 61 72 65 31 29 3b 0a 0a 20 20 2f 2a 20 4c  mpare1);..  /* L
3690: 6f 6f 6b 20 66 6f 72 20 73 68 6f 72 74 20 6b 65  ook for short ke
36a0: 79 77 6f 72 64 73 20 65 6d 62 65 64 64 65 64 20  ywords embedded 
36b0: 69 6e 20 6c 6f 6e 67 65 72 20 6b 65 79 77 6f 72  in longer keywor
36c0: 64 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 4e 4b  ds */.  for(i=NK
36d0: 45 59 57 4f 52 44 2d 32 3b 20 69 3e 3d 30 3b 20  EYWORD-2; i>=0; 
36e0: 69 2d 2d 29 7b 0a 20 20 20 20 4b 65 79 77 6f 72  i--){.    Keywor
36f0: 64 20 2a 70 20 3d 20 26 61 4b 65 79 77 6f 72 64  d *p = &aKeyword
3700: 54 61 62 6c 65 5b 69 5d 3b 0a 20 20 20 20 66 6f  Table[i];.    fo
3710: 72 28 6a 3d 4e 4b 45 59 57 4f 52 44 2d 31 3b 20  r(j=NKEYWORD-1; 
3720: 6a 3e 69 20 26 26 20 70 2d 3e 73 75 62 73 74 72  j>i && p->substr
3730: 49 64 3d 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20  Id==0; j--){.   
3740: 20 20 20 4b 65 79 77 6f 72 64 20 2a 70 4f 74 68     Keyword *pOth
3750: 65 72 20 3d 20 26 61 4b 65 79 77 6f 72 64 54 61  er = &aKeywordTa
3760: 62 6c 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  ble[j];.      if
3770: 28 20 70 4f 74 68 65 72 2d 3e 73 75 62 73 74 72  ( pOther->substr
3780: 49 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  Id ) continue;. 
3790: 20 20 20 20 20 69 66 28 20 70 4f 74 68 65 72 2d       if( pOther-
37a0: 3e 6c 65 6e 3c 3d 70 2d 3e 6c 65 6e 20 29 20 63  >len<=p->len ) c
37b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
37c0: 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 70 4f 74 68 65  or(k=0; k<=pOthe
37d0: 72 2d 3e 6c 65 6e 2d 70 2d 3e 6c 65 6e 3b 20 6b  r->len-p->len; k
37e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
37f0: 20 6d 65 6d 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65   memcmp(p->zName
3800: 2c 20 26 70 4f 74 68 65 72 2d 3e 7a 4e 61 6d 65  , &pOther->zName
3810: 5b 6b 5d 2c 20 70 2d 3e 6c 65 6e 29 3d 3d 30 20  [k], p->len)==0 
3820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
3830: 73 75 62 73 74 72 49 64 20 3d 20 70 4f 74 68 65  substrId = pOthe
3840: 72 2d 3e 69 64 3b 0a 20 20 20 20 20 20 20 20 20  r->id;.         
3850: 20 70 2d 3e 73 75 62 73 74 72 4f 66 66 73 65 74   p->substrOffset
3860: 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20   = k;.          
3870: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
3880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3890: 20 7d 0a 0a 20 20 2f 2a 20 53 6f 72 74 20 74 68   }..  /* Sort th
38a0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61 6c 70  e table into alp
38b0: 68 61 62 65 74 69 63 61 6c 20 6f 72 64 65 72 20  habetical order 
38c0: 2a 2f 0a 20 20 71 73 6f 72 74 28 61 4b 65 79 77  */.  qsort(aKeyw
38d0: 6f 72 64 54 61 62 6c 65 2c 20 4e 4b 45 59 57 4f  ordTable, NKEYWO
38e0: 52 44 2c 20 73 69 7a 65 6f 66 28 61 4b 65 79 77  RD, sizeof(aKeyw
38f0: 6f 72 64 54 61 62 6c 65 5b 30 5d 29 2c 20 6b 65  ordTable[0]), ke
3900: 79 77 6f 72 64 43 6f 6d 70 61 72 65 32 29 3b 0a  ywordCompare2);.
3910: 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
3920: 65 20 6f 66 66 73 65 74 20 66 6f 72 20 61 6c 6c  e offset for all
3930: 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 6e 43   entries */.  nC
3940: 68 61 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  har = 0;.  for(i
3950: 3d 30 3b 20 69 3c 4e 4b 45 59 57 4f 52 44 3b 20  =0; i<NKEYWORD; 
3960: 69 2b 2b 29 7b 0a 20 20 20 20 4b 65 79 77 6f 72  i++){.    Keywor
3970: 64 20 2a 70 20 3d 20 26 61 4b 65 79 77 6f 72 64  d *p = &aKeyword
3980: 54 61 62 6c 65 5b 69 5d 3b 0a 20 20 20 20 69 66  Table[i];.    if
3990: 28 20 70 2d 3e 6f 66 66 73 65 74 3e 30 20 7c 7c  ( p->offset>0 ||
39a0: 20 70 2d 3e 73 75 62 73 74 72 49 64 20 29 20 63   p->substrId ) c
39b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 2d 3e  ontinue;.    p->
39c0: 6f 66 66 73 65 74 20 3d 20 6e 43 68 61 72 3b 0a  offset = nChar;.
39d0: 20 20 20 20 6e 43 68 61 72 20 2b 3d 20 70 2d 3e      nChar += p->
39e0: 6c 65 6e 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 70  len;.    for(k=p
39f0: 2d 3e 6c 65 6e 2d 31 3b 20 6b 3e 3d 31 3b 20 6b  ->len-1; k>=1; k
3a00: 2d 2d 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  --){.      for(j
3a10: 3d 69 2b 31 3b 20 6a 3c 4e 4b 45 59 57 4f 52 44  =i+1; j<NKEYWORD
3a20: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3a30: 4b 65 79 77 6f 72 64 20 2a 70 4f 74 68 65 72 20  Keyword *pOther 
3a40: 3d 20 26 61 4b 65 79 77 6f 72 64 54 61 62 6c 65  = &aKeywordTable
3a50: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
3a60: 20 70 4f 74 68 65 72 2d 3e 6f 66 66 73 65 74 3e   pOther->offset>
3a70: 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 73 75 62  0 || pOther->sub
3a80: 73 74 72 49 64 20 29 20 63 6f 6e 74 69 6e 75 65  strId ) continue
3a90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
3aa0: 74 68 65 72 2d 3e 6c 65 6e 3c 3d 6b 20 29 20 63  ther->len<=k ) c
3ab0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
3ac0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 2d 3e   if( memcmp(&p->
3ad0: 7a 4e 61 6d 65 5b 70 2d 3e 6c 65 6e 2d 6b 5d 2c  zName[p->len-k],
3ae0: 20 70 4f 74 68 65 72 2d 3e 7a 4e 61 6d 65 2c 20   pOther->zName, 
3af0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
3b00: 20 20 20 70 20 3d 20 70 4f 74 68 65 72 3b 0a 20     p = pOther;. 
3b10: 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 66 66 73           p->offs
3b20: 65 74 20 3d 20 6e 43 68 61 72 20 2d 20 6b 3b 0a  et = nChar - k;.
3b30: 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 20            nChar 
3b40: 3d 20 70 2d 3e 6f 66 66 73 65 74 20 2b 20 70 2d  = p->offset + p-
3b50: 3e 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  >len;.          
3b60: 70 2d 3e 7a 4e 61 6d 65 20 2b 3d 20 6b 3b 0a 20  p->zName += k;. 
3b70: 20 20 20 20 20 20 20 20 20 70 2d 3e 6c 65 6e 20           p->len 
3b80: 2d 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  -= k;.          
3b90: 70 2d 3e 70 72 65 66 69 78 20 3d 20 6b 3b 0a 20  p->prefix = k;. 
3ba0: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 69 3b 0a           j = i;.
3bb0: 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d            k = p-
3bc0: 3e 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  >len;.        }.
3bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3be0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e  }.  for(i=0; i<N
3bf0: 4b 45 59 57 4f 52 44 3b 20 69 2b 2b 29 7b 0a 20  KEYWORD; i++){. 
3c00: 20 20 20 4b 65 79 77 6f 72 64 20 2a 70 20 3d 20     Keyword *p = 
3c10: 26 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69  &aKeywordTable[i
3c20: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 75  ];.    if( p->su
3c30: 62 73 74 72 49 64 20 29 7b 0a 20 20 20 20 20 20  bstrId ){.      
3c40: 70 2d 3e 6f 66 66 73 65 74 20 3d 20 66 69 6e 64  p->offset = find
3c50: 42 79 49 64 28 70 2d 3e 73 75 62 73 74 72 49 64  ById(p->substrId
3c60: 29 2d 3e 6f 66 66 73 65 74 20 2b 20 70 2d 3e 73  )->offset + p->s
3c70: 75 62 73 74 72 4f 66 66 73 65 74 3b 0a 20 20 20  ubstrOffset;.   
3c80: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 6f 72   }.  }..  /* Sor
3c90: 74 20 74 68 65 20 74 61 62 6c 65 20 62 79 20 6f  t the table by o
3ca0: 66 66 73 65 74 20 2a 2f 0a 20 20 71 73 6f 72 74  ffset */.  qsort
3cb0: 28 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 2c 20  (aKeywordTable, 
3cc0: 4e 4b 45 59 57 4f 52 44 2c 20 73 69 7a 65 6f 66  NKEYWORD, sizeof
3cd0: 28 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 30  (aKeywordTable[0
3ce0: 5d 29 2c 20 6b 65 79 77 6f 72 64 43 6f 6d 70 61  ]), keywordCompa
3cf0: 72 65 33 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  re3);..  /* Figu
3d00: 72 65 20 6f 75 74 20 68 6f 77 20 62 69 67 20 74  re out how big t
3d10: 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
3d20: 74 61 62 6c 65 20 69 6e 20 6f 72 64 65 72 20 74  table in order t
3d30: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 0a 20  o minimize the. 
3d40: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f   ** number of co
3d50: 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a 20 20 62 65  llisions */.  be
3d60: 73 74 53 69 7a 65 20 3d 20 4e 4b 45 59 57 4f 52  stSize = NKEYWOR
3d70: 44 3b 0a 20 20 62 65 73 74 43 6f 75 6e 74 20 3d  D;.  bestCount =
3d80: 20 4e 4b 45 59 57 4f 52 44 2a 4e 4b 45 59 57 4f   NKEYWORD*NKEYWO
3d90: 52 44 3b 0a 20 20 66 6f 72 28 69 3d 4e 4b 45 59  RD;.  for(i=NKEY
3da0: 57 4f 52 44 2f 32 3b 20 69 3c 3d 32 2a 4e 4b 45  WORD/2; i<=2*NKE
3db0: 59 57 4f 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20  YWORD; i++){.   
3dc0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
3dd0: 2b 2b 29 20 61 48 61 73 68 5b 6a 5d 20 3d 20 30  ++) aHash[j] = 0
3de0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
3df0: 3c 4e 4b 45 59 57 4f 52 44 3b 20 6a 2b 2b 29 7b  <NKEYWORD; j++){
3e00: 0a 20 20 20 20 20 20 68 20 3d 20 61 4b 65 79 77  .      h = aKeyw
3e10: 6f 72 64 54 61 62 6c 65 5b 6a 5d 2e 68 61 73 68  ordTable[j].hash
3e20: 20 25 20 69 3b 0a 20 20 20 20 20 20 61 48 61 73   % i;.      aHas
3e30: 68 5b 68 5d 20 2a 3d 20 32 3b 0a 20 20 20 20 20  h[h] *= 2;.     
3e40: 20 61 48 61 73 68 5b 68 5d 2b 2b 3b 0a 20 20 20   aHash[h]++;.   
3e50: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6f 75   }.    for(j=cou
3e60: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20  nt=0; j<i; j++) 
3e70: 63 6f 75 6e 74 20 2b 3d 20 61 48 61 73 68 5b 6a  count += aHash[j
3e80: 5d 3b 0a 20 20 20 20 69 66 28 20 63 6f 75 6e 74  ];.    if( count
3e90: 3c 62 65 73 74 43 6f 75 6e 74 20 29 7b 0a 20 20  <bestCount ){.  
3ea0: 20 20 20 20 62 65 73 74 43 6f 75 6e 74 20 3d 20      bestCount = 
3eb0: 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 62 65 73  count;.      bes
3ec0: 74 53 69 7a 65 20 3d 20 69 3b 0a 20 20 20 20 7d  tSize = i;.    }
3ed0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
3ee0: 74 65 20 74 68 65 20 68 61 73 68 20 2a 2f 0a 20  te the hash */. 
3ef0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 62 65 73 74   for(i=0; i<best
3f00: 53 69 7a 65 3b 20 69 2b 2b 29 20 61 48 61 73 68  Size; i++) aHash
3f10: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  [i] = 0;.  for(i
3f20: 3d 30 3b 20 69 3c 4e 4b 45 59 57 4f 52 44 3b 20  =0; i<NKEYWORD; 
3f30: 69 2b 2b 29 7b 0a 20 20 20 20 68 20 3d 20 61 4b  i++){.    h = aK
3f40: 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 2e 68  eywordTable[i].h
3f50: 61 73 68 20 25 20 62 65 73 74 53 69 7a 65 3b 0a  ash % bestSize;.
3f60: 20 20 20 20 61 4b 65 79 77 6f 72 64 54 61 62 6c      aKeywordTabl
3f70: 65 5b 69 5d 2e 69 4e 65 78 74 20 3d 20 61 48 61  e[i].iNext = aHa
3f80: 73 68 5b 68 5d 3b 0a 20 20 20 20 61 48 61 73 68  sh[h];.    aHash
3f90: 5b 68 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 0a  [h] = i+1;.  }..
3fa0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
3fb0: 61 74 69 6e 67 20 63 6f 64 65 20 2a 2f 0a 20 20  ating code */.  
3fc0: 70 72 69 6e 74 66 28 22 73 74 61 74 69 63 20 69  printf("static i
3fd0: 6e 74 20 6b 65 79 77 6f 72 64 43 6f 64 65 28 63  nt keywordCode(c
3fe0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
3ff0: 74 20 6e 29 7b 5c 6e 22 29 3b 0a 0a 20 20 70 72  t n){\n");..  pr
4000: 69 6e 74 66 28 22 20 20 73 74 61 74 69 63 20 63  intf("  static c
4010: 6f 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b  onst char zText[
4020: 25 64 5d 20 3d 5c 6e 22 2c 20 6e 43 68 61 72 2b  %d] =\n", nChar+
4030: 31 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  1);.  for(i=j=0;
4040: 20 69 3c 4e 4b 45 59 57 4f 52 44 3b 20 69 2b 2b   i<NKEYWORD; i++
4050: 29 7b 0a 20 20 20 20 4b 65 79 77 6f 72 64 20 2a  ){.    Keyword *
4060: 70 20 3d 20 26 61 4b 65 79 77 6f 72 64 54 61 62  p = &aKeywordTab
4070: 6c 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  le[i];.    if( p
4080: 2d 3e 73 75 62 73 74 72 49 64 20 29 20 63 6f 6e  ->substrId ) con
4090: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6a  tinue;.    if( j
40a0: 3d 3d 30 20 29 20 70 72 69 6e 74 66 28 22 20 20  ==0 ) printf("  
40b0: 20 20 5c 22 22 29 3b 0a 20 20 20 20 70 72 69 6e    \"");.    prin
40c0: 74 66 28 22 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d  tf("%s", p->zNam
40d0: 65 29 3b 0a 20 20 20 20 6a 20 2b 3d 20 70 2d 3e  e);.    j += p->
40e0: 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3e 36  len;.    if( j>6
40f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  0 ){.      print
4100: 66 28 22 5c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  f("\"\n");.     
4110: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   j = 0;.    }.  
4120: 7d 0a 20 20 70 72 69 6e 74 66 28 22 25 73 3b 5c  }.  printf("%s;\
4130: 6e 22 2c 20 6a 3e 30 20 3f 20 22 5c 22 22 20 3a  n", j>0 ? "\"" :
4140: 20 22 20 20 22 29 3b 0a 0a 20 20 70 72 69 6e 74   "  ");..  print
4150: 66 28 22 20 20 73 74 61 74 69 63 20 63 6f 6e 73  f("  static cons
4160: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4170: 61 48 61 73 68 5b 25 64 5d 20 3d 20 7b 5c 6e 22  aHash[%d] = {\n"
4180: 2c 20 62 65 73 74 53 69 7a 65 29 3b 0a 20 20 66  , bestSize);.  f
4190: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 62 65 73 74  or(i=j=0; i<best
41a0: 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Size; i++){.    
41b0: 69 66 28 20 6a 3d 3d 30 20 29 20 70 72 69 6e 74  if( j==0 ) print
41c0: 66 28 22 20 20 20 20 22 29 3b 0a 20 20 20 20 70  f("    ");.    p
41d0: 72 69 6e 74 66 28 22 20 25 33 64 2c 22 2c 20 61  rintf(" %3d,", a
41e0: 48 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 6a 2b  Hash[i]);.    j+
41f0: 2b 3b 0a 20 20 20 20 69 66 28 20 6a 3e 31 32 20  +;.    if( j>12 
4200: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
4210: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 6a 20 3d  "\n");.      j =
4220: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
4230: 70 72 69 6e 74 66 28 22 25 73 20 20 7d 3b 5c 6e  printf("%s  };\n
4240: 22 2c 20 6a 3d 3d 30 20 3f 20 22 22 20 3a 20 22  ", j==0 ? "" : "
4250: 5c 6e 22 29 3b 20 20 20 20 0a 0a 20 20 70 72 69  \n");    ..  pri
4260: 6e 74 66 28 22 20 20 73 74 61 74 69 63 20 63 6f  ntf("  static co
4270: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4280: 72 20 61 4e 65 78 74 5b 25 64 5d 20 3d 20 7b 5c  r aNext[%d] = {\
4290: 6e 22 2c 20 4e 4b 45 59 57 4f 52 44 29 3b 0a 20  n", NKEYWORD);. 
42a0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 4b   for(i=j=0; i<NK
42b0: 45 59 57 4f 52 44 3b 20 69 2b 2b 29 7b 0a 20 20  EYWORD; i++){.  
42c0: 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 70 72 69    if( j==0 ) pri
42d0: 6e 74 66 28 22 20 20 20 20 22 29 3b 0a 20 20 20  ntf("    ");.   
42e0: 20 70 72 69 6e 74 66 28 22 20 25 33 64 2c 22 2c   printf(" %3d,",
42f0: 20 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69   aKeywordTable[i
4300: 5d 2e 69 4e 65 78 74 29 3b 0a 20 20 20 20 6a 2b  ].iNext);.    j+
4310: 2b 3b 0a 20 20 20 20 69 66 28 20 6a 3e 31 32 20  +;.    if( j>12 
4320: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
4330: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 6a 20 3d  "\n");.      j =
4340: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
4350: 70 72 69 6e 74 66 28 22 25 73 20 20 7d 3b 5c 6e  printf("%s  };\n
4360: 22 2c 20 6a 3d 3d 30 20 3f 20 22 22 20 3a 20 22  ", j==0 ? "" : "
4370: 5c 6e 22 29 3b 20 20 20 20 0a 0a 20 20 70 72 69  \n");    ..  pri
4380: 6e 74 66 28 22 20 20 73 74 61 74 69 63 20 63 6f  ntf("  static co
4390: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
43a0: 72 20 61 4c 65 6e 5b 25 64 5d 20 3d 20 7b 5c 6e  r aLen[%d] = {\n
43b0: 22 2c 20 4e 4b 45 59 57 4f 52 44 29 3b 0a 20 20  ", NKEYWORD);.  
43c0: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 4b 45  for(i=j=0; i<NKE
43d0: 59 57 4f 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20  YWORD; i++){.   
43e0: 20 69 66 28 20 6a 3d 3d 30 20 29 20 70 72 69 6e   if( j==0 ) prin
43f0: 74 66 28 22 20 20 20 20 22 29 3b 0a 20 20 20 20  tf("    ");.    
4400: 70 72 69 6e 74 66 28 22 20 25 33 64 2c 22 2c 20  printf(" %3d,", 
4410: 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d  aKeywordTable[i]
4420: 2e 6c 65 6e 2b 61 4b 65 79 77 6f 72 64 54 61 62  .len+aKeywordTab
4430: 6c 65 5b 69 5d 2e 70 72 65 66 69 78 29 3b 0a 20  le[i].prefix);. 
4440: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 69 66 28 20     j++;.    if( 
4450: 6a 3e 31 32 20 29 7b 0a 20 20 20 20 20 20 70 72  j>12 ){.      pr
4460: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
4470: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    j = 0;.    }. 
4480: 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 25 73 20   }.  printf("%s 
4490: 20 7d 3b 5c 6e 22 2c 20 6a 3d 3d 30 20 3f 20 22   };\n", j==0 ? "
44a0: 22 20 3a 20 22 5c 6e 22 29 3b 20 20 20 20 0a 0a  " : "\n");    ..
44b0: 20 20 70 72 69 6e 74 66 28 22 20 20 73 74 61 74    printf("  stat
44c0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
44d0: 64 20 73 68 6f 72 74 20 69 6e 74 20 61 4f 66 66  d short int aOff
44e0: 73 65 74 5b 25 64 5d 20 3d 20 7b 5c 6e 22 2c 20  set[%d] = {\n", 
44f0: 4e 4b 45 59 57 4f 52 44 29 3b 0a 20 20 66 6f 72  NKEYWORD);.  for
4500: 28 69 3d 6a 3d 30 3b 20 69 3c 4e 4b 45 59 57 4f  (i=j=0; i<NKEYWO
4510: 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  RD; i++){.    if
4520: 28 20 6a 3d 3d 30 20 29 20 70 72 69 6e 74 66 28  ( j==0 ) printf(
4530: 22 20 20 20 20 22 29 3b 0a 20 20 20 20 70 72 69  "    ");.    pri
4540: 6e 74 66 28 22 20 25 33 64 2c 22 2c 20 61 4b 65  ntf(" %3d,", aKe
4550: 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 2e 6f 66  ywordTable[i].of
4560: 66 73 65 74 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  fset);.    j++;.
4570: 20 20 20 20 69 66 28 20 6a 3e 31 32 20 29 7b 0a      if( j>12 ){.
4580: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e        printf("\n
4590: 22 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ");.      j = 0;
45a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 72 69  .    }.  }.  pri
45b0: 6e 74 66 28 22 25 73 20 20 7d 3b 5c 6e 22 2c 20  ntf("%s  };\n", 
45c0: 6a 3d 3d 30 20 3f 20 22 22 20 3a 20 22 5c 6e 22  j==0 ? "" : "\n"
45d0: 29 3b 0a 0a 20 20 70 72 69 6e 74 66 28 22 20 20  );..  printf("  
45e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
45f0: 69 67 6e 65 64 20 63 68 61 72 20 61 43 6f 64 65  igned char aCode
4600: 5b 25 64 5d 20 3d 20 7b 5c 6e 22 2c 20 4e 4b 45  [%d] = {\n", NKE
4610: 59 57 4f 52 44 29 3b 0a 20 20 66 6f 72 28 69 3d  YWORD);.  for(i=
4620: 6a 3d 30 3b 20 69 3c 4e 4b 45 59 57 4f 52 44 3b  j=0; i<NKEYWORD;
4630: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
4640: 2a 7a 54 6f 6b 65 6e 20 3d 20 61 4b 65 79 77 6f  *zToken = aKeywo
4650: 72 64 54 61 62 6c 65 5b 69 5d 2e 7a 54 6f 6b 65  rdTable[i].zToke
4660: 6e 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 6a  nType;.    if( j
4670: 3d 3d 30 20 29 20 70 72 69 6e 74 66 28 22 20 20  ==0 ) printf("  
4680: 20 20 22 29 3b 0a 20 20 20 20 70 72 69 6e 74 66    ");.    printf
4690: 28 22 25 73 2c 25 2a 73 22 2c 20 7a 54 6f 6b 65  ("%s,%*s", zToke
46a0: 6e 2c 20 28 69 6e 74 29 28 31 34 2d 73 74 72 6c  n, (int)(14-strl
46b0: 65 6e 28 7a 54 6f 6b 65 6e 29 29 2c 20 22 22 29  en(zToken)), "")
46c0: 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 69  ;.    j++;.    i
46d0: 66 28 20 6a 3e 3d 35 20 29 7b 0a 20 20 20 20 20  f( j>=5 ){.     
46e0: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
46f0: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
4700: 7d 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22  }.  }.  printf("
4710: 25 73 20 20 7d 3b 5c 6e 22 2c 20 6a 3d 3d 30 20  %s  };\n", j==0 
4720: 3f 20 22 22 20 3a 20 22 5c 6e 22 29 3b 0a 0a 20  ? "" : "\n");.. 
4730: 20 70 72 69 6e 74 66 28 22 20 20 69 6e 74 20 68   printf("  int h
4740: 2c 20 69 3b 5c 6e 22 29 3b 0a 20 20 70 72 69 6e  , i;\n");.  prin
4750: 74 66 28 22 20 20 69 66 28 20 6e 3c 32 20 29 20  tf("  if( n<2 ) 
4760: 72 65 74 75 72 6e 20 54 4b 5f 49 44 3b 5c 6e 22  return TK_ID;\n"
4770: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 68  );.  printf("  h
4780: 20 3d 20 28 73 71 6c 69 74 65 33 55 70 70 65 72   = (sqlite3Upper
4790: 54 6f 4c 6f 77 65 72 5b 28 28 75 6e 73 69 67 6e  ToLower[((unsign
47a0: 65 64 20 63 68 61 72 2a 29 7a 29 5b 30 5d 5d 2a  ed char*)z)[0]]*
47b0: 35 20 2b 20 5c 6e 22 0a 20 20 20 20 20 20 20 20  5 + \n".        
47c0: 20 22 20 20 20 20 20 20 73 71 6c 69 74 65 33 55   "      sqlite3U
47d0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 28 75 6e  pperToLower[((un
47e0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b  signed char*)z)[
47f0: 6e 2d 31 5d 5d 2a 33 20 2b 5c 6e 22 0a 20 20 20  n-1]]*3 +\n".   
4800: 20 20 20 20 20 20 22 20 20 20 20 20 20 6e 29 20        "      n) 
4810: 25 25 20 25 64 3b 5c 6e 22 2c 20 62 65 73 74 53  %% %d;\n", bestS
4820: 69 7a 65 29 3b 0a 20 20 70 72 69 6e 74 66 28 22  ize);.  printf("
4830: 20 20 66 6f 72 28 69 3d 28 28 69 6e 74 29 61 48    for(i=((int)aH
4840: 61 73 68 5b 68 5d 29 2d 31 3b 20 69 3e 3d 30 3b  ash[h])-1; i>=0;
4850: 20 69 3d 28 28 69 6e 74 29 61 4e 65 78 74 5b 69   i=((int)aNext[i
4860: 5d 29 2d 31 29 7b 5c 6e 22 29 3b 0a 20 20 70 72  ])-1){\n");.  pr
4870: 69 6e 74 66 28 22 20 20 20 20 69 66 28 20 61 4c  intf("    if( aL
4880: 65 6e 5b 69 5d 3d 3d 6e 20 26 26 22 0a 20 20 20  en[i]==n &&".   
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48a0: 22 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  " sqlite3StrNICm
48b0: 70 28 26 7a 54 65 78 74 5b 61 4f 66 66 73 65 74  p(&zText[aOffset
48c0: 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 20 29 7b 5c  [i]],z,n)==0 ){\
48d0: 6e 22 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20  n");.  printf(" 
48e0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 43 6f 64       return aCod
48f0: 65 5b 69 5d 3b 5c 6e 22 29 3b 0a 20 20 70 72 69  e[i];\n");.  pri
4900: 6e 74 66 28 22 20 20 20 20 7d 5c 6e 22 29 3b 0a  ntf("    }\n");.
4910: 20 20 70 72 69 6e 74 66 28 22 20 20 7d 5c 6e 22    printf("  }\n"
4920: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 72  );.  printf("  r
4930: 65 74 75 72 6e 20 54 4b 5f 49 44 3b 5c 6e 22 29  eturn TK_ID;\n")
4940: 3b 0a 20 20 70 72 69 6e 74 66 28 22 7d 5c 6e 22  ;.  printf("}\n"
4950: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 69 6e 74  );.  printf("int
4960: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
4970: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
4980: 7a 2c 20 69 6e 74 20 6e 29 7b 5c 6e 22 29 3b 0a  z, int n){\n");.
4990: 20 20 70 72 69 6e 74 66 28 22 20 20 72 65 74 75    printf("  retu
49a0: 72 6e 20 6b 65 79 77 6f 72 64 43 6f 64 65 28 7a  rn keywordCode(z
49b0: 2c 20 6e 29 3b 5c 6e 22 29 3b 0a 20 20 70 72 69  , n);\n");.  pri
49c0: 6e 74 66 28 22 7d 5c 6e 22 29 3b 0a 0a 20 20 72  ntf("}\n");..  r
49d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.