/ Hex Artifact Content
Login

Artifact ed1f2a21a4e7f2757281c4cf7a8392c0e0ad2d5d:


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 6c 6c 20 74 68 65 20 6b 65 79 77 6f 72  * All the keywor
0100: 64 73 20 6f 66 20 74 68 65 20 53 51 4c 20 6c 61  ds of the SQL la
0110: 6e 67 75 61 67 65 20 61 72 65 20 73 74 6f 72 65  nguage are store
0120: 64 20 61 73 20 69 6e 20 61 20 68 61 73 68 0a 2a  d as in a hash.*
0130: 2a 20 74 61 62 6c 65 20 63 6f 6d 70 6f 73 65 64  * table composed
0140: 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66   of instances of
0150: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0160: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
0170: 65 64 65 66 20 73 74 72 75 63 74 20 4b 65 79 77  edef struct Keyw
0180: 6f 72 64 20 4b 65 79 77 6f 72 64 3b 0a 73 74 72  ord Keyword;.str
0190: 75 63 74 20 4b 65 79 77 6f 72 64 20 7b 0a 20 20  uct Keyword {.  
01a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
01b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 77       /* The keyw
01c0: 6f 72 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  ord name */.  ch
01d0: 61 72 20 2a 7a 54 6f 6b 65 6e 54 79 70 65 3b 20  ar *zTokenType; 
01e0: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 76 61 6c 75     /* Token valu
01f0: 65 20 66 6f 72 20 74 68 69 73 20 6b 65 79 77 6f  e for this keywo
0200: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 3b 20  rd */.  int id; 
0210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0220: 55 6e 69 71 75 65 20 49 44 20 66 6f 72 20 74 68  Unique ID for th
0230: 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  is record */.  i
0240: 6e 74 20 68 61 73 68 3b 20 20 20 20 20 20 20 20  nt hash;        
0250: 20 20 20 20 2f 2a 20 48 61 73 68 20 6f 6e 20 74      /* Hash on t
0260: 68 65 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  he keyword */.  
0270: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
0280: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
0290: 6f 20 73 74 61 72 74 20 6f 66 20 6e 61 6d 65 20  o start of name 
02a0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  string */.  int 
02b0: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
02c0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
02d0: 69 73 20 6b 65 79 77 6f 72 64 2c 20 6e 6f 74 20  is keyword, not 
02e0: 63 6f 75 6e 74 69 6e 67 20 66 69 6e 61 6c 20 5c  counting final \
02f0: 30 30 30 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65  000 */.  int pre
0300: 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  fix;          /*
0310: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
0320: 63 74 65 72 73 20 69 6e 20 70 72 65 66 69 78 20  cters in prefix 
0330: 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 3b 20  */.  int iNext; 
0340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0350: 65 78 20 69 6e 20 61 4b 65 79 77 6f 72 64 54 61  ex in aKeywordTa
0360: 62 6c 65 5b 5d 20 6f 66 20 6e 65 78 74 20 77 69  ble[] of next wi
0370: 74 68 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  th same hash */.
0380: 20 20 69 6e 74 20 73 75 62 73 74 72 49 64 3b 20    int substrId; 
0390: 20 20 20 20 20 20 20 2f 2a 20 49 64 20 74 6f 20         /* Id to 
03a0: 61 6e 6f 74 68 65 72 20 6b 65 79 77 6f 72 64 20  another keyword 
03b0: 74 68 69 73 20 6b 65 79 77 6f 72 64 20 69 73 20  this keyword is 
03c0: 65 6d 62 65 64 64 65 64 20 69 6e 20 2a 2f 0a 20  embedded in */. 
03d0: 20 69 6e 74 20 73 75 62 73 74 72 4f 66 66 73 65   int substrOffse
03e0: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
03f0: 69 6e 74 6f 20 73 75 62 73 74 72 49 64 20 66 6f  into substrId fo
0400: 72 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  r start of this 
0410: 6b 65 79 77 6f 72 64 20 2a 2f 0a 7d 3b 0a 0a 2f  keyword */.};../
0420: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
0430: 68 65 20 6b 65 79 77 6f 72 64 73 0a 2a 2f 0a 73  he keywords.*/.s
0440: 74 61 74 69 63 20 4b 65 79 77 6f 72 64 20 61 4b  tatic Keyword aK
0450: 65 79 77 6f 72 64 54 61 62 6c 65 5b 5d 20 3d 20  eywordTable[] = 
0460: 7b 0a 20 20 7b 20 22 41 42 4f 52 54 22 2c 20 20  {.  { "ABORT",  
0470: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 41 42            "TK_AB
0480: 4f 52 54 22 2c 20 20 20 20 20 20 20 20 7d 2c 0a  ORT",        },.
0490: 20 20 7b 20 22 41 46 54 45 52 22 2c 20 20 20 20    { "AFTER",    
04a0: 20 20 20 20 20 20 20 20 22 54 4b 5f 41 46 54 45          "TK_AFTE
04b0: 52 22 2c 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  R",        },.  
04c0: 7b 20 22 41 4c 4c 22 2c 20 20 20 20 20 20 20 20  { "ALL",        
04d0: 20 20 20 20 20 20 22 54 4b 5f 41 4c 4c 22 2c 20        "TK_ALL", 
04e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
04f0: 22 41 4e 44 22 2c 20 20 20 20 20 20 20 20 20 20  "AND",          
0500: 20 20 20 20 22 54 4b 5f 41 4e 44 22 2c 20 20 20      "TK_AND",   
0510: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 41         },.  { "A
0520: 53 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  S",             
0530: 20 20 22 54 4b 5f 41 53 22 2c 20 20 20 20 20 20    "TK_AS",      
0540: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 41 53 43       },.  { "ASC
0550: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
0560: 22 54 4b 5f 41 53 43 22 2c 20 20 20 20 20 20 20  "TK_ASC",       
0570: 20 20 20 7d 2c 0a 20 20 7b 20 22 41 54 54 41 43     },.  { "ATTAC
0580: 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 54  H",           "T
0590: 4b 5f 41 54 54 41 43 48 22 2c 20 20 20 20 20 20  K_ATTACH",      
05a0: 20 7d 2c 0a 20 20 7b 20 22 42 45 46 4f 52 45 22   },.  { "BEFORE"
05b0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f  ,           "TK_
05c0: 42 45 46 4f 52 45 22 2c 20 20 20 20 20 20 20 7d  BEFORE",       }
05d0: 2c 0a 20 20 7b 20 22 42 45 47 49 4e 22 2c 20 20  ,.  { "BEGIN",  
05e0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 42 45            "TK_BE
05f0: 47 49 4e 22 2c 20 20 20 20 20 20 20 20 7d 2c 0a  GIN",        },.
0600: 20 20 7b 20 22 42 45 54 57 45 45 4e 22 2c 20 20    { "BETWEEN",  
0610: 20 20 20 20 20 20 20 20 22 54 4b 5f 42 45 54 57          "TK_BETW
0620: 45 45 4e 22 2c 20 20 20 20 20 20 7d 2c 0a 20 20  EEN",      },.  
0630: 7b 20 22 42 59 22 2c 20 20 20 20 20 20 20 20 20  { "BY",         
0640: 20 20 20 20 20 20 22 54 4b 5f 42 59 22 2c 20 20        "TK_BY",  
0650: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0660: 22 43 41 53 43 41 44 45 22 2c 20 20 20 20 20 20  "CASCADE",      
0670: 20 20 20 20 22 54 4b 5f 43 41 53 43 41 44 45 22      "TK_CASCADE"
0680: 2c 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43  ,      },.  { "C
0690: 41 53 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  ASE",           
06a0: 20 20 22 54 4b 5f 43 41 53 45 22 2c 20 20 20 20    "TK_CASE",    
06b0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 43 48 45       },.  { "CHE
06c0: 43 4b 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  CK",            
06d0: 22 54 4b 5f 43 48 45 43 4b 22 2c 20 20 20 20 20  "TK_CHECK",     
06e0: 20 20 20 7d 2c 0a 20 20 7b 20 22 43 4f 4c 4c 41     },.  { "COLLA
06f0: 54 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 54  TE",          "T
0700: 4b 5f 43 4f 4c 4c 41 54 45 22 2c 20 20 20 20 20  K_COLLATE",     
0710: 20 7d 2c 0a 20 20 7b 20 22 43 4f 4d 4d 49 54 22   },.  { "COMMIT"
0720: 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f  ,           "TK_
0730: 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20 20 20 7d  COMMIT",       }
0740: 2c 0a 20 20 7b 20 22 43 4f 4e 46 4c 49 43 54 22  ,.  { "CONFLICT"
0750: 2c 20 20 20 20 20 20 20 20 20 22 54 4b 5f 43 4f  ,         "TK_CO
0760: 4e 46 4c 49 43 54 22 2c 20 20 20 20 20 7d 2c 0a  NFLICT",     },.
0770: 20 20 7b 20 22 43 4f 4e 53 54 52 41 49 4e 54 22    { "CONSTRAINT"
0780: 2c 20 20 20 20 20 20 20 22 54 4b 5f 43 4f 4e 53  ,       "TK_CONS
0790: 54 52 41 49 4e 54 22 2c 20 20 20 7d 2c 0a 20 20  TRAINT",   },.  
07a0: 7b 20 22 43 52 45 41 54 45 22 2c 20 20 20 20 20  { "CREATE",     
07b0: 20 20 20 20 20 20 22 54 4b 5f 43 52 45 41 54 45        "TK_CREATE
07c0: 22 2c 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20  ",       },.  { 
07d0: 22 43 52 4f 53 53 22 2c 20 20 20 20 20 20 20 20  "CROSS",        
07e0: 20 20 20 20 22 54 4b 5f 4a 4f 49 4e 5f 4b 57 22      "TK_JOIN_KW"
07f0: 2c 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 44  ,      },.  { "D
0800: 41 54 41 42 41 53 45 22 2c 20 20 20 20 20 20 20  ATABASE",       
0810: 20 20 22 54 4b 5f 44 41 54 41 42 41 53 45 22 2c    "TK_DATABASE",
0820: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 44 45 46       },.  { "DEF
0830: 41 55 4c 54 22 2c 20 20 20 20 20 20 20 20 20 20  AULT",          
0840: 22 54 4b 5f 44 45 46 41 55 4c 54 22 2c 20 20 20  "TK_DEFAULT",   
0850: 20 20 20 7d 2c 0a 20 20 7b 20 22 44 45 46 45 52     },.  { "DEFER
0860: 52 45 44 22 2c 20 20 20 20 20 20 20 20 20 22 54  RED",         "T
0870: 4b 5f 44 45 46 45 52 52 45 44 22 2c 20 20 20 20  K_DEFERRED",    
0880: 20 7d 2c 0a 20 20 7b 20 22 44 45 46 45 52 52 41   },.  { "DEFERRA
0890: 42 4c 45 22 2c 20 20 20 20 20 20 20 22 54 4b 5f  BLE",       "TK_
08a0: 44 45 46 45 52 52 41 42 4c 45 22 2c 20 20 20 7d  DEFERRABLE",   }
08b0: 2c 0a 20 20 7b 20 22 44 45 4c 45 54 45 22 2c 20  ,.  { "DELETE", 
08c0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 44 45            "TK_DE
08d0: 4c 45 54 45 22 2c 20 20 20 20 20 20 20 7d 2c 0a  LETE",       },.
08e0: 20 20 7b 20 22 44 45 53 43 22 2c 20 20 20 20 20    { "DESC",     
08f0: 20 20 20 20 20 20 20 20 22 54 4b 5f 44 45 53 43          "TK_DESC
0900: 22 2c 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ",         },.  
0910: 7b 20 22 44 45 54 41 43 48 22 2c 20 20 20 20 20  { "DETACH",     
0920: 20 20 20 20 20 20 22 54 4b 5f 44 45 54 41 43 48        "TK_DETACH
0930: 22 2c 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20  ",       },.  { 
0940: 22 44 49 53 54 49 4e 43 54 22 2c 20 20 20 20 20  "DISTINCT",     
0950: 20 20 20 20 22 54 4b 5f 44 49 53 54 49 4e 43 54      "TK_DISTINCT
0960: 22 2c 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 44  ",     },.  { "D
0970: 52 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20 20  ROP",           
0980: 20 20 22 54 4b 5f 44 52 4f 50 22 2c 20 20 20 20    "TK_DROP",    
0990: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 45 4e 44       },.  { "END
09a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
09b0: 22 54 4b 5f 45 4e 44 22 2c 20 20 20 20 20 20 20  "TK_END",       
09c0: 20 20 20 7d 2c 0a 20 20 7b 20 22 45 41 43 48 22     },.  { "EACH"
09d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54  ,             "T
09e0: 4b 5f 45 41 43 48 22 2c 20 20 20 20 20 20 20 20  K_EACH",        
09f0: 20 7d 2c 0a 20 20 7b 20 22 45 4c 53 45 22 2c 20   },.  { "ELSE", 
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
0a10: 45 4c 53 45 22 2c 20 20 20 20 20 20 20 20 20 7d  ELSE",         }
0a20: 2c 0a 20 20 7b 20 22 45 58 43 45 50 54 22 2c 20  ,.  { "EXCEPT", 
0a30: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 45 58            "TK_EX
0a40: 43 45 50 54 22 2c 20 20 20 20 20 20 20 7d 2c 0a  CEPT",       },.
0a50: 20 20 7b 20 22 45 58 43 4c 55 53 49 56 45 22 2c    { "EXCLUSIVE",
0a60: 20 20 20 20 20 20 20 20 22 54 4b 5f 45 58 43 4c          "TK_EXCL
0a70: 55 53 49 56 45 22 2c 20 20 20 20 7d 2c 0a 20 20  USIVE",    },.  
0a80: 7b 20 22 45 58 50 4c 41 49 4e 22 2c 20 20 20 20  { "EXPLAIN",    
0a90: 20 20 20 20 20 20 22 54 4b 5f 45 58 50 4c 41 49        "TK_EXPLAI
0aa0: 4e 22 2c 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20  N",      },.  { 
0ab0: 22 46 41 49 4c 22 2c 20 20 20 20 20 20 20 20 20  "FAIL",         
0ac0: 20 20 20 20 22 54 4b 5f 46 41 49 4c 22 2c 20 20      "TK_FAIL",  
0ad0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 46         },.  { "F
0ae0: 4f 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OR",            
0af0: 20 20 22 54 4b 5f 46 4f 52 22 2c 20 20 20 20 20    "TK_FOR",     
0b00: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 46 4f 52       },.  { "FOR
0b10: 45 49 47 4e 22 2c 20 20 20 20 20 20 20 20 20 20  EIGN",          
0b20: 22 54 4b 5f 46 4f 52 45 49 47 4e 22 2c 20 20 20  "TK_FOREIGN",   
0b30: 20 20 20 7d 2c 0a 20 20 7b 20 22 46 52 4f 4d 22     },.  { "FROM"
0b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54  ,             "T
0b50: 4b 5f 46 52 4f 4d 22 2c 20 20 20 20 20 20 20 20  K_FROM",        
0b60: 20 7d 2c 0a 20 20 7b 20 22 46 55 4c 4c 22 2c 20   },.  { "FULL", 
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
0b80: 4a 4f 49 4e 5f 4b 57 22 2c 20 20 20 20 20 20 7d  JOIN_KW",      }
0b90: 2c 0a 20 20 7b 20 22 47 4c 4f 42 22 2c 20 20 20  ,.  { "GLOB",   
0ba0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 47 4c            "TK_GL
0bb0: 4f 42 22 2c 20 20 20 20 20 20 20 20 20 7d 2c 0a  OB",         },.
0bc0: 20 20 7b 20 22 47 52 4f 55 50 22 2c 20 20 20 20    { "GROUP",    
0bd0: 20 20 20 20 20 20 20 20 22 54 4b 5f 47 52 4f 55          "TK_GROU
0be0: 50 22 2c 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  P",        },.  
0bf0: 7b 20 22 48 41 56 49 4e 47 22 2c 20 20 20 20 20  { "HAVING",     
0c00: 20 20 20 20 20 20 22 54 4b 5f 48 41 56 49 4e 47        "TK_HAVING
0c10: 22 2c 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20  ",       },.  { 
0c20: 22 49 47 4e 4f 52 45 22 2c 20 20 20 20 20 20 20  "IGNORE",       
0c30: 20 20 20 20 22 54 4b 5f 49 47 4e 4f 52 45 22 2c      "TK_IGNORE",
0c40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 49         },.  { "I
0c50: 4d 4d 45 44 49 41 54 45 22 2c 20 20 20 20 20 20  MMEDIATE",      
0c60: 20 20 22 54 4b 5f 49 4d 4d 45 44 49 41 54 45 22    "TK_IMMEDIATE"
0c70: 2c 20 20 20 20 7d 2c 0a 20 20 7b 20 22 49 4e 22  ,    },.  { "IN"
0c80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0c90: 22 54 4b 5f 49 4e 22 2c 20 20 20 20 20 20 20 20  "TK_IN",        
0ca0: 20 20 20 7d 2c 0a 20 20 7b 20 22 49 4e 44 45 58     },.  { "INDEX
0cb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 54  ",            "T
0cc0: 4b 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  K_INDEX",       
0cd0: 20 7d 2c 0a 20 20 7b 20 22 49 4e 49 54 49 41 4c   },.  { "INITIAL
0ce0: 4c 59 22 2c 20 20 20 20 20 20 20 20 22 54 4b 5f  LY",        "TK_
0cf0: 49 4e 49 54 49 41 4c 4c 59 22 2c 20 20 20 20 7d  INITIALLY",    }
0d00: 2c 0a 20 20 7b 20 22 49 4e 4e 45 52 22 2c 20 20  ,.  { "INNER",  
0d10: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4a 4f            "TK_JO
0d20: 49 4e 5f 4b 57 22 2c 20 20 20 20 20 20 7d 2c 0a  IN_KW",      },.
0d30: 20 20 7b 20 22 49 4e 53 45 52 54 22 2c 20 20 20    { "INSERT",   
0d40: 20 20 20 20 20 20 20 20 22 54 4b 5f 49 4e 53 45          "TK_INSE
0d50: 52 54 22 2c 20 20 20 20 20 20 20 7d 2c 0a 20 20  RT",       },.  
0d60: 7b 20 22 49 4e 53 54 45 41 44 22 2c 20 20 20 20  { "INSTEAD",    
0d70: 20 20 20 20 20 20 22 54 4b 5f 49 4e 53 54 45 41        "TK_INSTEA
0d80: 44 22 2c 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20  D",      },.  { 
0d90: 22 49 4e 54 45 52 53 45 43 54 22 2c 20 20 20 20  "INTERSECT",    
0da0: 20 20 20 20 22 54 4b 5f 49 4e 54 45 52 53 45 43      "TK_INTERSEC
0db0: 54 22 2c 20 20 20 20 7d 2c 0a 20 20 7b 20 22 49  T",    },.  { "I
0dc0: 4e 54 4f 22 2c 20 20 20 20 20 20 20 20 20 20 20  NTO",           
0dd0: 20 20 22 54 4b 5f 49 4e 54 4f 22 2c 20 20 20 20    "TK_INTO",    
0de0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 49 53 22       },.  { "IS"
0df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0e00: 22 54 4b 5f 49 53 22 2c 20 20 20 20 20 20 20 20  "TK_IS",        
0e10: 20 20 20 7d 2c 0a 20 20 7b 20 22 49 53 4e 55 4c     },.  { "ISNUL
0e20: 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 54  L",           "T
0e30: 4b 5f 49 53 4e 55 4c 4c 22 2c 20 20 20 20 20 20  K_ISNULL",      
0e40: 20 7d 2c 0a 20 20 7b 20 22 4a 4f 49 4e 22 2c 20   },.  { "JOIN", 
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
0e60: 4a 4f 49 4e 22 2c 20 20 20 20 20 20 20 20 20 7d  JOIN",         }
0e70: 2c 0a 20 20 7b 20 22 4b 45 59 22 2c 20 20 20 20  ,.  { "KEY",    
0e80: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4b 45            "TK_KE
0e90: 59 22 2c 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  Y",          },.
0ea0: 20 20 7b 20 22 4c 45 46 54 22 2c 20 20 20 20 20    { "LEFT",     
0eb0: 20 20 20 20 20 20 20 20 22 54 4b 5f 4a 4f 49 4e          "TK_JOIN
0ec0: 5f 4b 57 22 2c 20 20 20 20 20 20 7d 2c 0a 20 20  _KW",      },.  
0ed0: 7b 20 22 4c 49 4b 45 22 2c 20 20 20 20 20 20 20  { "LIKE",       
0ee0: 20 20 20 20 20 20 22 54 4b 5f 4c 49 4b 45 22 2c        "TK_LIKE",
0ef0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0f00: 22 4c 49 4d 49 54 22 2c 20 20 20 20 20 20 20 20  "LIMIT",        
0f10: 20 20 20 20 22 54 4b 5f 4c 49 4d 49 54 22 2c 20      "TK_LIMIT", 
0f20: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4d         },.  { "M
0f30: 41 54 43 48 22 2c 20 20 20 20 20 20 20 20 20 20  ATCH",          
0f40: 20 20 22 54 4b 5f 4d 41 54 43 48 22 2c 20 20 20    "TK_MATCH",   
0f50: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4e 41 54       },.  { "NAT
0f60: 55 52 41 4c 22 2c 20 20 20 20 20 20 20 20 20 20  URAL",          
0f70: 22 54 4b 5f 4a 4f 49 4e 5f 4b 57 22 2c 20 20 20  "TK_JOIN_KW",   
0f80: 20 20 20 7d 2c 0a 20 20 7b 20 22 4e 4f 54 22 2c     },.  { "NOT",
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54                "T
0fa0: 4b 5f 4e 4f 54 22 2c 20 20 20 20 20 20 20 20 20  K_NOT",         
0fb0: 20 7d 2c 0a 20 20 7b 20 22 4e 4f 54 4e 55 4c 4c   },.  { "NOTNULL
0fc0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f  ",          "TK_
0fd0: 4e 4f 54 4e 55 4c 4c 22 2c 20 20 20 20 20 20 7d  NOTNULL",      }
0fe0: 2c 0a 20 20 7b 20 22 4e 55 4c 4c 22 2c 20 20 20  ,.  { "NULL",   
0ff0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 4e 55            "TK_NU
1000: 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 7d 2c 0a  LL",         },.
1010: 20 20 7b 20 22 4f 46 22 2c 20 20 20 20 20 20 20    { "OF",       
1020: 20 20 20 20 20 20 20 20 22 54 4b 5f 4f 46 22 2c          "TK_OF",
1030: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1040: 7b 20 22 4f 46 46 53 45 54 22 2c 20 20 20 20 20  { "OFFSET",     
1050: 20 20 20 20 20 20 22 54 4b 5f 4f 46 46 53 45 54        "TK_OFFSET
1060: 22 2c 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20  ",       },.  { 
1070: 22 4f 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  "ON",           
1080: 20 20 20 20 22 54 4b 5f 4f 4e 22 2c 20 20 20 20      "TK_ON",    
1090: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4f         },.  { "O
10a0: 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  R",             
10b0: 20 20 22 54 4b 5f 4f 52 22 2c 20 20 20 20 20 20    "TK_OR",      
10c0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 4f 52 44       },.  { "ORD
10d0: 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ER",            
10e0: 22 54 4b 5f 4f 52 44 45 52 22 2c 20 20 20 20 20  "TK_ORDER",     
10f0: 20 20 20 7d 2c 0a 20 20 7b 20 22 4f 55 54 45 52     },.  { "OUTER
1100: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 54  ",            "T
1110: 4b 5f 4a 4f 49 4e 5f 4b 57 22 2c 20 20 20 20 20  K_JOIN_KW",     
1120: 20 7d 2c 0a 20 20 7b 20 22 50 52 41 47 4d 41 22   },.  { "PRAGMA"
1130: 2c 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f  ,           "TK_
1140: 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 7d  PRAGMA",       }
1150: 2c 0a 20 20 7b 20 22 50 52 49 4d 41 52 59 22 2c  ,.  { "PRIMARY",
1160: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 50 52            "TK_PR
1170: 49 4d 41 52 59 22 2c 20 20 20 20 20 20 7d 2c 0a  IMARY",      },.
1180: 20 20 7b 20 22 52 41 49 53 45 22 2c 20 20 20 20    { "RAISE",    
1190: 20 20 20 20 20 20 20 20 22 54 4b 5f 52 41 49 53          "TK_RAIS
11a0: 45 22 2c 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  E",        },.  
11b0: 7b 20 22 52 45 46 45 52 45 4e 43 45 53 22 2c 20  { "REFERENCES", 
11c0: 20 20 20 20 20 20 22 54 4b 5f 52 45 46 45 52 45        "TK_REFERE
11d0: 4e 43 45 53 22 2c 20 20 20 7d 2c 0a 20 20 7b 20  NCES",   },.  { 
11e0: 22 52 45 50 4c 41 43 45 22 2c 20 20 20 20 20 20  "REPLACE",      
11f0: 20 20 20 20 22 54 4b 5f 52 45 50 4c 41 43 45 22      "TK_REPLACE"
1200: 2c 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 52  ,      },.  { "R
1210: 45 53 54 52 49 43 54 22 2c 20 20 20 20 20 20 20  ESTRICT",       
1220: 20 20 22 54 4b 5f 52 45 53 54 52 49 43 54 22 2c    "TK_RESTRICT",
1230: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 52 49 47       },.  { "RIG
1240: 48 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  HT",            
1250: 22 54 4b 5f 4a 4f 49 4e 5f 4b 57 22 2c 20 20 20  "TK_JOIN_KW",   
1260: 20 20 20 7d 2c 0a 20 20 7b 20 22 52 4f 4c 4c 42     },.  { "ROLLB
1270: 41 43 4b 22 2c 20 20 20 20 20 20 20 20 20 22 54  ACK",         "T
1280: 4b 5f 52 4f 4c 4c 42 41 43 4b 22 2c 20 20 20 20  K_ROLLBACK",    
1290: 20 7d 2c 0a 20 20 7b 20 22 52 4f 57 22 2c 20 20   },.  { "ROW",  
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
12b0: 52 4f 57 22 2c 20 20 20 20 20 20 20 20 20 20 7d  ROW",          }
12c0: 2c 0a 20 20 7b 20 22 53 45 4c 45 43 54 22 2c 20  ,.  { "SELECT", 
12d0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 53 45            "TK_SE
12e0: 4c 45 43 54 22 2c 20 20 20 20 20 20 20 7d 2c 0a  LECT",       },.
12f0: 20 20 7b 20 22 53 45 54 22 2c 20 20 20 20 20 20    { "SET",      
1300: 20 20 20 20 20 20 20 20 22 54 4b 5f 53 45 54 22          "TK_SET"
1310: 2c 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ,          },.  
1320: 7b 20 22 53 54 41 54 45 4d 45 4e 54 22 2c 20 20  { "STATEMENT",  
1330: 20 20 20 20 20 20 22 54 4b 5f 53 54 41 54 45 4d        "TK_STATEM
1340: 45 4e 54 22 2c 20 20 20 20 7d 2c 0a 20 20 7b 20  ENT",    },.  { 
1350: 22 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  "TABLE",        
1360: 20 20 20 20 22 54 4b 5f 54 41 42 4c 45 22 2c 20      "TK_TABLE", 
1370: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 54         },.  { "T
1380: 45 4d 50 22 2c 20 20 20 20 20 20 20 20 20 20 20  EMP",           
1390: 20 20 22 54 4b 5f 54 45 4d 50 22 2c 20 20 20 20    "TK_TEMP",    
13a0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 54 45 4d       },.  { "TEM
13b0: 50 4f 52 41 52 59 22 2c 20 20 20 20 20 20 20 20  PORARY",        
13c0: 22 54 4b 5f 54 45 4d 50 22 2c 20 20 20 20 20 20  "TK_TEMP",      
13d0: 20 20 20 7d 2c 0a 20 20 7b 20 22 54 48 45 4e 22     },.  { "THEN"
13e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54  ,             "T
13f0: 4b 5f 54 48 45 4e 22 2c 20 20 20 20 20 20 20 20  K_THEN",        
1400: 20 7d 2c 0a 20 20 7b 20 22 54 52 41 4e 53 41 43   },.  { "TRANSAC
1410: 54 49 4f 4e 22 2c 20 20 20 20 20 20 22 54 4b 5f  TION",      "TK_
1420: 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 7d  TRANSACTION",  }
1430: 2c 0a 20 20 7b 20 22 54 52 49 47 47 45 52 22 2c  ,.  { "TRIGGER",
1440: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 54 52            "TK_TR
1450: 49 47 47 45 52 22 2c 20 20 20 20 20 20 7d 2c 0a  IGGER",      },.
1460: 20 20 7b 20 22 55 4e 49 4f 4e 22 2c 20 20 20 20    { "UNION",    
1470: 20 20 20 20 20 20 20 20 22 54 4b 5f 55 4e 49 4f          "TK_UNIO
1480: 4e 22 2c 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  N",        },.  
1490: 7b 20 22 55 4e 49 51 55 45 22 2c 20 20 20 20 20  { "UNIQUE",     
14a0: 20 20 20 20 20 20 22 54 4b 5f 55 4e 49 51 55 45        "TK_UNIQUE
14b0: 22 2c 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20  ",       },.  { 
14c0: 22 55 50 44 41 54 45 22 2c 20 20 20 20 20 20 20  "UPDATE",       
14d0: 20 20 20 20 22 54 4b 5f 55 50 44 41 54 45 22 2c      "TK_UPDATE",
14e0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 55         },.  { "U
14f0: 53 49 4e 47 22 2c 20 20 20 20 20 20 20 20 20 20  SING",          
1500: 20 20 22 54 4b 5f 55 53 49 4e 47 22 2c 20 20 20    "TK_USING",   
1510: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 56 41 43       },.  { "VAC
1520: 55 55 4d 22 2c 20 20 20 20 20 20 20 20 20 20 20  UUM",           
1530: 22 54 4b 5f 56 41 43 55 55 4d 22 2c 20 20 20 20  "TK_VACUUM",    
1540: 20 20 20 7d 2c 0a 20 20 7b 20 22 56 41 4c 55 45     },.  { "VALUE
1550: 53 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 54  S",           "T
1560: 4b 5f 56 41 4c 55 45 53 22 2c 20 20 20 20 20 20  K_VALUES",      
1570: 20 7d 2c 0a 20 20 7b 20 22 56 49 45 57 22 2c 20   },.  { "VIEW", 
1580: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f              "TK_
1590: 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20 7d  VIEW",         }
15a0: 2c 0a 20 20 7b 20 22 57 48 45 4e 22 2c 20 20 20  ,.  { "WHEN",   
15b0: 20 20 20 20 20 20 20 20 20 20 22 54 4b 5f 57 48            "TK_WH
15c0: 45 4e 22 2c 20 20 20 20 20 20 20 20 20 7d 2c 0a  EN",         },.
15d0: 20 20 7b 20 22 57 48 45 52 45 22 2c 20 20 20 20    { "WHERE",    
15e0: 20 20 20 20 20 20 20 20 22 54 4b 5f 57 48 45 52          "TK_WHER
15f0: 45 22 2c 20 20 20 20 20 20 20 20 7d 2c 0a 7d 3b  E",        },.};
1600: 0a 0a 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b  ../* Number of k
1610: 65 79 77 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69  eywords */.#defi
1620: 6e 65 20 4e 4b 45 59 57 4f 52 44 20 28 73 69 7a  ne NKEYWORD (siz
1630: 65 6f 66 28 61 4b 65 79 77 6f 72 64 54 61 62 6c  eof(aKeywordTabl
1640: 65 29 2f 73 69 7a 65 6f 66 28 61 4b 65 79 77 6f  e)/sizeof(aKeywo
1650: 72 64 54 61 62 6c 65 5b 30 5d 29 29 0a 0a 2f 2a  rdTable[0]))../*
1660: 20 41 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 70   An array to map
1670: 20 61 6c 6c 20 75 70 70 65 72 2d 63 61 73 65 20   all upper-case 
1680: 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20  characters into 
1690: 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
16a0: 69 6e 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61 73  ing.** lower-cas
16b0: 65 20 63 68 61 72 61 63 74 65 72 2e 20 0a 2a 2f  e character. .*/
16c0: 0a 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
16d0: 63 68 61 72 20 73 71 6c 69 74 65 33 55 70 70 65  char sqlite3Uppe
16e0: 72 54 6f 4c 6f 77 65 72 5b 5d 20 3d 20 7b 0a 20  rToLower[] = {. 
16f0: 20 20 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20       0,  1,  2, 
1700: 20 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 2c 20   3,  4,  5,  6, 
1710: 20 37 2c 20 20 38 2c 20 20 39 2c 20 31 30 2c 20   7,  8,  9, 10, 
1720: 31 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c 20  11, 12, 13, 14, 
1730: 31 35 2c 20 31 36 2c 20 31 37 2c 0a 20 20 20 20  15, 16, 17,.    
1740: 20 31 38 2c 20 31 39 2c 20 32 30 2c 20 32 31 2c   18, 19, 20, 21,
1750: 20 32 32 2c 20 32 33 2c 20 32 34 2c 20 32 35 2c   22, 23, 24, 25,
1760: 20 32 36 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c   26, 27, 28, 29,
1770: 20 33 30 2c 20 33 31 2c 20 33 32 2c 20 33 33 2c   30, 31, 32, 33,
1780: 20 33 34 2c 20 33 35 2c 0a 20 20 20 20 20 33 36   34, 35,.     36
1790: 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30  , 37, 38, 39, 40
17a0: 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 34 34  , 41, 42, 43, 44
17b0: 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34 38  , 45, 46, 47, 48
17c0: 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 20 35 32  , 49, 50, 51, 52
17d0: 2c 20 35 33 2c 0a 20 20 20 20 20 35 34 2c 20 35  , 53,.     54, 5
17e0: 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35  5, 56, 57, 58, 5
17f0: 39 2c 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 36  9, 60, 61, 62, 6
1800: 33 2c 20 36 34 2c 20 39 37 2c 20 39 38 2c 20 39  3, 64, 97, 98, 9
1810: 39 2c 31 30 30 2c 31 30 31 2c 31 30 32 2c 31 30  9,100,101,102,10
1820: 33 2c 0a 20 20 20 20 31 30 34 2c 31 30 35 2c 31  3,.    104,105,1
1830: 30 36 2c 31 30 37 2c 31 30 38 2c 31 30 39 2c 31  06,107,108,109,1
1840: 31 30 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c 31  10,111,112,113,1
1850: 31 34 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c 31  14,115,116,117,1
1860: 31 38 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c 0a  18,119,120,121,.
1870: 20 20 20 20 31 32 32 2c 20 39 31 2c 20 39 32 2c      122, 91, 92,
1880: 20 39 33 2c 20 39 34 2c 20 39 35 2c 20 39 36 2c   93, 94, 95, 96,
1890: 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c   97, 98, 99,100,
18a0: 31 30 31 2c 31 30 32 2c 31 30 33 2c 31 30 34 2c  101,102,103,104,
18b0: 31 30 35 2c 31 30 36 2c 31 30 37 2c 0a 20 20 20  105,106,107,.   
18c0: 20 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31   108,109,110,111
18d0: 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35  ,112,113,114,115
18e0: 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39  ,116,117,118,119
18f0: 2c 31 32 30 2c 31 32 31 2c 31 32 32 2c 31 32 33  ,120,121,122,123
1900: 2c 31 32 34 2c 31 32 35 2c 0a 20 20 20 20 31 32  ,124,125,.    12
1910: 36 2c 31 32 37 2c 31 32 38 2c 31 32 39 2c 31 33  6,127,128,129,13
1920: 30 2c 31 33 31 2c 31 33 32 2c 31 33 33 2c 31 33  0,131,132,133,13
1930: 34 2c 31 33 35 2c 31 33 36 2c 31 33 37 2c 31 33  4,135,136,137,13
1940: 38 2c 31 33 39 2c 31 34 30 2c 31 34 31 2c 31 34  8,139,140,141,14
1950: 32 2c 31 34 33 2c 0a 20 20 20 20 31 34 34 2c 31  2,143,.    144,1
1960: 34 35 2c 31 34 36 2c 31 34 37 2c 31 34 38 2c 31  45,146,147,148,1
1970: 34 39 2c 31 35 30 2c 31 35 31 2c 31 35 32 2c 31  49,150,151,152,1
1980: 35 33 2c 31 35 34 2c 31 35 35 2c 31 35 36 2c 31  53,154,155,156,1
1990: 35 37 2c 31 35 38 2c 31 35 39 2c 31 36 30 2c 31  57,158,159,160,1
19a0: 36 31 2c 0a 20 20 20 20 31 36 32 2c 31 36 33 2c  61,.    162,163,
19b0: 31 36 34 2c 31 36 35 2c 31 36 36 2c 31 36 37 2c  164,165,166,167,
19c0: 31 36 38 2c 31 36 39 2c 31 37 30 2c 31 37 31 2c  168,169,170,171,
19d0: 31 37 32 2c 31 37 33 2c 31 37 34 2c 31 37 35 2c  172,173,174,175,
19e0: 31 37 36 2c 31 37 37 2c 31 37 38 2c 31 37 39 2c  176,177,178,179,
19f0: 0a 20 20 20 20 31 38 30 2c 31 38 31 2c 31 38 32  .    180,181,182
1a00: 2c 31 38 33 2c 31 38 34 2c 31 38 35 2c 31 38 36  ,183,184,185,186
1a10: 2c 31 38 37 2c 31 38 38 2c 31 38 39 2c 31 39 30  ,187,188,189,190
1a20: 2c 31 39 31 2c 31 39 32 2c 31 39 33 2c 31 39 34  ,191,192,193,194
1a30: 2c 31 39 35 2c 31 39 36 2c 31 39 37 2c 0a 20 20  ,195,196,197,.  
1a40: 20 20 31 39 38 2c 31 39 39 2c 32 30 30 2c 32 30    198,199,200,20
1a50: 31 2c 32 30 32 2c 32 30 33 2c 32 30 34 2c 32 30  1,202,203,204,20
1a60: 35 2c 32 30 36 2c 32 30 37 2c 32 30 38 2c 32 30  5,206,207,208,20
1a70: 39 2c 32 31 30 2c 32 31 31 2c 32 31 32 2c 32 31  9,210,211,212,21
1a80: 33 2c 32 31 34 2c 32 31 35 2c 0a 20 20 20 20 32  3,214,215,.    2
1a90: 31 36 2c 32 31 37 2c 32 31 38 2c 32 31 39 2c 32  16,217,218,219,2
1aa0: 32 30 2c 32 32 31 2c 32 32 32 2c 32 32 33 2c 32  20,221,222,223,2
1ab0: 32 34 2c 32 32 35 2c 32 32 36 2c 32 32 37 2c 32  24,225,226,227,2
1ac0: 32 38 2c 32 32 39 2c 32 33 30 2c 32 33 31 2c 32  28,229,230,231,2
1ad0: 33 32 2c 32 33 33 2c 0a 20 20 20 20 32 33 34 2c  32,233,.    234,
1ae0: 32 33 35 2c 32 33 36 2c 32 33 37 2c 32 33 38 2c  235,236,237,238,
1af0: 32 33 39 2c 32 34 30 2c 32 34 31 2c 32 34 32 2c  239,240,241,242,
1b00: 32 34 33 2c 32 34 34 2c 32 34 35 2c 32 34 36 2c  243,244,245,246,
1b10: 32 34 37 2c 32 34 38 2c 32 34 39 2c 32 35 30 2c  247,248,249,250,
1b20: 32 35 31 2c 0a 20 20 20 20 32 35 32 2c 32 35 33  251,.    252,253
1b30: 2c 32 35 34 2c 32 35 35 0a 7d 3b 0a 23 64 65 66  ,254,255.};.#def
1b40: 69 6e 65 20 55 70 70 65 72 54 6f 4c 6f 77 65 72  ine UpperToLower
1b50: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
1b60: 6f 77 65 72 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ower../*.** Comp
1b70: 61 72 69 73 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  arision function
1b80: 20 66 6f 72 20 74 77 6f 20 4b 65 79 77 6f 72 64   for two Keyword
1b90: 20 72 65 63 6f 72 64 73 0a 2a 2f 0a 73 74 61 74   records.*/.stat
1ba0: 69 63 20 69 6e 74 20 6b 65 79 77 6f 72 64 43 6f  ic int keywordCo
1bb0: 6d 70 61 72 65 31 28 63 6f 6e 73 74 20 76 6f 69  mpare1(const voi
1bc0: 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *a, const void
1bd0: 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20 4b 65   *b){.  const Ke
1be0: 79 77 6f 72 64 20 2a 70 41 20 3d 20 28 4b 65 79  yword *pA = (Key
1bf0: 77 6f 72 64 2a 29 61 3b 0a 20 20 63 6f 6e 73 74  word*)a;.  const
1c00: 20 4b 65 79 77 6f 72 64 20 2a 70 42 20 3d 20 28   Keyword *pB = (
1c10: 4b 65 79 77 6f 72 64 2a 29 62 3b 0a 20 20 69 6e  Keyword*)b;.  in
1c20: 74 20 6e 20 3d 20 70 41 2d 3e 6c 65 6e 20 2d 20  t n = pA->len - 
1c30: 70 42 2d 3e 6c 65 6e 3b 0a 20 20 69 66 28 20 6e  pB->len;.  if( n
1c40: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73  ==0 ){.    n = s
1c50: 74 72 63 6d 70 28 70 41 2d 3e 7a 4e 61 6d 65 2c  trcmp(pA->zName,
1c60: 20 70 42 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d   pB->zName);.  }
1c70: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 73  .  return n;.}.s
1c80: 74 61 74 69 63 20 69 6e 74 20 6b 65 79 77 6f 72  tatic int keywor
1c90: 64 43 6f 6d 70 61 72 65 32 28 63 6f 6e 73 74 20  dCompare2(const 
1ca0: 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76  void *a, const v
1cb0: 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74  oid *b){.  const
1cc0: 20 4b 65 79 77 6f 72 64 20 2a 70 41 20 3d 20 28   Keyword *pA = (
1cd0: 4b 65 79 77 6f 72 64 2a 29 61 3b 0a 20 20 63 6f  Keyword*)a;.  co
1ce0: 6e 73 74 20 4b 65 79 77 6f 72 64 20 2a 70 42 20  nst Keyword *pB 
1cf0: 3d 20 28 4b 65 79 77 6f 72 64 2a 29 62 3b 0a 20  = (Keyword*)b;. 
1d00: 20 69 6e 74 20 6e 20 3d 20 73 74 72 63 6d 70 28   int n = strcmp(
1d10: 70 41 2d 3e 7a 4e 61 6d 65 2c 20 70 42 2d 3e 7a  pA->zName, pB->z
1d20: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1d30: 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  n;.}.static int 
1d40: 6b 65 79 77 6f 72 64 43 6f 6d 70 61 72 65 33 28  keywordCompare3(
1d50: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63  const void *a, c
1d60: 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20  onst void *b){. 
1d70: 20 63 6f 6e 73 74 20 4b 65 79 77 6f 72 64 20 2a   const Keyword *
1d80: 70 41 20 3d 20 28 4b 65 79 77 6f 72 64 2a 29 61  pA = (Keyword*)a
1d90: 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 77 6f 72  ;.  const Keywor
1da0: 64 20 2a 70 42 20 3d 20 28 4b 65 79 77 6f 72 64  d *pB = (Keyword
1db0: 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  *)b;.  int n = p
1dc0: 41 2d 3e 6f 66 66 73 65 74 20 2d 20 70 42 2d 3e  A->offset - pB->
1dd0: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
1de0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   n;.}../*.** Ret
1df0: 75 72 6e 20 61 20 4b 65 79 77 6f 72 64 54 61 62  urn a KeywordTab
1e00: 6c 65 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  le entry with th
1e10: 65 20 67 69 76 65 6e 20 69 64 0a 2a 2f 0a 73 74  e given id.*/.st
1e20: 61 74 69 63 20 4b 65 79 77 6f 72 64 20 2a 66 69  atic Keyword *fi
1e30: 6e 64 42 79 49 64 28 69 6e 74 20 69 64 29 7b 0a  ndById(int id){.
1e40: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1e50: 3d 30 3b 20 69 3c 4e 4b 45 59 57 4f 52 44 3b 20  =0; i<NKEYWORD; 
1e60: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 4b  i++){.    if( aK
1e70: 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 2e 69  eywordTable[i].i
1e80: 64 3d 3d 69 64 20 29 20 62 72 65 61 6b 3b 0a 20  d==id ) break;. 
1e90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 26 61 4b 65   }.  return &aKe
1ea0: 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 3b 0a 7d  ywordTable[i];.}
1eb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ec0: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f  tine does the wo
1ed0: 72 6b 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74  rk.  The generat
1ee0: 65 64 20 63 6f 64 65 20 69 73 20 70 72 69 6e 74  ed code is print
1ef0: 65 64 20 6f 6e 20 73 74 61 6e 64 61 72 64 0a 2a  ed on standard.*
1f00: 2a 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 69 6e 74  * output..*/.int
1f10: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
1f20: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
1f30: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 68 3b 0a  int i, j, k, h;.
1f40: 20 20 69 6e 74 20 62 65 73 74 53 69 7a 65 2c 20    int bestSize, 
1f50: 62 65 73 74 43 6f 75 6e 74 3b 0a 20 20 69 6e 74  bestCount;.  int
1f60: 20 63 6f 75 6e 74 3b 0a 20 20 69 6e 74 20 6e 43   count;.  int nC
1f70: 68 61 72 3b 0a 20 20 69 6e 74 20 61 48 61 73 68  har;.  int aHash
1f80: 5b 31 30 30 30 5d 3b 20 20 2f 2a 20 31 30 30 30  [1000];  /* 1000
1f90: 20 69 73 20 6d 75 63 68 20 62 69 67 67 65 72 20   is much bigger 
1fa0: 74 68 61 6e 20 4e 4b 45 59 57 4f 52 44 20 2a 2f  than NKEYWORD */
1fb0: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
1fc0: 68 65 20 6c 65 6e 67 74 68 73 20 6f 66 20 73 74  he lengths of st
1fd0: 72 69 6e 67 73 20 61 6e 64 20 68 61 73 68 65 73  rings and hashes
1fe0: 20 66 6f 72 20 61 6c 6c 20 65 6e 74 72 69 65 73   for all entries
1ff0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
2000: 69 3c 4e 4b 45 59 57 4f 52 44 3b 20 69 2b 2b 29  i<NKEYWORD; i++)
2010: 7b 0a 20 20 20 20 4b 65 79 77 6f 72 64 20 2a 70  {.    Keyword *p
2020: 20 3d 20 26 61 4b 65 79 77 6f 72 64 54 61 62 6c   = &aKeywordTabl
2030: 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 6c 65 6e  e[i];.    p->len
2040: 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61   = strlen(p->zNa
2050: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 68  me);.    p->hash
2060: 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b   = UpperToLower[
2070: 70 2d 3e 7a 4e 61 6d 65 5b 30 5d 5d 2a 35 20 2b  p->zName[0]]*5 +
2080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55  .              U
2090: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 70 2d 3e 7a  pperToLower[p->z
20a0: 4e 61 6d 65 5b 70 2d 3e 6c 65 6e 2d 31 5d 5d 2a  Name[p->len-1]]*
20b0: 33 20 2b 20 70 2d 3e 6c 65 6e 3b 0a 20 20 20 20  3 + p->len;.    
20c0: 70 2d 3e 69 64 20 3d 20 69 2b 31 3b 0a 20 20 7d  p->id = i+1;.  }
20d0: 0a 0a 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20  ..  /* Sort the 
20e0: 74 61 62 6c 65 20 66 72 6f 6d 20 73 68 6f 72 74  table from short
20f0: 65 73 74 20 74 6f 20 6c 6f 6e 67 65 73 74 20 6b  est to longest k
2100: 65 79 77 6f 72 64 20 2a 2f 0a 20 20 71 73 6f 72  eyword */.  qsor
2110: 74 28 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 2c  t(aKeywordTable,
2120: 20 4e 4b 45 59 57 4f 52 44 2c 20 73 69 7a 65 6f   NKEYWORD, sizeo
2130: 66 28 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b  f(aKeywordTable[
2140: 30 5d 29 2c 20 6b 65 79 77 6f 72 64 43 6f 6d 70  0]), keywordComp
2150: 61 72 65 31 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  are1);..  /* Loo
2160: 6b 20 66 6f 72 20 73 68 6f 72 74 20 6b 65 79 77  k for short keyw
2170: 6f 72 64 73 20 65 6d 62 65 64 64 65 64 20 69 6e  ords embedded in
2180: 20 6c 6f 6e 67 65 72 20 6b 65 79 77 6f 72 64 73   longer keywords
2190: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 4e 4b 45 59   */.  for(i=NKEY
21a0: 57 4f 52 44 2d 32 3b 20 69 3e 3d 30 3b 20 69 2d  WORD-2; i>=0; i-
21b0: 2d 29 7b 0a 20 20 20 20 4b 65 79 77 6f 72 64 20  -){.    Keyword 
21c0: 2a 70 20 3d 20 26 61 4b 65 79 77 6f 72 64 54 61  *p = &aKeywordTa
21d0: 62 6c 65 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  ble[i];.    for(
21e0: 6a 3d 4e 4b 45 59 57 4f 52 44 2d 31 3b 20 6a 3e  j=NKEYWORD-1; j>
21f0: 69 20 26 26 20 70 2d 3e 73 75 62 73 74 72 49 64  i && p->substrId
2200: 3d 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  ==0; j--){.     
2210: 20 4b 65 79 77 6f 72 64 20 2a 70 4f 74 68 65 72   Keyword *pOther
2220: 20 3d 20 26 61 4b 65 79 77 6f 72 64 54 61 62 6c   = &aKeywordTabl
2230: 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  e[j];.      if( 
2240: 70 4f 74 68 65 72 2d 3e 73 75 62 73 74 72 49 64  pOther->substrId
2250: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2260: 20 20 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6c     if( pOther->l
2270: 65 6e 3c 3d 70 2d 3e 6c 65 6e 20 29 20 63 6f 6e  en<=p->len ) con
2280: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
2290: 28 6b 3d 30 3b 20 6b 3c 3d 70 4f 74 68 65 72 2d  (k=0; k<=pOther-
22a0: 3e 6c 65 6e 2d 70 2d 3e 6c 65 6e 3b 20 6b 2b 2b  >len-p->len; k++
22b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ){.        if( m
22c0: 65 6d 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20  emcmp(p->zName, 
22d0: 26 70 4f 74 68 65 72 2d 3e 7a 4e 61 6d 65 5b 6b  &pOther->zName[k
22e0: 5d 2c 20 70 2d 3e 6c 65 6e 29 3d 3d 30 20 29 7b  ], p->len)==0 ){
22f0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 75  .          p->su
2300: 62 73 74 72 49 64 20 3d 20 70 4f 74 68 65 72 2d  bstrId = pOther-
2310: 3e 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  >id;.          p
2320: 2d 3e 73 75 62 73 74 72 4f 66 66 73 65 74 20 3d  ->substrOffset =
2330: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   k;.          br
2340: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2350: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2360: 0a 0a 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20  ..  /* Sort the 
2370: 74 61 62 6c 65 20 69 6e 74 6f 20 61 6c 70 68 61  table into alpha
2380: 62 65 74 69 63 61 6c 20 6f 72 64 65 72 20 2a 2f  betical order */
2390: 0a 20 20 71 73 6f 72 74 28 61 4b 65 79 77 6f 72  .  qsort(aKeywor
23a0: 64 54 61 62 6c 65 2c 20 4e 4b 45 59 57 4f 52 44  dTable, NKEYWORD
23b0: 2c 20 73 69 7a 65 6f 66 28 61 4b 65 79 77 6f 72  , sizeof(aKeywor
23c0: 64 54 61 62 6c 65 5b 30 5d 29 2c 20 6b 65 79 77  dTable[0]), keyw
23d0: 6f 72 64 43 6f 6d 70 61 72 65 32 29 3b 0a 0a 20  ordCompare2);.. 
23e0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
23f0: 6f 66 66 73 65 74 20 66 6f 72 20 61 6c 6c 20 65  offset for all e
2400: 6e 74 72 69 65 73 20 2a 2f 0a 20 20 6e 43 68 61  ntries */.  nCha
2410: 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  r = 0;.  for(i=0
2420: 3b 20 69 3c 4e 4b 45 59 57 4f 52 44 3b 20 69 2b  ; i<NKEYWORD; i+
2430: 2b 29 7b 0a 20 20 20 20 4b 65 79 77 6f 72 64 20  +){.    Keyword 
2440: 2a 70 20 3d 20 26 61 4b 65 79 77 6f 72 64 54 61  *p = &aKeywordTa
2450: 62 6c 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ble[i];.    if( 
2460: 70 2d 3e 6f 66 66 73 65 74 3e 30 20 7c 7c 20 70  p->offset>0 || p
2470: 2d 3e 73 75 62 73 74 72 49 64 20 29 20 63 6f 6e  ->substrId ) con
2480: 74 69 6e 75 65 3b 0a 20 20 20 20 70 2d 3e 6f 66  tinue;.    p->of
2490: 66 73 65 74 20 3d 20 6e 43 68 61 72 3b 0a 20 20  fset = nChar;.  
24a0: 20 20 6e 43 68 61 72 20 2b 3d 20 70 2d 3e 6c 65    nChar += p->le
24b0: 6e 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e  n;.    for(k=p->
24c0: 6c 65 6e 2d 31 3b 20 6b 3e 3d 31 3b 20 6b 2d 2d  len-1; k>=1; k--
24d0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69  ){.      for(j=i
24e0: 2b 31 3b 20 6a 3c 4e 4b 45 59 57 4f 52 44 3b 20  +1; j<NKEYWORD; 
24f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 4b 65  j++){.        Ke
2500: 79 77 6f 72 64 20 2a 70 4f 74 68 65 72 20 3d 20  yword *pOther = 
2510: 26 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 6a  &aKeywordTable[j
2520: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
2530: 4f 74 68 65 72 2d 3e 6f 66 66 73 65 74 3e 30 20  Other->offset>0 
2540: 7c 7c 20 70 4f 74 68 65 72 2d 3e 73 75 62 73 74  || pOther->subst
2550: 72 49 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rId ) continue;.
2560: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 74 68          if( pOth
2570: 65 72 2d 3e 6c 65 6e 3c 3d 6b 20 29 20 63 6f 6e  er->len<=k ) con
2580: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
2590: 66 28 20 6d 65 6d 63 6d 70 28 26 70 2d 3e 7a 4e  f( memcmp(&p->zN
25a0: 61 6d 65 5b 70 2d 3e 6c 65 6e 2d 6b 5d 2c 20 70  ame[p->len-k], p
25b0: 4f 74 68 65 72 2d 3e 7a 4e 61 6d 65 2c 20 6b 29  Other->zName, k)
25c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25d0: 20 70 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20   p = pOther;.   
25e0: 20 20 20 20 20 20 20 70 2d 3e 6f 66 66 73 65 74         p->offset
25f0: 20 3d 20 6e 43 68 61 72 20 2d 20 6b 3b 0a 20 20   = nChar - k;.  
2600: 20 20 20 20 20 20 20 20 6e 43 68 61 72 20 3d 20          nChar = 
2610: 70 2d 3e 6f 66 66 73 65 74 20 2b 20 70 2d 3e 6c  p->offset + p->l
2620: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  en;.          p-
2630: 3e 7a 4e 61 6d 65 20 2b 3d 20 6b 3b 0a 20 20 20  >zName += k;.   
2640: 20 20 20 20 20 20 20 70 2d 3e 6c 65 6e 20 2d 3d         p->len -=
2650: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   k;.          p-
2660: 3e 70 72 65 66 69 78 20 3d 20 6b 3b 0a 20 20 20  >prefix = k;.   
2670: 20 20 20 20 20 20 20 6a 20 3d 20 69 3b 0a 20 20         j = i;.  
2680: 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 6c          k = p->l
2690: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
26a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 4b 45    for(i=0; i<NKE
26c0: 59 57 4f 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20  YWORD; i++){.   
26d0: 20 4b 65 79 77 6f 72 64 20 2a 70 20 3d 20 26 61   Keyword *p = &a
26e0: 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 3b  KeywordTable[i];
26f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 75 62 73  .    if( p->subs
2700: 74 72 49 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  trId ){.      p-
2710: 3e 6f 66 66 73 65 74 20 3d 20 66 69 6e 64 42 79  >offset = findBy
2720: 49 64 28 70 2d 3e 73 75 62 73 74 72 49 64 29 2d  Id(p->substrId)-
2730: 3e 6f 66 66 73 65 74 20 2b 20 70 2d 3e 73 75 62  >offset + p->sub
2740: 73 74 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d  strOffset;.    }
2750: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 6f 72 74 20  .  }..  /* Sort 
2760: 74 68 65 20 74 61 62 6c 65 20 62 79 20 6f 66 66  the table by off
2770: 73 65 74 20 2a 2f 0a 20 20 71 73 6f 72 74 28 61  set */.  qsort(a
2780: 4b 65 79 77 6f 72 64 54 61 62 6c 65 2c 20 4e 4b  KeywordTable, NK
2790: 45 59 57 4f 52 44 2c 20 73 69 7a 65 6f 66 28 61  EYWORD, sizeof(a
27a0: 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 30 5d 29  KeywordTable[0])
27b0: 2c 20 6b 65 79 77 6f 72 64 43 6f 6d 70 61 72 65  , keywordCompare
27c0: 33 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  3);..  /* Figure
27d0: 20 6f 75 74 20 68 6f 77 20 62 69 67 20 74 6f 20   out how big to 
27e0: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
27f0: 62 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ble in order to 
2800: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 0a 20 20 2a  minimize the.  *
2810: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 6c  * number of coll
2820: 69 73 69 6f 6e 73 20 2a 2f 0a 20 20 62 65 73 74  isions */.  best
2830: 53 69 7a 65 20 3d 20 4e 4b 45 59 57 4f 52 44 3b  Size = NKEYWORD;
2840: 0a 20 20 62 65 73 74 43 6f 75 6e 74 20 3d 20 4e  .  bestCount = N
2850: 4b 45 59 57 4f 52 44 2a 4e 4b 45 59 57 4f 52 44  KEYWORD*NKEYWORD
2860: 3b 0a 20 20 66 6f 72 28 69 3d 4e 4b 45 59 57 4f  ;.  for(i=NKEYWO
2870: 52 44 2f 32 3b 20 69 3c 3d 32 2a 4e 4b 45 59 57  RD/2; i<=2*NKEYW
2880: 4f 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  ORD; i++){.    f
2890: 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  or(j=0; j<i; j++
28a0: 29 20 61 48 61 73 68 5b 6a 5d 20 3d 20 30 3b 0a  ) aHash[j] = 0;.
28b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 4e      for(j=0; j<N
28c0: 4b 45 59 57 4f 52 44 3b 20 6a 2b 2b 29 7b 0a 20  KEYWORD; j++){. 
28d0: 20 20 20 20 20 68 20 3d 20 61 4b 65 79 77 6f 72       h = aKeywor
28e0: 64 54 61 62 6c 65 5b 6a 5d 2e 68 61 73 68 20 25  dTable[j].hash %
28f0: 20 69 3b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   i;.      aHash[
2900: 68 5d 20 2a 3d 20 32 3b 0a 20 20 20 20 20 20 61  h] *= 2;.      a
2910: 48 61 73 68 5b 68 5d 2b 2b 3b 0a 20 20 20 20 7d  Hash[h]++;.    }
2920: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6f 75 6e 74  .    for(j=count
2930: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20 63 6f  =0; j<i; j++) co
2940: 75 6e 74 20 2b 3d 20 61 48 61 73 68 5b 6a 5d 3b  unt += aHash[j];
2950: 0a 20 20 20 20 69 66 28 20 63 6f 75 6e 74 3c 62  .    if( count<b
2960: 65 73 74 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  estCount ){.    
2970: 20 20 62 65 73 74 43 6f 75 6e 74 20 3d 20 63 6f    bestCount = co
2980: 75 6e 74 3b 0a 20 20 20 20 20 20 62 65 73 74 53  unt;.      bestS
2990: 69 7a 65 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20  ize = i;.    }. 
29a0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
29b0: 20 74 68 65 20 68 61 73 68 20 2a 2f 0a 20 20 66   the hash */.  f
29c0: 6f 72 28 69 3d 30 3b 20 69 3c 62 65 73 74 53 69  or(i=0; i<bestSi
29d0: 7a 65 3b 20 69 2b 2b 29 20 61 48 61 73 68 5b 69  ze; i++) aHash[i
29e0: 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  ] = 0;.  for(i=0
29f0: 3b 20 69 3c 4e 4b 45 59 57 4f 52 44 3b 20 69 2b  ; i<NKEYWORD; i+
2a00: 2b 29 7b 0a 20 20 20 20 68 20 3d 20 61 4b 65 79  +){.    h = aKey
2a10: 77 6f 72 64 54 61 62 6c 65 5b 69 5d 2e 68 61 73  wordTable[i].has
2a20: 68 20 25 20 62 65 73 74 53 69 7a 65 3b 0a 20 20  h % bestSize;.  
2a30: 20 20 61 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b    aKeywordTable[
2a40: 69 5d 2e 69 4e 65 78 74 20 3d 20 61 48 61 73 68  i].iNext = aHash
2a50: 5b 68 5d 3b 0a 20 20 20 20 61 48 61 73 68 5b 68  [h];.    aHash[h
2a60: 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 0a 20 20  ] = i+1;.  }..  
2a70: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
2a80: 69 6e 67 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72  ing code */.  pr
2a90: 69 6e 74 66 28 22 69 6e 74 20 73 71 6c 69 74 65  intf("int sqlite
2aa0: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 63 6f 6e  3KeywordCode(con
2ab0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
2ac0: 6e 29 7b 5c 6e 22 29 3b 0a 0a 20 20 70 72 69 6e  n){\n");..  prin
2ad0: 74 66 28 22 20 20 73 74 61 74 69 63 20 63 6f 6e  tf("  static con
2ae0: 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 25 64  st char zText[%d
2af0: 5d 20 3d 5c 6e 22 2c 20 6e 43 68 61 72 2b 31 29  ] =\n", nChar+1)
2b00: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
2b10: 3c 4e 4b 45 59 57 4f 52 44 3b 20 69 2b 2b 29 7b  <NKEYWORD; i++){
2b20: 0a 20 20 20 20 4b 65 79 77 6f 72 64 20 2a 70 20  .    Keyword *p 
2b30: 3d 20 26 61 4b 65 79 77 6f 72 64 54 61 62 6c 65  = &aKeywordTable
2b40: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
2b50: 73 75 62 73 74 72 49 64 20 29 20 63 6f 6e 74 69  substrId ) conti
2b60: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  nue;.    if( j==
2b70: 30 20 29 20 70 72 69 6e 74 66 28 22 20 20 20 20  0 ) printf("    
2b80: 5c 22 22 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  \"");.    printf
2b90: 28 22 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  ("%s", p->zName)
2ba0: 3b 0a 20 20 20 20 6a 20 2b 3d 20 70 2d 3e 6c 65  ;.    j += p->le
2bb0: 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3e 36 30 20  n;.    if( j>60 
2bc0: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
2bd0: 22 5c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 6a  "\"\n");.      j
2be0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2bf0: 20 20 70 72 69 6e 74 66 28 22 25 73 3b 5c 6e 22    printf("%s;\n"
2c00: 2c 20 6a 3e 30 20 3f 20 22 5c 22 22 20 3a 20 22  , j>0 ? "\"" : "
2c10: 20 20 22 29 3b 0a 0a 20 20 70 72 69 6e 74 66 28    ");..  printf(
2c20: 22 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  "  static const 
2c30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48  unsigned char aH
2c40: 61 73 68 5b 25 64 5d 20 3d 20 7b 5c 6e 22 2c 20  ash[%d] = {\n", 
2c50: 62 65 73 74 53 69 7a 65 29 3b 0a 20 20 66 6f 72  bestSize);.  for
2c60: 28 69 3d 6a 3d 30 3b 20 69 3c 62 65 73 74 53 69  (i=j=0; i<bestSi
2c70: 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
2c80: 28 20 6a 3d 3d 30 20 29 20 70 72 69 6e 74 66 28  ( j==0 ) printf(
2c90: 22 20 20 20 20 22 29 3b 0a 20 20 20 20 70 72 69  "    ");.    pri
2ca0: 6e 74 66 28 22 20 25 33 64 2c 22 2c 20 61 48 61  ntf(" %3d,", aHa
2cb0: 73 68 5b 69 5d 29 3b 0a 20 20 20 20 6a 2b 2b 3b  sh[i]);.    j++;
2cc0: 0a 20 20 20 20 69 66 28 20 6a 3e 31 32 20 29 7b  .    if( j>12 ){
2cd0: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c  .      printf("\
2ce0: 6e 22 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  n");.      j = 0
2cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 72  ;.    }.  }.  pr
2d00: 69 6e 74 66 28 22 25 73 20 20 7d 3b 5c 6e 22 2c  intf("%s  };\n",
2d10: 20 6a 3d 3d 30 20 3f 20 22 22 20 3a 20 22 5c 6e   j==0 ? "" : "\n
2d20: 22 29 3b 20 20 20 20 0a 0a 20 20 70 72 69 6e 74  ");    ..  print
2d30: 66 28 22 20 20 73 74 61 74 69 63 20 63 6f 6e 73  f("  static cons
2d40: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2d50: 61 4e 65 78 74 5b 25 64 5d 20 3d 20 7b 5c 6e 22  aNext[%d] = {\n"
2d60: 2c 20 4e 4b 45 59 57 4f 52 44 29 3b 0a 20 20 66  , NKEYWORD);.  f
2d70: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 4b 45 59  or(i=j=0; i<NKEY
2d80: 57 4f 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  WORD; i++){.    
2d90: 69 66 28 20 6a 3d 3d 30 20 29 20 70 72 69 6e 74  if( j==0 ) print
2da0: 66 28 22 20 20 20 20 22 29 3b 0a 20 20 20 20 70  f("    ");.    p
2db0: 72 69 6e 74 66 28 22 20 25 33 64 2c 22 2c 20 61  rintf(" %3d,", a
2dc0: 4b 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 2e  KeywordTable[i].
2dd0: 69 4e 65 78 74 29 3b 0a 20 20 20 20 6a 2b 2b 3b  iNext);.    j++;
2de0: 0a 20 20 20 20 69 66 28 20 6a 3e 31 32 20 29 7b  .    if( j>12 ){
2df0: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c  .      printf("\
2e00: 6e 22 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  n");.      j = 0
2e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 72  ;.    }.  }.  pr
2e20: 69 6e 74 66 28 22 25 73 20 20 7d 3b 5c 6e 22 2c  intf("%s  };\n",
2e30: 20 6a 3d 3d 30 20 3f 20 22 22 20 3a 20 22 5c 6e   j==0 ? "" : "\n
2e40: 22 29 3b 20 20 20 20 0a 0a 20 20 70 72 69 6e 74  ");    ..  print
2e50: 66 28 22 20 20 73 74 61 74 69 63 20 63 6f 6e 73  f("  static cons
2e60: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2e70: 61 4c 65 6e 5b 25 64 5d 20 3d 20 7b 5c 6e 22 2c  aLen[%d] = {\n",
2e80: 20 4e 4b 45 59 57 4f 52 44 29 3b 0a 20 20 66 6f   NKEYWORD);.  fo
2e90: 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 4b 45 59 57  r(i=j=0; i<NKEYW
2ea0: 4f 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ORD; i++){.    i
2eb0: 66 28 20 6a 3d 3d 30 20 29 20 70 72 69 6e 74 66  f( j==0 ) printf
2ec0: 28 22 20 20 20 20 22 29 3b 0a 20 20 20 20 70 72  ("    ");.    pr
2ed0: 69 6e 74 66 28 22 20 25 33 64 2c 22 2c 20 61 4b  intf(" %3d,", aK
2ee0: 65 79 77 6f 72 64 54 61 62 6c 65 5b 69 5d 2e 6c  eywordTable[i].l
2ef0: 65 6e 2b 61 4b 65 79 77 6f 72 64 54 61 62 6c 65  en+aKeywordTable
2f00: 5b 69 5d 2e 70 72 65 66 69 78 29 3b 0a 20 20 20  [i].prefix);.   
2f10: 20 6a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6a 3e   j++;.    if( j>
2f20: 31 32 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  12 ){.      prin
2f30: 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tf("\n");.      
2f40: 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  j = 0;.    }.  }
2f50: 0a 20 20 70 72 69 6e 74 66 28 22 25 73 20 20 7d  .  printf("%s  }
2f60: 3b 5c 6e 22 2c 20 6a 3d 3d 30 20 3f 20 22 22 20  ;\n", j==0 ? "" 
2f70: 3a 20 22 5c 6e 22 29 3b 20 20 20 20 0a 0a 20 20  : "\n");    ..  
2f80: 70 72 69 6e 74 66 28 22 20 20 73 74 61 74 69 63  printf("  static
2f90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
2fa0: 73 68 6f 72 74 20 69 6e 74 20 61 4f 66 66 73 65  short int aOffse
2fb0: 74 5b 25 64 5d 20 3d 20 7b 5c 6e 22 2c 20 4e 4b  t[%d] = {\n", NK
2fc0: 45 59 57 4f 52 44 29 3b 0a 20 20 66 6f 72 28 69  EYWORD);.  for(i
2fd0: 3d 6a 3d 30 3b 20 69 3c 4e 4b 45 59 57 4f 52 44  =j=0; i<NKEYWORD
2fe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2ff0: 6a 3d 3d 30 20 29 20 70 72 69 6e 74 66 28 22 20  j==0 ) printf(" 
3000: 20 20 20 22 29 3b 0a 20 20 20 20 70 72 69 6e 74     ");.    print
3010: 66 28 22 20 25 33 64 2c 22 2c 20 61 4b 65 79 77  f(" %3d,", aKeyw
3020: 6f 72 64 54 61 62 6c 65 5b 69 5d 2e 6f 66 66 73  ordTable[i].offs
3030: 65 74 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  et);.    j++;.  
3040: 20 20 69 66 28 20 6a 3e 31 32 20 29 7b 0a 20 20    if( j>12 ){.  
3050: 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
3060: 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
3070: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 72 69 6e 74     }.  }.  print
3080: 66 28 22 25 73 20 20 7d 3b 5c 6e 22 2c 20 6a 3d  f("%s  };\n", j=
3090: 3d 30 20 3f 20 22 22 20 3a 20 22 5c 6e 22 29 3b  =0 ? "" : "\n");
30a0: 0a 0a 20 20 70 72 69 6e 74 66 28 22 20 20 73 74  ..  printf("  st
30b0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
30c0: 6e 65 64 20 63 68 61 72 20 61 43 6f 64 65 5b 25  ned char aCode[%
30d0: 64 5d 20 3d 20 7b 5c 6e 22 2c 20 4e 4b 45 59 57  d] = {\n", NKEYW
30e0: 4f 52 44 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  ORD);.  for(i=j=
30f0: 30 3b 20 69 3c 4e 4b 45 59 57 4f 52 44 3b 20 69  0; i<NKEYWORD; i
3100: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
3110: 54 6f 6b 65 6e 20 3d 20 61 4b 65 79 77 6f 72 64  Token = aKeyword
3120: 54 61 62 6c 65 5b 69 5d 2e 7a 54 6f 6b 65 6e 54  Table[i].zTokenT
3130: 79 70 65 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  ype;.    if( j==
3140: 30 20 29 20 70 72 69 6e 74 66 28 22 20 20 20 20  0 ) printf("    
3150: 22 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ");.    printf("
3160: 25 73 2c 25 2a 73 22 2c 20 7a 54 6f 6b 65 6e 2c  %s,%*s", zToken,
3170: 20 28 69 6e 74 29 28 31 34 2d 73 74 72 6c 65 6e   (int)(14-strlen
3180: 28 7a 54 6f 6b 65 6e 29 29 2c 20 22 22 29 3b 0a  (zToken)), "");.
3190: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 69 66 28      j++;.    if(
31a0: 20 6a 3e 3d 35 20 29 7b 0a 20 20 20 20 20 20 70   j>=5 ){.      p
31b0: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
31c0: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     j = 0;.    }.
31d0: 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 25 73    }.  printf("%s
31e0: 20 20 7d 3b 5c 6e 22 2c 20 6a 3d 3d 30 20 3f 20    };\n", j==0 ? 
31f0: 22 22 20 3a 20 22 5c 6e 22 29 3b 0a 0a 20 20 70  "" : "\n");..  p
3200: 72 69 6e 74 66 28 22 20 20 69 6e 74 20 68 2c 20  rintf("  int h, 
3210: 69 3b 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74 66  i;\n");.  printf
3220: 28 22 20 20 69 66 28 20 6e 3c 32 20 29 20 72 65  ("  if( n<2 ) re
3230: 74 75 72 6e 20 54 4b 5f 49 44 3b 5c 6e 22 29 3b  turn TK_ID;\n");
3240: 0a 20 20 70 72 69 6e 74 66 28 22 20 20 68 20 3d  .  printf("  h =
3250: 20 28 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f   (sqlite3UpperTo
3260: 4c 6f 77 65 72 5b 28 28 75 6e 73 69 67 6e 65 64  Lower[((unsigned
3270: 20 63 68 61 72 2a 29 7a 29 5b 30 5d 5d 2a 35 20   char*)z)[0]]*5 
3280: 2b 20 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22  + \n".         "
3290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 70 70        sqlite3Upp
32a0: 65 72 54 6f 4c 6f 77 65 72 5b 28 28 75 6e 73 69  erToLower[((unsi
32b0: 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b 6e 2d  gned char*)z)[n-
32c0: 31 5d 5d 2a 33 20 2b 5c 6e 22 0a 20 20 20 20 20  1]]*3 +\n".     
32d0: 20 20 20 20 22 20 20 20 20 20 20 6e 29 20 25 25      "      n) %%
32e0: 20 25 64 3b 5c 6e 22 2c 20 62 65 73 74 53 69 7a   %d;\n", bestSiz
32f0: 65 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20  e);.  printf("  
3300: 66 6f 72 28 69 3d 28 28 69 6e 74 29 61 48 61 73  for(i=((int)aHas
3310: 68 5b 68 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69  h[h])-1; i>=0; i
3320: 3d 28 28 69 6e 74 29 61 4e 65 78 74 5b 69 5d 29  =((int)aNext[i])
3330: 2d 31 29 7b 5c 6e 22 29 3b 0a 20 20 70 72 69 6e  -1){\n");.  prin
3340: 74 66 28 22 20 20 20 20 69 66 28 20 61 4c 65 6e  tf("    if( aLen
3350: 5b 69 5d 3d 3d 6e 20 26 26 22 0a 20 20 20 20 20  [i]==n &&".     
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
3370: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
3380: 26 7a 54 65 78 74 5b 61 4f 66 66 73 65 74 5b 69  &zText[aOffset[i
3390: 5d 5d 2c 7a 2c 6e 29 3d 3d 30 20 29 7b 5c 6e 22  ]],z,n)==0 ){\n"
33a0: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 20  );.  printf("   
33b0: 20 20 20 72 65 74 75 72 6e 20 61 43 6f 64 65 5b     return aCode[
33c0: 69 5d 3b 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74  i];\n");.  print
33d0: 66 28 22 20 20 20 20 7d 5c 6e 22 29 3b 0a 20 20  f("    }\n");.  
33e0: 70 72 69 6e 74 66 28 22 20 20 7d 5c 6e 22 29 3b  printf("  }\n");
33f0: 0a 20 20 70 72 69 6e 74 66 28 22 20 20 72 65 74  .  printf("  ret
3400: 75 72 6e 20 54 4b 5f 49 44 3b 5c 6e 22 29 3b 0a  urn TK_ID;\n");.
3410: 20 20 70 72 69 6e 74 66 28 22 7d 5c 6e 22 29 3b    printf("}\n");
3420: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.