/ Hex Artifact Content
Login

Artifact 19262ef3ef29d4de2f281b423326865c8916c63d0cb09f1dc98d24d5c1e8ba64:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 30 31 2d 30 38  /*.** 2018-01-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f  file contains co
0190: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
01a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d  the sqlite3_norm
01b0: 61 6c 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e  alize() function
01c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 63 68 61 72 20  ..**.**    char 
01d0: 2a 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69  *sqlite3_normali
01e0: 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ze(const char *z
01f0: 53 71 6c 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Sql);.**.** This
0200: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
0210: 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 61 73  an SQL string as
0220: 20 69 6e 70 75 74 20 61 6e 64 20 72 65 74 75 72   input and retur
0230: 6e 73 20 61 20 22 6e 6f 72 6d 61 6c 69 7a 65 64  ns a "normalized
0240: 22 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20  ".** version of 
0250: 74 68 61 74 20 73 74 72 69 6e 67 20 69 6e 20 6d  that string in m
0260: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
0270: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
0280: 6f 63 36 34 28 29 2e 20 20 54 68 65 0a 2a 2a 20  oc64().  The.** 
0290: 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
02a0: 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
02b0: 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ng that the retu
02c0: 72 6e 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 66  rned memory is f
02d0: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  reed..**.** If a
02e0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
02f0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
0300: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
0310: 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
0320: 2a 20 54 68 65 20 6e 6f 72 6d 61 6c 69 7a 61 74  * The normalizat
0330: 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ion consists of 
0340: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72  the following tr
0350: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 3a 0a 2a  ansformations:.*
0360: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 43 6f 6e 76  *.**   (1)  Conv
0370: 65 72 74 20 65 76 65 72 79 20 6c 69 74 65 72 61  ert every litera
0380: 6c 20 28 73 74 72 69 6e 67 2c 20 62 6c 6f 62 20  l (string, blob 
0390: 6c 69 74 65 72 61 6c 2c 20 6e 75 6d 65 72 69 63  literal, numeric
03a0: 20 63 6f 6e 73 74 61 6e 74 2c 0a 2a 2a 20 20 20   constant,.**   
03b0: 20 20 20 20 20 6f 72 20 22 4e 55 4c 4c 22 20 63       or "NULL" c
03c0: 6f 6e 73 74 61 6e 74 29 20 69 6e 74 6f 20 61 20  onstant) into a 
03d0: 3f 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 52  ?.**.**   (2)  R
03e0: 65 6d 6f 76 65 20 61 6c 6c 20 73 75 70 65 72 66  emove all superf
03f0: 6c 75 6f 75 73 20 77 68 69 74 65 73 70 61 63 65  luous whitespace
0400: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 6f 6d 6d  , including comm
0410: 65 6e 74 73 2e 20 20 43 68 61 6e 67 65 0a 2a 2a  ents.  Change.**
0420: 20 20 20 20 20 20 20 20 61 6c 6c 20 72 65 71 75          all requ
0430: 69 72 65 64 20 77 68 69 74 65 73 70 61 63 65 20  ired whitespace 
0440: 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 70 61 63  to a single spac
0450: 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a  e character..**.
0460: 2a 2a 20 20 20 28 33 29 20 20 4c 6f 77 65 72 63  **   (3)  Lowerc
0470: 61 73 65 20 61 6c 6c 20 41 53 43 49 49 20 63 68  ase all ASCII ch
0480: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
0490: 20 20 28 34 29 20 20 49 66 20 61 6e 20 49 4e 20    (4)  If an IN 
04a0: 6f 72 20 4e 4f 54 20 49 4e 20 6f 70 65 72 61 74  or NOT IN operat
04b0: 6f 72 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62  or is followed b
04c0: 79 20 61 20 6c 69 73 74 20 6f 66 20 31 20 6f 72  y a list of 1 or
04d0: 20 6d 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20   more.**        
04e0: 76 61 6c 75 65 73 2c 20 63 6f 6e 76 65 72 74 20  values, convert 
04f0: 74 68 61 74 20 6c 69 73 74 20 69 6e 74 6f 20 22  that list into "
0500: 28 3f 2c 3f 2c 3f 29 22 2e 0a 2a 2a 0a 2a 2a 20  (?,?,?)"..**.** 
0510: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6e  The purpose of n
0520: 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20  ormalization is 
0530: 74 77 6f 2d 66 6f 6c 64 3a 0a 2a 2a 0a 2a 2a 20  two-fold:.**.** 
0540: 20 20 28 31 29 20 20 53 61 6e 69 74 69 7a 65 20    (1)  Sanitize 
0550: 71 75 65 72 69 65 73 20 62 79 20 72 65 6d 6f 76  queries by remov
0560: 69 6e 67 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  ing potentially 
0570: 70 72 69 76 61 74 65 20 6f 72 20 73 65 6e 73 69  private or sensi
0580: 74 69 76 65 0a 2a 2a 20 20 20 20 20 20 20 20 69  tive.**        i
0590: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 6e 74 61  nformation conta
05a0: 69 6e 65 64 20 69 6e 20 6c 69 74 65 72 61 6c 73  ined in literals
05b0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 49  ..**.**   (2)  I
05c0: 64 65 6e 74 69 66 79 20 73 74 72 75 63 74 75 72  dentify structur
05d0: 61 6c 6c 79 20 69 64 65 6e 74 69 63 61 6c 20 71  ally identical q
05e0: 75 65 72 69 65 73 20 62 79 20 63 6f 6d 70 61 72  ueries by compar
05f0: 69 6e 67 20 74 68 65 69 72 0a 2a 2a 20 20 20 20  ing their.**    
0600: 20 20 20 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 66      normalized f
0610: 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d  orms..**.** Comm
0620: 61 6e 64 2d 4c 69 6e 65 20 55 74 69 6c 69 74 79  and-Line Utility
0630: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 54  --------.**.** T
0650: 68 69 73 20 66 69 6c 65 20 61 6c 73 6f 20 63 6f  his file also co
0660: 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20  ntains code for 
0670: 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 75  a command-line u
0680: 74 69 6c 69 74 79 20 74 68 61 74 20 63 6f 6e 76  tility that conv
0690: 65 72 74 73 0a 2a 2a 20 53 51 4c 20 71 75 65 72  erts.** SQL quer
06a0: 69 65 73 20 69 6e 20 74 65 78 74 20 66 69 6c 65  ies in text file
06b0: 73 20 69 6e 74 6f 20 74 68 65 69 72 20 6e 6f 72  s into their nor
06c0: 6d 61 6c 69 7a 65 64 20 66 6f 72 6d 73 2e 20 20  malized forms.  
06d0: 54 6f 20 62 75 69 6c 64 20 74 68 65 0a 2a 2a 20  To build the.** 
06e0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 70 72 6f  command-line pro
06f0: 67 72 61 6d 2c 20 63 6f 6d 70 69 6c 65 20 74 68  gram, compile th
0700: 69 73 20 66 69 6c 65 20 77 69 74 68 20 2d 44 53  is file with -DS
0710: 51 4c 49 54 45 5f 4e 4f 52 4d 41 4c 49 5a 45 5f  QLITE_NORMALIZE_
0720: 43 4c 49 0a 2a 2a 20 61 6e 64 20 6c 69 6e 6b 20  CLI.** and link 
0730: 69 74 20 61 67 61 69 6e 73 74 20 74 68 65 20 53  it against the S
0740: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a  QLite library..*
0750: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c 69  /.#include <sqli
0760: 74 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  te3.h>.#include 
0770: 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a  <string.h>../*.*
0780: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0790: 20 6e 6f 74 65 3a 0a 2a 2a 0a 2a 2a 20 4d 75 63   note:.**.** Muc
07a0: 68 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a  h of the tokeniz
07b0: 65 72 20 6c 6f 67 69 63 20 69 73 20 63 6f 70 69  er logic is copi
07c0: 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 74 6f  ed out of the to
07d0: 6b 65 6e 69 7a 65 2e 63 20 73 6f 75 72 63 65 20  kenize.c source 
07e0: 66 69 6c 65 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  file.** of SQLit
07f0: 65 2e 20 20 54 68 61 74 20 6c 6f 67 69 63 20 63  e.  That logic c
0800: 6f 75 6c 64 20 62 65 20 73 69 6d 70 6c 69 66 69  ould be simplifi
0810: 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 72 74  ed for this part
0820: 69 63 75 6c 61 72 20 61 70 70 6c 69 63 61 74 69  icular applicati
0830: 6f 6e 2c 0a 2a 2a 20 62 75 74 20 74 68 61 74 20  on,.** but that 
0840: 77 6f 75 6c 64 20 69 6d 70 6f 73 65 20 61 20 72  would impose a r
0850: 69 73 6b 20 6f 66 20 69 6e 74 72 6f 64 75 63 69  isk of introduci
0860: 6e 67 20 73 75 62 74 6c 65 20 65 72 72 6f 72 73  ng subtle errors
0870: 2e 20 20 49 74 20 69 73 20 62 65 73 74 20 74 6f  .  It is best to
0880: 0a 2a 2a 20 6b 65 65 70 20 74 68 65 20 63 6f 64  .** keep the cod
0890: 65 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 74 68  e as close to th
08a0: 65 20 6f 72 69 67 69 6e 61 6c 20 61 73 20 70 6f  e original as po
08b0: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ssible..**.** Th
08c0: 65 20 74 6f 6b 65 6e 69 7a 65 20 63 6f 64 65 20  e tokenize code 
08d0: 69 73 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20  is in sync with 
08e0: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
08f0: 61 73 20 6f 66 20 32 30 31 38 2d 30 31 2d 30 38  as of 2018-01-08
0900: 2e 0a 2a 2a 20 41 6e 79 20 66 75 74 75 72 65 20  ..** Any future 
0910: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 63  changes to the c
0920: 6f 72 65 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 69  ore tokenizer mi
0930: 67 68 74 20 72 65 71 75 69 72 65 20 63 6f 72 72  ght require corr
0940: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 64 6a  esponding.** adj
0950: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
0960: 74 6f 6b 65 6e 69 7a 65 72 20 6c 6f 67 69 63 20  tokenizer logic 
0970: 69 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  in this module..
0980: 2a 2f 0a 0a 0a 2f 2a 20 43 68 61 72 61 63 74 65  */.../* Characte
0990: 72 20 63 6c 61 73 73 65 73 20 66 6f 72 20 74 6f  r classes for to
09a0: 6b 65 6e 69 7a 69 6e 67 0a 2a 2a 0a 2a 2a 20 49  kenizing.**.** I
09b0: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 47 65 74  n the sqlite3Get
09c0: 54 6f 6b 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e  Token() function
09d0: 2c 20 61 20 73 77 69 74 63 68 28 29 20 6f 6e 20  , a switch() on 
09e0: 61 69 43 6c 61 73 73 5b 63 5d 20 69 73 20 69 6d  aiClass[c] is im
09f0: 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69  plemented.** usi
0a00: 6e 67 20 61 20 6c 6f 6f 6b 75 70 20 74 61 62 6c  ng a lookup tabl
0a10: 65 2c 20 77 68 65 72 65 61 73 20 61 20 73 77 69  e, whereas a swi
0a20: 74 63 68 28 29 20 64 69 72 65 63 74 6c 79 20 6f  tch() directly o
0a30: 6e 20 63 20 75 73 65 73 20 61 20 62 69 6e 61 72  n c uses a binar
0a40: 79 20 73 65 61 72 63 68 2e 0a 2a 2a 20 54 68 65  y search..** The
0a50: 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69 73   lookup table is
0a60: 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 54   much faster.  T
0a70: 6f 20 6d 61 78 69 6d 69 7a 65 20 73 70 65 65 64  o maximize speed
0a80: 2c 20 61 6e 64 20 74 6f 20 65 6e 73 75 72 65 20  , and to ensure 
0a90: 74 68 61 74 0a 2a 2a 20 61 20 6c 6f 6f 6b 75 70  that.** a lookup
0aa0: 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 2c 20   table is used, 
0ab0: 61 6c 6c 20 6f 66 20 74 68 65 20 63 6c 61 73 73  all of the class
0ac0: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6d  es need to be sm
0ad0: 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 61 6e 64  all integers and
0ae0: 0a 2a 2a 20 61 6c 6c 20 6f 66 20 74 68 65 6d 20  .** all of them 
0af0: 6e 65 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  need to be used 
0b00: 77 69 74 68 69 6e 20 74 68 65 20 73 77 69 74 63  within the switc
0b10: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43  h..*/.#define CC
0b20: 5f 58 20 20 20 20 20 20 20 20 20 20 30 20 20 20  _X          0   
0b30: 20 2f 2a 20 54 68 65 20 6c 65 74 74 65 72 20 27   /* The letter '
0b40: 78 27 2c 20 6f 72 20 73 74 61 72 74 20 6f 66 20  x', or start of 
0b50: 42 4c 4f 42 20 6c 69 74 65 72 61 6c 20 2a 2f 0a  BLOB literal */.
0b60: 23 64 65 66 69 6e 65 20 43 43 5f 4b 59 57 44 20  #define CC_KYWD 
0b70: 20 20 20 20 20 20 31 20 20 20 20 2f 2a 20 41 6c        1    /* Al
0b80: 70 68 61 62 65 74 69 63 73 20 6f 72 20 27 5f 27  phabetics or '_'
0b90: 2e 20 20 55 73 61 62 6c 65 20 69 6e 20 61 20 6b  .  Usable in a k
0ba0: 65 79 77 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e  eyword */.#defin
0bb0: 65 20 43 43 5f 49 44 20 20 20 20 20 20 20 20 20  e CC_ID         
0bc0: 32 20 20 20 20 2f 2a 20 75 6e 69 63 6f 64 65 20  2    /* unicode 
0bd0: 63 68 61 72 61 63 74 65 72 73 20 75 73 61 62 6c  characters usabl
0be0: 65 20 69 6e 20 49 44 73 20 2a 2f 0a 23 64 65 66  e in IDs */.#def
0bf0: 69 6e 65 20 43 43 5f 44 49 47 49 54 20 20 20 20  ine CC_DIGIT    
0c00: 20 20 33 20 20 20 20 2f 2a 20 44 69 67 69 74 73    3    /* Digits
0c10: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 44   */.#define CC_D
0c20: 4f 4c 4c 41 52 20 20 20 20 20 34 20 20 20 20 2f  OLLAR     4    /
0c30: 2a 20 27 24 27 20 2a 2f 0a 23 64 65 66 69 6e 65  * '$' */.#define
0c40: 20 43 43 5f 56 41 52 41 4c 50 48 41 20 20 20 35   CC_VARALPHA   5
0c50: 20 20 20 20 2f 2a 20 27 40 27 2c 20 27 23 27 2c      /* '@', '#',
0c60: 20 27 3a 27 2e 20 20 41 6c 70 68 61 62 65 74 69   ':'.  Alphabeti
0c70: 63 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 20  c SQL variables 
0c80: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 56 41  */.#define CC_VA
0c90: 52 4e 55 4d 20 20 20 20 20 36 20 20 20 20 2f 2a  RNUM     6    /*
0ca0: 20 27 3f 27 2e 20 20 4e 75 6d 65 72 69 63 20 53   '?'.  Numeric S
0cb0: 51 4c 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a  QL variables */.
0cc0: 23 64 65 66 69 6e 65 20 43 43 5f 53 50 41 43 45  #define CC_SPACE
0cd0: 20 20 20 20 20 20 37 20 20 20 20 2f 2a 20 53 70        7    /* Sp
0ce0: 61 63 65 20 63 68 61 72 61 63 74 65 72 73 20 2a  ace characters *
0cf0: 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 51 55 4f  /.#define CC_QUO
0d00: 54 45 20 20 20 20 20 20 38 20 20 20 20 2f 2a 20  TE      8    /* 
0d10: 27 22 27 2c 20 27 5c 27 27 2c 20 6f 72 20 27 60  '"', '\'', or '`
0d20: 27 2e 20 20 53 74 72 69 6e 67 20 6c 69 74 65 72  '.  String liter
0d30: 61 6c 73 2c 20 71 75 6f 74 65 64 20 69 64 73 20  als, quoted ids 
0d40: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 51 55  */.#define CC_QU
0d50: 4f 54 45 32 20 20 20 20 20 39 20 20 20 20 2f 2a  OTE2     9    /*
0d60: 20 27 5b 27 2e 20 20 20 5b 2e 2e 2e 5d 20 73 74   '['.   [...] st
0d70: 79 6c 65 20 71 75 6f 74 65 64 20 69 64 73 20 2a  yle quoted ids *
0d80: 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 50 49 50  /.#define CC_PIP
0d90: 45 20 20 20 20 20 20 31 30 20 20 20 20 2f 2a 20  E      10    /* 
0da0: 27 7c 27 2e 20 20 20 42 69 74 77 69 73 65 20 4f  '|'.   Bitwise O
0db0: 52 20 6f 72 20 63 6f 6e 63 61 74 65 6e 61 74 65  R or concatenate
0dc0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 4d   */.#define CC_M
0dd0: 49 4e 55 53 20 20 20 20 20 31 31 20 20 20 20 2f  INUS     11    /
0de0: 2a 20 27 2d 27 2e 20 20 4d 69 6e 75 73 20 6f 72  * '-'.  Minus or
0df0: 20 53 51 4c 2d 73 74 79 6c 65 20 63 6f 6d 6d 65   SQL-style comme
0e00: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43  nt */.#define CC
0e10: 5f 4c 54 20 20 20 20 20 20 20 20 31 32 20 20 20  _LT        12   
0e20: 20 2f 2a 20 27 3c 27 2e 20 20 50 61 72 74 20 6f   /* '<'.  Part o
0e30: 66 20 3c 20 6f 72 20 3c 3d 20 6f 72 20 3c 3e 20  f < or <= or <> 
0e40: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 47 54  */.#define CC_GT
0e50: 20 20 20 20 20 20 20 20 31 33 20 20 20 20 2f 2a          13    /*
0e60: 20 27 3e 27 2e 20 20 50 61 72 74 20 6f 66 20 3e   '>'.  Part of >
0e70: 20 6f 72 20 3e 3d 20 2a 2f 0a 23 64 65 66 69 6e   or >= */.#defin
0e80: 65 20 43 43 5f 45 51 20 20 20 20 20 20 20 20 31  e CC_EQ        1
0e90: 34 20 20 20 20 2f 2a 20 27 3d 27 2e 20 20 50 61  4    /* '='.  Pa
0ea0: 72 74 20 6f 66 20 3d 20 6f 72 20 3d 3d 20 2a 2f  rt of = or == */
0eb0: 0a 23 64 65 66 69 6e 65 20 43 43 5f 42 41 4e 47  .#define CC_BANG
0ec0: 20 20 20 20 20 20 31 35 20 20 20 20 2f 2a 20 27        15    /* '
0ed0: 21 27 2e 20 20 50 61 72 74 20 6f 66 20 21 3d 20  !'.  Part of != 
0ee0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 53 4c  */.#define CC_SL
0ef0: 41 53 48 20 20 20 20 20 31 36 20 20 20 20 2f 2a  ASH     16    /*
0f00: 20 27 2f 27 2e 20 20 2f 20 6f 72 20 63 2d 73 74   '/'.  / or c-st
0f10: 79 6c 65 20 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 23  yle comment */.#
0f20: 64 65 66 69 6e 65 20 43 43 5f 4c 50 20 20 20 20  define CC_LP    
0f30: 20 20 20 20 31 37 20 20 20 20 2f 2a 20 27 28 27      17    /* '('
0f40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 52   */.#define CC_R
0f50: 50 20 20 20 20 20 20 20 20 31 38 20 20 20 20 2f  P        18    /
0f60: 2a 20 27 29 27 20 2a 2f 0a 23 64 65 66 69 6e 65  * ')' */.#define
0f70: 20 43 43 5f 53 45 4d 49 20 20 20 20 20 20 31 39   CC_SEMI      19
0f80: 20 20 20 20 2f 2a 20 27 3b 27 20 2a 2f 0a 23 64      /* ';' */.#d
0f90: 65 66 69 6e 65 20 43 43 5f 50 4c 55 53 20 20 20  efine CC_PLUS   
0fa0: 20 20 20 32 30 20 20 20 20 2f 2a 20 27 2b 27 20     20    /* '+' 
0fb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 53 54  */.#define CC_ST
0fc0: 41 52 20 20 20 20 20 20 32 31 20 20 20 20 2f 2a  AR      21    /*
0fd0: 20 27 2a 27 20 2a 2f 0a 23 64 65 66 69 6e 65 20   '*' */.#define 
0fe0: 43 43 5f 50 45 52 43 45 4e 54 20 20 20 32 32 20  CC_PERCENT   22 
0ff0: 20 20 20 2f 2a 20 27 25 27 20 2a 2f 0a 23 64 65     /* '%' */.#de
1000: 66 69 6e 65 20 43 43 5f 43 4f 4d 4d 41 20 20 20  fine CC_COMMA   
1010: 20 20 32 33 20 20 20 20 2f 2a 20 27 2c 27 20 2a    23    /* ',' *
1020: 2f 0a 23 64 65 66 69 6e 65 20 43 43 5f 41 4e 44  /.#define CC_AND
1030: 20 20 20 20 20 20 20 32 34 20 20 20 20 2f 2a 20         24    /* 
1040: 27 26 27 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43  '&' */.#define C
1050: 43 5f 54 49 4c 44 41 20 20 20 20 20 32 35 20 20  C_TILDA     25  
1060: 20 20 2f 2a 20 27 7e 27 20 2a 2f 0a 23 64 65 66    /* '~' */.#def
1070: 69 6e 65 20 43 43 5f 44 4f 54 20 20 20 20 20 20  ine CC_DOT      
1080: 20 32 36 20 20 20 20 2f 2a 20 27 2e 27 20 2a 2f   26    /* '.' */
1090: 0a 23 64 65 66 69 6e 65 20 43 43 5f 49 4c 4c 45  .#define CC_ILLE
10a0: 47 41 4c 20 20 20 32 37 20 20 20 20 2f 2a 20 49  GAL   27    /* I
10b0: 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
10c0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73   */..static cons
10d0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
10e0: 61 69 43 6c 61 73 73 5b 5d 20 3d 20 7b 0a 2f 2a  aiClass[] = {./*
10f0: 20 20 20 20 20 20 20 20 20 78 30 20 20 78 31 20           x0  x1 
1100: 20 78 32 20 20 78 33 20 20 78 34 20 20 78 35 20   x2  x3  x4  x5 
1110: 20 78 36 20 20 78 37 20 20 78 38 20 20 78 39 20   x6  x7  x8  x9 
1120: 20 78 61 20 20 78 62 20 20 78 63 20 20 78 64 20   xa  xb  xc  xd 
1130: 20 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78   xe  xf */./* 0x
1140: 20 2a 2f 20 20 20 32 37 2c 20 32 37 2c 20 32 37   */   27, 27, 27
1150: 2c 20 32 37 2c 20 32 37 2c 20 32 37 2c 20 32 37  , 27, 27, 27, 27
1160: 2c 20 32 37 2c 20 32 37 2c 20 20 37 2c 20 20 37  , 27, 27,  7,  7
1170: 2c 20 32 37 2c 20 20 37 2c 20 20 37 2c 20 32 37  , 27,  7,  7, 27
1180: 2c 20 32 37 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20  , 27,./* 1x */  
1190: 20 32 37 2c 20 32 37 2c 20 32 37 2c 20 32 37 2c   27, 27, 27, 27,
11a0: 20 32 37 2c 20 32 37 2c 20 32 37 2c 20 32 37 2c   27, 27, 27, 27,
11b0: 20 32 37 2c 20 32 37 2c 20 32 37 2c 20 32 37 2c   27, 27, 27, 27,
11c0: 20 32 37 2c 20 32 37 2c 20 32 37 2c 20 32 37 2c   27, 27, 27, 27,
11d0: 0a 2f 2a 20 32 78 20 2a 2f 20 20 20 20 37 2c 20  ./* 2x */    7, 
11e0: 31 35 2c 20 20 38 2c 20 20 35 2c 20 20 34 2c 20  15,  8,  5,  4, 
11f0: 32 32 2c 20 32 34 2c 20 20 38 2c 20 31 37 2c 20  22, 24,  8, 17, 
1200: 31 38 2c 20 32 31 2c 20 32 30 2c 20 32 33 2c 20  18, 21, 20, 23, 
1210: 31 31 2c 20 32 36 2c 20 31 36 2c 0a 2f 2a 20 33  11, 26, 16,./* 3
1220: 78 20 2a 2f 20 20 20 20 33 2c 20 20 33 2c 20 20  x */    3,  3,  
1230: 33 2c 20 20 33 2c 20 20 33 2c 20 20 33 2c 20 20  3,  3,  3,  3,  
1240: 33 2c 20 20 33 2c 20 20 33 2c 20 20 33 2c 20 20  3,  3,  3,  3,  
1250: 35 2c 20 31 39 2c 20 31 32 2c 20 31 34 2c 20 31  5, 19, 12, 14, 1
1260: 33 2c 20 20 36 2c 0a 2f 2a 20 34 78 20 2a 2f 20  3,  6,./* 4x */ 
1270: 20 20 20 35 2c 20 20 31 2c 20 20 31 2c 20 20 31     5,  1,  1,  1
1280: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
1290: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
12a0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
12b0: 2c 0a 2f 2a 20 35 78 20 2a 2f 20 20 20 20 31 2c  ,./* 5x */    1,
12c0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
12d0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c    1,  1,  1,  0,
12e0: 20 20 31 2c 20 20 31 2c 20 20 39 2c 20 32 37 2c    1,  1,  9, 27,
12f0: 20 32 37 2c 20 32 37 2c 20 20 31 2c 0a 2f 2a 20   27, 27,  1,./* 
1300: 36 78 20 2a 2f 20 20 20 20 38 2c 20 20 31 2c 20  6x */    8,  1, 
1310: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
1320: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
1330: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
1340: 20 31 2c 20 20 31 2c 0a 2f 2a 20 37 78 20 2a 2f   1,  1,./* 7x */
1350: 20 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20      1,  1,  1,  
1360: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
1370: 31 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 32  1,  0,  1,  1, 2
1380: 37 2c 20 31 30 2c 20 32 37 2c 20 32 35 2c 20 32  7, 10, 27, 25, 2
1390: 37 2c 0a 2f 2a 20 38 78 20 2a 2f 20 20 20 20 32  7,./* 8x */    2
13a0: 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32  ,  2,  2,  2,  2
13b0: 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32  ,  2,  2,  2,  2
13c0: 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32  ,  2,  2,  2,  2
13d0: 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 0a 2f 2a  ,  2,  2,  2,./*
13e0: 20 39 78 20 2a 2f 20 20 20 20 32 2c 20 20 32 2c   9x */    2,  2,
13f0: 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c    2,  2,  2,  2,
1400: 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c    2,  2,  2,  2,
1410: 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c    2,  2,  2,  2,
1420: 20 20 32 2c 20 20 32 2c 0a 2f 2a 20 41 78 20 2a    2,  2,./* Ax *
1430: 2f 20 20 20 20 32 2c 20 20 32 2c 20 20 32 2c 20  /    2,  2,  2, 
1440: 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20   2,  2,  2,  2, 
1450: 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20   2,  2,  2,  2, 
1460: 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20   2,  2,  2,  2, 
1470: 20 32 2c 0a 2f 2a 20 42 78 20 2a 2f 20 20 20 20   2,./* Bx */    
1480: 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20  2,  2,  2,  2,  
1490: 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20  2,  2,  2,  2,  
14a0: 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20  2,  2,  2,  2,  
14b0: 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 0a 2f  2,  2,  2,  2,./
14c0: 2a 20 43 78 20 2a 2f 20 20 20 20 32 2c 20 20 32  * Cx */    2,  2
14d0: 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32  ,  2,  2,  2,  2
14e0: 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32  ,  2,  2,  2,  2
14f0: 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32  ,  2,  2,  2,  2
1500: 2c 20 20 32 2c 20 20 32 2c 0a 2f 2a 20 44 78 20  ,  2,  2,./* Dx 
1510: 2a 2f 20 20 20 20 32 2c 20 20 32 2c 20 20 32 2c  */    2,  2,  2,
1520: 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c    2,  2,  2,  2,
1530: 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c    2,  2,  2,  2,
1540: 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c    2,  2,  2,  2,
1550: 20 20 32 2c 0a 2f 2a 20 45 78 20 2a 2f 20 20 20    2,./* Ex */   
1560: 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20   2,  2,  2,  2, 
1570: 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20   2,  2,  2,  2, 
1580: 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20   2,  2,  2,  2, 
1590: 20 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 0a   2,  2,  2,  2,.
15a0: 2f 2a 20 46 78 20 2a 2f 20 20 20 20 32 2c 20 20  /* Fx */    2,  
15b0: 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20  2,  2,  2,  2,  
15c0: 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20  2,  2,  2,  2,  
15d0: 32 2c 20 20 32 2c 20 20 32 2c 20 20 32 2c 20 20  2,  2,  2,  2,  
15e0: 32 2c 20 20 32 2c 20 20 32 0a 7d 3b 0a 0a 2f 2a  2,  2,  2.};../*
15f0: 20 41 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 70   An array to map
1600: 20 61 6c 6c 20 75 70 70 65 72 2d 63 61 73 65 20   all upper-case 
1610: 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20  characters into 
1620: 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
1630: 69 6e 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61 73  ing.** lower-cas
1640: 65 20 63 68 61 72 61 63 74 65 72 2e 20 0a 2a 2a  e character. .**
1650: 0a 2a 2a 20 53 51 4c 69 74 65 20 6f 6e 6c 79 20  .** SQLite only 
1660: 63 6f 6e 73 69 64 65 72 73 20 55 53 2d 41 53 43  considers US-ASC
1670: 49 49 20 28 6f 72 20 45 42 43 44 49 43 29 20 63  II (or EBCDIC) c
1680: 68 61 72 61 63 74 65 72 73 2e 20 20 57 65 20 64  haracters.  We d
1690: 6f 20 6e 6f 74 0a 2a 2a 20 68 61 6e 64 6c 65 20  o not.** handle 
16a0: 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73  case conversions
16b0: 20 66 6f 72 20 74 68 65 20 55 54 46 20 63 68 61   for the UTF cha
16c0: 72 61 63 74 65 72 20 73 65 74 20 73 69 6e 63 65  racter set since
16d0: 20 74 68 65 20 74 61 62 6c 65 73 0a 2a 2a 20 69   the tables.** i
16e0: 6e 76 6f 6c 76 65 64 20 61 72 65 20 6e 65 61 72  nvolved are near
16f0: 6c 79 20 61 73 20 62 69 67 20 6f 72 20 62 69 67  ly as big or big
1700: 67 65 72 20 74 68 61 6e 20 53 51 4c 69 74 65 20  ger than SQLite 
1710: 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69  itself..*/.stati
1720: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
1730: 20 63 68 61 72 20 73 71 6c 69 74 65 33 55 70 70   char sqlite3Upp
1740: 65 72 54 6f 4c 6f 77 65 72 5b 5d 20 3d 20 7b 0a  erToLower[] = {.
1750: 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 32 2c        0,  1,  2,
1760: 20 20 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 2c    3,  4,  5,  6,
1770: 20 20 37 2c 20 20 38 2c 20 20 39 2c 20 31 30 2c    7,  8,  9, 10,
1780: 20 31 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c   11, 12, 13, 14,
1790: 20 31 35 2c 20 31 36 2c 20 31 37 2c 0a 20 20 20   15, 16, 17,.   
17a0: 20 20 31 38 2c 20 31 39 2c 20 32 30 2c 20 32 31    18, 19, 20, 21
17b0: 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c 20 32 35  , 22, 23, 24, 25
17c0: 2c 20 32 36 2c 20 32 37 2c 20 32 38 2c 20 32 39  , 26, 27, 28, 29
17d0: 2c 20 33 30 2c 20 33 31 2c 20 33 32 2c 20 33 33  , 30, 31, 32, 33
17e0: 2c 20 33 34 2c 20 33 35 2c 0a 20 20 20 20 20 33  , 34, 35,.     3
17f0: 36 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34  6, 37, 38, 39, 4
1800: 30 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 34  0, 41, 42, 43, 4
1810: 34 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34  4, 45, 46, 47, 4
1820: 38 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 20 35  8, 49, 50, 51, 5
1830: 32 2c 20 35 33 2c 0a 20 20 20 20 20 35 34 2c 20  2, 53,.     54, 
1840: 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20  55, 56, 57, 58, 
1850: 35 39 2c 20 36 30 2c 20 36 31 2c 20 36 32 2c 20  59, 60, 61, 62, 
1860: 36 33 2c 20 36 34 2c 20 39 37 2c 20 39 38 2c 20  63, 64, 97, 98, 
1870: 39 39 2c 31 30 30 2c 31 30 31 2c 31 30 32 2c 31  99,100,101,102,1
1880: 30 33 2c 0a 20 20 20 20 31 30 34 2c 31 30 35 2c  03,.    104,105,
1890: 31 30 36 2c 31 30 37 2c 31 30 38 2c 31 30 39 2c  106,107,108,109,
18a0: 31 31 30 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c  110,111,112,113,
18b0: 31 31 34 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c  114,115,116,117,
18c0: 31 31 38 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c  118,119,120,121,
18d0: 0a 20 20 20 20 31 32 32 2c 20 39 31 2c 20 39 32  .    122, 91, 92
18e0: 2c 20 39 33 2c 20 39 34 2c 20 39 35 2c 20 39 36  , 93, 94, 95, 96
18f0: 2c 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30  , 97, 98, 99,100
1900: 2c 31 30 31 2c 31 30 32 2c 31 30 33 2c 31 30 34  ,101,102,103,104
1910: 2c 31 30 35 2c 31 30 36 2c 31 30 37 2c 0a 20 20  ,105,106,107,.  
1920: 20 20 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31    108,109,110,11
1930: 31 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31  1,112,113,114,11
1940: 35 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31  5,116,117,118,11
1950: 39 2c 31 32 30 2c 31 32 31 2c 31 32 32 2c 31 32  9,120,121,122,12
1960: 33 2c 31 32 34 2c 31 32 35 2c 0a 20 20 20 20 31  3,124,125,.    1
1970: 32 36 2c 31 32 37 2c 31 32 38 2c 31 32 39 2c 31  26,127,128,129,1
1980: 33 30 2c 31 33 31 2c 31 33 32 2c 31 33 33 2c 31  30,131,132,133,1
1990: 33 34 2c 31 33 35 2c 31 33 36 2c 31 33 37 2c 31  34,135,136,137,1
19a0: 33 38 2c 31 33 39 2c 31 34 30 2c 31 34 31 2c 31  38,139,140,141,1
19b0: 34 32 2c 31 34 33 2c 0a 20 20 20 20 31 34 34 2c  42,143,.    144,
19c0: 31 34 35 2c 31 34 36 2c 31 34 37 2c 31 34 38 2c  145,146,147,148,
19d0: 31 34 39 2c 31 35 30 2c 31 35 31 2c 31 35 32 2c  149,150,151,152,
19e0: 31 35 33 2c 31 35 34 2c 31 35 35 2c 31 35 36 2c  153,154,155,156,
19f0: 31 35 37 2c 31 35 38 2c 31 35 39 2c 31 36 30 2c  157,158,159,160,
1a00: 31 36 31 2c 0a 20 20 20 20 31 36 32 2c 31 36 33  161,.    162,163
1a10: 2c 31 36 34 2c 31 36 35 2c 31 36 36 2c 31 36 37  ,164,165,166,167
1a20: 2c 31 36 38 2c 31 36 39 2c 31 37 30 2c 31 37 31  ,168,169,170,171
1a30: 2c 31 37 32 2c 31 37 33 2c 31 37 34 2c 31 37 35  ,172,173,174,175
1a40: 2c 31 37 36 2c 31 37 37 2c 31 37 38 2c 31 37 39  ,176,177,178,179
1a50: 2c 0a 20 20 20 20 31 38 30 2c 31 38 31 2c 31 38  ,.    180,181,18
1a60: 32 2c 31 38 33 2c 31 38 34 2c 31 38 35 2c 31 38  2,183,184,185,18
1a70: 36 2c 31 38 37 2c 31 38 38 2c 31 38 39 2c 31 39  6,187,188,189,19
1a80: 30 2c 31 39 31 2c 31 39 32 2c 31 39 33 2c 31 39  0,191,192,193,19
1a90: 34 2c 31 39 35 2c 31 39 36 2c 31 39 37 2c 0a 20  4,195,196,197,. 
1aa0: 20 20 20 31 39 38 2c 31 39 39 2c 32 30 30 2c 32     198,199,200,2
1ab0: 30 31 2c 32 30 32 2c 32 30 33 2c 32 30 34 2c 32  01,202,203,204,2
1ac0: 30 35 2c 32 30 36 2c 32 30 37 2c 32 30 38 2c 32  05,206,207,208,2
1ad0: 30 39 2c 32 31 30 2c 32 31 31 2c 32 31 32 2c 32  09,210,211,212,2
1ae0: 31 33 2c 32 31 34 2c 32 31 35 2c 0a 20 20 20 20  13,214,215,.    
1af0: 32 31 36 2c 32 31 37 2c 32 31 38 2c 32 31 39 2c  216,217,218,219,
1b00: 32 32 30 2c 32 32 31 2c 32 32 32 2c 32 32 33 2c  220,221,222,223,
1b10: 32 32 34 2c 32 32 35 2c 32 32 36 2c 32 32 37 2c  224,225,226,227,
1b20: 32 32 38 2c 32 32 39 2c 32 33 30 2c 32 33 31 2c  228,229,230,231,
1b30: 32 33 32 2c 32 33 33 2c 0a 20 20 20 20 32 33 34  232,233,.    234
1b40: 2c 32 33 35 2c 32 33 36 2c 32 33 37 2c 32 33 38  ,235,236,237,238
1b50: 2c 32 33 39 2c 32 34 30 2c 32 34 31 2c 32 34 32  ,239,240,241,242
1b60: 2c 32 34 33 2c 32 34 34 2c 32 34 35 2c 32 34 36  ,243,244,245,246
1b70: 2c 32 34 37 2c 32 34 38 2c 32 34 39 2c 32 35 30  ,247,248,249,250
1b80: 2c 32 35 31 2c 0a 20 20 20 20 32 35 32 2c 32 35  ,251,.    252,25
1b90: 33 2c 32 35 34 2c 32 35 35 0a 7d 3b 0a 0a 2f 2a  3,254,255.};../*
1ba0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1bb0: 67 20 32 35 36 20 62 79 74 65 20 6c 6f 6f 6b 75  g 256 byte looku
1bc0: 70 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  p table is used 
1bd0: 74 6f 20 73 75 70 70 6f 72 74 20 53 51 4c 69 74  to support SQLit
1be0: 65 73 20 62 75 69 6c 74 2d 69 6e 0a 2a 2a 20 65  es built-in.** e
1bf0: 71 75 69 76 61 6c 65 6e 74 73 20 74 6f 20 74 68  quivalents to th
1c00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 6e  e following stan
1c10: 64 61 72 64 20 6c 69 62 72 61 72 79 20 66 75 6e  dard library fun
1c20: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ctions:.**.**   
1c30: 69 73 73 70 61 63 65 28 29 20 20 20 20 20 20 20  isspace()       
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 30 78 30 31 0a 2a 2a 20 20 20 69 73 61 6c 70   0x01.**   isalp
1c60: 68 61 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ha()            
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 32              0x02
1c80: 0a 2a 2a 20 20 20 69 73 64 69 67 69 74 28 29 20  .**   isdigit() 
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 30 78 30 34 0a 2a 2a 20 20         0x04.**  
1cb0: 20 69 73 61 6c 6e 75 6d 28 29 20 20 20 20 20 20   isalnum()      
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 30 78 30 36 0a 2a 2a 20 20 20 69 73 78 64    0x06.**   isxd
1ce0: 69 67 69 74 28 29 20 20 20 20 20 20 20 20 20 20  igit()          
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
1d00: 38 0a 2a 2a 20 20 20 74 6f 75 70 70 65 72 28 29  8.**   toupper()
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 20 20 20 20 30 78 32 30 0a 2a 2a 20          0x20.** 
1d30: 20 20 53 51 4c 69 74 65 20 69 64 65 6e 74 69 66    SQLite identif
1d40: 69 65 72 20 63 68 61 72 61 63 74 65 72 20 20 20  ier character   
1d50: 20 20 20 30 78 34 30 0a 2a 2a 20 20 20 51 75 6f     0x40.**   Quo
1d60: 74 65 20 63 68 61 72 61 63 74 65 72 20 20 20 20  te character    
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
1d80: 38 30 0a 2a 2a 0a 2a 2a 20 42 69 74 20 30 78 32  80.**.** Bit 0x2
1d90: 30 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  0 is set if the 
1da0: 6d 61 70 70 65 64 20 63 68 61 72 61 63 74 65 72  mapped character
1db0: 20 72 65 71 75 69 72 65 73 20 74 72 61 6e 73 6c   requires transl
1dc0: 61 74 69 6f 6e 20 74 6f 20 75 70 70 65 72 0a 2a  ation to upper.*
1dd0: 2a 20 63 61 73 65 2e 20 69 2e 65 2e 20 69 66 20  * case. i.e. if 
1de0: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 69 73  the character is
1df0: 20 61 20 6c 6f 77 65 72 2d 63 61 73 65 20 41 53   a lower-case AS
1e00: 43 49 49 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  CII character..*
1e10: 2a 20 49 66 20 78 20 69 73 20 61 20 6c 6f 77 65  * If x is a lowe
1e20: 72 2d 63 61 73 65 20 41 53 43 49 49 20 63 68 61  r-case ASCII cha
1e30: 72 61 63 74 65 72 2c 20 74 68 65 6e 20 69 74 73  racter, then its
1e40: 20 75 70 70 65 72 2d 63 61 73 65 20 65 71 75 69   upper-case equi
1e50: 76 61 6c 65 6e 74 0a 2a 2a 20 69 73 20 28 78 20  valent.** is (x 
1e60: 2d 20 30 78 32 30 29 2e 20 54 68 65 72 65 66 6f  - 0x20). Therefo
1e70: 72 65 20 74 6f 75 70 70 65 72 28 29 20 63 61 6e  re toupper() can
1e80: 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
1e90: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 78 20 26  as:.**.**   (x &
1ea0: 20 7e 28 6d 61 70 5b 78 5d 26 30 78 32 30 29 29   ~(map[x]&0x20))
1eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 71 75 69 76  .**.** The equiv
1ec0: 61 6c 65 6e 74 20 6f 66 20 74 6f 6c 6f 77 65 72  alent of tolower
1ed0: 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
1ee0: 64 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  d using the sqli
1ef0: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
1f00: 5d 0a 2a 2a 20 61 72 72 61 79 2e 20 74 6f 6c 6f  ].** array. tolo
1f10: 77 65 72 28 29 20 69 73 20 75 73 65 64 20 6d 6f  wer() is used mo
1f20: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 74 6f  re often than to
1f30: 75 70 70 65 72 28 29 20 62 79 20 53 51 4c 69 74  upper() by SQLit
1f40: 65 2e 0a 2a 2a 0a 2a 2a 20 42 69 74 20 30 78 34  e..**.** Bit 0x4
1f50: 30 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  0 is set if the 
1f60: 63 68 61 72 61 63 74 65 72 20 69 73 20 6e 6f 6e  character is non
1f70: 2d 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 61 6e  -alphanumeric an
1f80: 64 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  d can be used in
1f90: 20 61 6e 20 0a 2a 2a 20 53 51 4c 69 74 65 20 69   an .** SQLite i
1fa0: 64 65 6e 74 69 66 69 65 72 2e 20 20 49 64 65 6e  dentifier.  Iden
1fb0: 74 69 66 69 65 72 73 20 61 72 65 20 61 6c 70 68  tifiers are alph
1fc0: 61 6e 75 6d 65 72 69 63 73 2c 20 22 5f 22 2c 20  anumerics, "_", 
1fd0: 22 24 22 2c 20 61 6e 64 20 61 6e 79 0a 2a 2a 20  "$", and any.** 
1fe0: 6e 6f 6e 2d 41 53 43 49 49 20 55 54 46 20 63 68  non-ASCII UTF ch
1ff0: 61 72 61 63 74 65 72 2e 20 48 65 6e 63 65 20 74  aracter. Hence t
2000: 68 65 20 74 65 73 74 20 66 6f 72 20 77 68 65 74  he test for whet
2010: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 68 61  her or not a cha
2020: 72 61 63 74 65 72 20 69 73 0a 2a 2a 20 70 61 72  racter is.** par
2030: 74 20 6f 66 20 61 6e 20 69 64 65 6e 74 69 66 69  t of an identifi
2040: 65 72 20 69 73 20 30 78 34 36 2e 0a 2a 2f 0a 73  er is 0x46..*/.s
2050: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
2060: 67 6e 65 64 20 63 68 61 72 20 73 71 6c 69 74 65  gned char sqlite
2070: 33 43 74 79 70 65 4d 61 70 5b 32 35 36 5d 20 3d  3CtypeMap[256] =
2080: 20 7b 0a 20 20 30 78 30 30 2c 20 30 78 30 30 2c   {.  0x00, 0x00,
2090: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
20a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
20b0: 78 30 30 2c 20 20 2f 2a 20 30 30 2e 2e 30 37 20  x00,  /* 00..07 
20c0: 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0a 20     ........ */. 
20d0: 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30   0x00, 0x01, 0x0
20e0: 31 2c 20 30 78 30 31 2c 20 30 78 30 31 2c 20 30  1, 0x01, 0x01, 0
20f0: 78 30 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x01, 0x00, 0x00,
2100: 20 20 2f 2a 20 30 38 2e 2e 30 66 20 20 20 20 2e    /* 08..0f    .
2110: 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0a 20 20 30 78 30  ....... */.  0x0
2120: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
2130: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
2140: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 20 2f 2a   0x00, 0x00,  /*
2150: 20 31 30 2e 2e 31 37 20 20 20 20 2e 2e 2e 2e 2e   10..17    .....
2160: 2e 2e 2e 20 2a 2f 0a 20 20 30 78 30 30 2c 20 30  ... */.  0x00, 0
2170: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
2180: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
2190: 30 2c 20 30 78 30 30 2c 20 20 2f 2a 20 31 38 2e  0, 0x00,  /* 18.
21a0: 2e 31 66 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20  .1f    ........ 
21b0: 2a 2f 0a 20 20 30 78 30 31 2c 20 30 78 30 30 2c  */.  0x01, 0x00,
21c0: 20 30 78 38 30 2c 20 30 78 30 30 2c 20 30 78 34   0x80, 0x00, 0x4
21d0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
21e0: 78 38 30 2c 20 20 2f 2a 20 32 30 2e 2e 32 37 20  x80,  /* 20..27 
21f0: 20 20 20 20 21 22 23 24 25 26 27 20 2a 2f 0a 20      !"#$%&' */. 
2200: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
2210: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
2220: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
2230: 20 20 2f 2a 20 32 38 2e 2e 32 66 20 20 20 20 28    /* 28..2f    (
2240: 29 2a 2b 2c 2d 2e 2f 20 2a 2f 0a 20 20 30 78 30  )*+,-./ */.  0x0
2250: 63 2c 20 30 78 30 63 2c 20 30 78 30 63 2c 20 30  c, 0x0c, 0x0c, 0
2260: 78 30 63 2c 20 30 78 30 63 2c 20 30 78 30 63 2c  x0c, 0x0c, 0x0c,
2270: 20 30 78 30 63 2c 20 30 78 30 63 2c 20 20 2f 2a   0x0c, 0x0c,  /*
2280: 20 33 30 2e 2e 33 37 20 20 20 20 30 31 32 33 34   30..37    01234
2290: 35 36 37 20 2a 2f 0a 20 20 30 78 30 63 2c 20 30  567 */.  0x0c, 0
22a0: 78 30 63 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x0c, 0x00, 0x00,
22b0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
22c0: 30 2c 20 30 78 30 30 2c 20 20 2f 2a 20 33 38 2e  0, 0x00,  /* 38.
22d0: 2e 33 66 20 20 20 20 38 39 3a 3b 3c 3d 3e 3f 20  .3f    89:;<=>? 
22e0: 2a 2f 0a 0a 20 20 30 78 30 30 2c 20 30 78 30 61  */..  0x00, 0x0a
22f0: 2c 20 30 78 30 61 2c 20 30 78 30 61 2c 20 30 78  , 0x0a, 0x0a, 0x
2300: 30 61 2c 20 30 78 30 61 2c 20 30 78 30 61 2c 20  0a, 0x0a, 0x0a, 
2310: 30 78 30 32 2c 20 20 2f 2a 20 34 30 2e 2e 34 37  0x02,  /* 40..47
2320: 20 20 20 20 40 41 42 43 44 45 46 47 20 2a 2f 0a      @ABCDEFG */.
2330: 20 20 30 78 30 32 2c 20 30 78 30 32 2c 20 30 78    0x02, 0x02, 0x
2340: 30 32 2c 20 30 78 30 32 2c 20 30 78 30 32 2c 20  02, 0x02, 0x02, 
2350: 30 78 30 32 2c 20 30 78 30 32 2c 20 30 78 30 32  0x02, 0x02, 0x02
2360: 2c 20 20 2f 2a 20 34 38 2e 2e 34 66 20 20 20 20  ,  /* 48..4f    
2370: 48 49 4a 4b 4c 4d 4e 4f 20 2a 2f 0a 20 20 30 78  HIJKLMNO */.  0x
2380: 30 32 2c 20 30 78 30 32 2c 20 30 78 30 32 2c 20  02, 0x02, 0x02, 
2390: 30 78 30 32 2c 20 30 78 30 32 2c 20 30 78 30 32  0x02, 0x02, 0x02
23a0: 2c 20 30 78 30 32 2c 20 30 78 30 32 2c 20 20 2f  , 0x02, 0x02,  /
23b0: 2a 20 35 30 2e 2e 35 37 20 20 20 20 50 51 52 53  * 50..57    PQRS
23c0: 54 55 56 57 20 2a 2f 0a 20 20 30 78 30 32 2c 20  TUVW */.  0x02, 
23d0: 30 78 30 32 2c 20 30 78 30 32 2c 20 30 78 38 30  0x02, 0x02, 0x80
23e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
23f0: 30 30 2c 20 30 78 34 30 2c 20 20 2f 2a 20 35 38  00, 0x40,  /* 58
2400: 2e 2e 35 66 20 20 20 20 58 59 5a 5b 5c 5d 5e 5f  ..5f    XYZ[\]^_
2410: 20 2a 2f 0a 20 20 30 78 38 30 2c 20 30 78 32 61   */.  0x80, 0x2a
2420: 2c 20 30 78 32 61 2c 20 30 78 32 61 2c 20 30 78  , 0x2a, 0x2a, 0x
2430: 32 61 2c 20 30 78 32 61 2c 20 30 78 32 61 2c 20  2a, 0x2a, 0x2a, 
2440: 30 78 32 32 2c 20 20 2f 2a 20 36 30 2e 2e 36 37  0x22,  /* 60..67
2450: 20 20 20 20 60 61 62 63 64 65 66 67 20 2a 2f 0a      `abcdefg */.
2460: 20 20 30 78 32 32 2c 20 30 78 32 32 2c 20 30 78    0x22, 0x22, 0x
2470: 32 32 2c 20 30 78 32 32 2c 20 30 78 32 32 2c 20  22, 0x22, 0x22, 
2480: 30 78 32 32 2c 20 30 78 32 32 2c 20 30 78 32 32  0x22, 0x22, 0x22
2490: 2c 20 20 2f 2a 20 36 38 2e 2e 36 66 20 20 20 20  ,  /* 68..6f    
24a0: 68 69 6a 6b 6c 6d 6e 6f 20 2a 2f 0a 20 20 30 78  hijklmno */.  0x
24b0: 32 32 2c 20 30 78 32 32 2c 20 30 78 32 32 2c 20  22, 0x22, 0x22, 
24c0: 30 78 32 32 2c 20 30 78 32 32 2c 20 30 78 32 32  0x22, 0x22, 0x22
24d0: 2c 20 30 78 32 32 2c 20 30 78 32 32 2c 20 20 2f  , 0x22, 0x22,  /
24e0: 2a 20 37 30 2e 2e 37 37 20 20 20 20 70 71 72 73  * 70..77    pqrs
24f0: 74 75 76 77 20 2a 2f 0a 20 20 30 78 32 32 2c 20  tuvw */.  0x22, 
2500: 30 78 32 32 2c 20 30 78 32 32 2c 20 30 78 30 30  0x22, 0x22, 0x00
2510: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
2520: 30 30 2c 20 30 78 30 30 2c 20 20 2f 2a 20 37 38  00, 0x00,  /* 78
2530: 2e 2e 37 66 20 20 20 20 78 79 7a 7b 7c 7d 7e 2e  ..7f    xyz{|}~.
2540: 20 2a 2f 0a 0a 20 20 30 78 34 30 2c 20 30 78 34   */..  0x40, 0x4
2550: 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30  0, 0x40, 0x40, 0
2560: 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c  x40, 0x40, 0x40,
2570: 20 30 78 34 30 2c 20 20 2f 2a 20 38 30 2e 2e 38   0x40,  /* 80..8
2580: 37 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f  7    ........ */
2590: 0a 20 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30  .  0x40, 0x40, 0
25a0: 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c  x40, 0x40, 0x40,
25b0: 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34   0x40, 0x40, 0x4
25c0: 30 2c 20 20 2f 2a 20 38 38 2e 2e 38 66 20 20 20  0,  /* 88..8f   
25d0: 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0a 20 20 30   ........ */.  0
25e0: 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c  x40, 0x40, 0x40,
25f0: 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34   0x40, 0x40, 0x4
2600: 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 20  0, 0x40, 0x40,  
2610: 2f 2a 20 39 30 2e 2e 39 37 20 20 20 20 2e 2e 2e  /* 90..97    ...
2620: 2e 2e 2e 2e 2e 20 2a 2f 0a 20 20 30 78 34 30 2c  ..... */.  0x40,
2630: 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34   0x40, 0x40, 0x4
2640: 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30  0, 0x40, 0x40, 0
2650: 78 34 30 2c 20 30 78 34 30 2c 20 20 2f 2a 20 39  x40, 0x40,  /* 9
2660: 38 2e 2e 39 66 20 20 20 20 2e 2e 2e 2e 2e 2e 2e  8..9f    .......
2670: 2e 20 2a 2f 0a 20 20 30 78 34 30 2c 20 30 78 34  . */.  0x40, 0x4
2680: 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30  0, 0x40, 0x40, 0
2690: 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c  x40, 0x40, 0x40,
26a0: 20 30 78 34 30 2c 20 20 2f 2a 20 61 30 2e 2e 61   0x40,  /* a0..a
26b0: 37 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f  7    ........ */
26c0: 0a 20 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30  .  0x40, 0x40, 0
26d0: 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c  x40, 0x40, 0x40,
26e0: 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34   0x40, 0x40, 0x4
26f0: 30 2c 20 20 2f 2a 20 61 38 2e 2e 61 66 20 20 20  0,  /* a8..af   
2700: 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0a 20 20 30   ........ */.  0
2710: 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c  x40, 0x40, 0x40,
2720: 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34   0x40, 0x40, 0x4
2730: 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 20  0, 0x40, 0x40,  
2740: 2f 2a 20 62 30 2e 2e 62 37 20 20 20 20 2e 2e 2e  /* b0..b7    ...
2750: 2e 2e 2e 2e 2e 20 2a 2f 0a 20 20 30 78 34 30 2c  ..... */.  0x40,
2760: 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34   0x40, 0x40, 0x4
2770: 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30  0, 0x40, 0x40, 0
2780: 78 34 30 2c 20 30 78 34 30 2c 20 20 2f 2a 20 62  x40, 0x40,  /* b
2790: 38 2e 2e 62 66 20 20 20 20 2e 2e 2e 2e 2e 2e 2e  8..bf    .......
27a0: 2e 20 2a 2f 0a 0a 20 20 30 78 34 30 2c 20 30 78  . */..  0x40, 0x
27b0: 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20  40, 0x40, 0x40, 
27c0: 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30  0x40, 0x40, 0x40
27d0: 2c 20 30 78 34 30 2c 20 20 2f 2a 20 63 30 2e 2e  , 0x40,  /* c0..
27e0: 63 37 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a  c7    ........ *
27f0: 2f 0a 20 20 30 78 34 30 2c 20 30 78 34 30 2c 20  /.  0x40, 0x40, 
2800: 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30  0x40, 0x40, 0x40
2810: 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78  , 0x40, 0x40, 0x
2820: 34 30 2c 20 20 2f 2a 20 63 38 2e 2e 63 66 20 20  40,  /* c8..cf  
2830: 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0a 20 20    ........ */.  
2840: 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30  0x40, 0x40, 0x40
2850: 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78  , 0x40, 0x40, 0x
2860: 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20  40, 0x40, 0x40, 
2870: 20 2f 2a 20 64 30 2e 2e 64 37 20 20 20 20 2e 2e   /* d0..d7    ..
2880: 2e 2e 2e 2e 2e 2e 20 2a 2f 0a 20 20 30 78 34 30  ...... */.  0x40
2890: 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78  , 0x40, 0x40, 0x
28a0: 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20  40, 0x40, 0x40, 
28b0: 30 78 34 30 2c 20 30 78 34 30 2c 20 20 2f 2a 20  0x40, 0x40,  /* 
28c0: 64 38 2e 2e 64 66 20 20 20 20 2e 2e 2e 2e 2e 2e  d8..df    ......
28d0: 2e 2e 20 2a 2f 0a 20 20 30 78 34 30 2c 20 30 78  .. */.  0x40, 0x
28e0: 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20  40, 0x40, 0x40, 
28f0: 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30  0x40, 0x40, 0x40
2900: 2c 20 30 78 34 30 2c 20 20 2f 2a 20 65 30 2e 2e  , 0x40,  /* e0..
2910: 65 37 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a  e7    ........ *
2920: 2f 0a 20 20 30 78 34 30 2c 20 30 78 34 30 2c 20  /.  0x40, 0x40, 
2930: 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30  0x40, 0x40, 0x40
2940: 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78  , 0x40, 0x40, 0x
2950: 34 30 2c 20 20 2f 2a 20 65 38 2e 2e 65 66 20 20  40,  /* e8..ef  
2960: 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0a 20 20    ........ */.  
2970: 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30  0x40, 0x40, 0x40
2980: 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78  , 0x40, 0x40, 0x
2990: 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20  40, 0x40, 0x40, 
29a0: 20 2f 2a 20 66 30 2e 2e 66 37 20 20 20 20 2e 2e   /* f0..f7    ..
29b0: 2e 2e 2e 2e 2e 2e 20 2a 2f 0a 20 20 30 78 34 30  ...... */.  0x40
29c0: 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78  , 0x40, 0x40, 0x
29d0: 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20  40, 0x40, 0x40, 
29e0: 30 78 34 30 2c 20 30 78 34 30 20 20 20 2f 2a 20  0x40, 0x40   /* 
29f0: 66 38 2e 2e 66 66 20 20 20 20 2e 2e 2e 2e 2e 2e  f8..ff    ......
2a00: 2e 2e 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  .. */.};.#define
2a10: 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28   sqlite3Toupper(
2a20: 78 29 20 20 20 28 28 78 29 26 7e 28 73 71 6c 69  x)   ((x)&~(sqli
2a30: 74 65 33 43 74 79 70 65 4d 61 70 5b 28 75 6e 73  te3CtypeMap[(uns
2a40: 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 5d 26  igned char)(x)]&
2a50: 30 78 32 30 29 29 0a 23 64 65 66 69 6e 65 20 73  0x20)).#define s
2a60: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 78 29  qlite3Isspace(x)
2a70: 20 20 20 28 73 71 6c 69 74 65 33 43 74 79 70 65     (sqlite3Ctype
2a80: 4d 61 70 5b 28 75 6e 73 69 67 6e 65 64 20 63 68  Map[(unsigned ch
2a90: 61 72 29 28 78 29 5d 26 30 78 30 31 29 0a 23 64  ar)(x)]&0x01).#d
2aa0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 49 73 61  efine sqlite3Isa
2ab0: 6c 6e 75 6d 28 78 29 20 20 20 28 73 71 6c 69 74  lnum(x)   (sqlit
2ac0: 65 33 43 74 79 70 65 4d 61 70 5b 28 75 6e 73 69  e3CtypeMap[(unsi
2ad0: 67 6e 65 64 20 63 68 61 72 29 28 78 29 5d 26 30  gned char)(x)]&0
2ae0: 78 30 36 29 0a 23 64 65 66 69 6e 65 20 73 71 6c  x06).#define sql
2af0: 69 74 65 33 49 73 61 6c 70 68 61 28 78 29 20 20  ite3Isalpha(x)  
2b00: 20 28 73 71 6c 69 74 65 33 43 74 79 70 65 4d 61   (sqlite3CtypeMa
2b10: 70 5b 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  p[(unsigned char
2b20: 29 28 78 29 5d 26 30 78 30 32 29 0a 23 64 65 66  )(x)]&0x02).#def
2b30: 69 6e 65 20 73 71 6c 69 74 65 33 49 73 64 69 67  ine sqlite3Isdig
2b40: 69 74 28 78 29 20 20 20 28 73 71 6c 69 74 65 33  it(x)   (sqlite3
2b50: 43 74 79 70 65 4d 61 70 5b 28 75 6e 73 69 67 6e  CtypeMap[(unsign
2b60: 65 64 20 63 68 61 72 29 28 78 29 5d 26 30 78 30  ed char)(x)]&0x0
2b70: 34 29 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  4).#define sqlit
2b80: 65 33 49 73 78 64 69 67 69 74 28 78 29 20 20 28  e3Isxdigit(x)  (
2b90: 73 71 6c 69 74 65 33 43 74 79 70 65 4d 61 70 5b  sqlite3CtypeMap[
2ba0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28  (unsigned char)(
2bb0: 78 29 5d 26 30 78 30 38 29 0a 23 64 65 66 69 6e  x)]&0x08).#defin
2bc0: 65 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72  e sqlite3Tolower
2bd0: 28 78 29 20 20 20 28 73 71 6c 69 74 65 33 55 70  (x)   (sqlite3Up
2be0: 70 65 72 54 6f 4c 6f 77 65 72 5b 28 75 6e 73 69  perToLower[(unsi
2bf0: 67 6e 65 64 20 63 68 61 72 29 28 78 29 5d 29 0a  gned char)(x)]).
2c00: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 49  #define sqlite3I
2c10: 73 71 75 6f 74 65 28 78 29 20 20 20 28 73 71 6c  squote(x)   (sql
2c20: 69 74 65 33 43 74 79 70 65 4d 61 70 5b 28 75 6e  ite3CtypeMap[(un
2c30: 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 5d  signed char)(x)]
2c40: 26 30 78 38 30 29 0a 0a 0a 2f 2a 0a 2a 2a 20 49  &0x80).../*.** I
2c50: 66 20 58 20 69 73 20 61 20 63 68 61 72 61 63 74  f X is a charact
2c60: 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  er that can be u
2c70: 73 65 64 20 69 6e 20 61 6e 20 69 64 65 6e 74 69  sed in an identi
2c80: 66 69 65 72 20 74 68 65 6e 0a 2a 2a 20 49 64 43  fier then.** IdC
2c90: 68 61 72 28 58 29 20 77 69 6c 6c 20 62 65 20 74  har(X) will be t
2ca0: 72 75 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  rue.  Otherwise 
2cb0: 69 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  it is false..**.
2cc0: 2a 2a 20 46 6f 72 20 41 53 43 49 49 2c 20 61 6e  ** For ASCII, an
2cd0: 79 20 63 68 61 72 61 63 74 65 72 20 77 69 74 68  y character with
2ce0: 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20   the high-order 
2cf0: 62 69 74 20 73 65 74 20 69 73 0a 2a 2a 20 61 6c  bit set is.** al
2d00: 6c 6f 77 65 64 20 69 6e 20 61 6e 20 69 64 65 6e  lowed in an iden
2d10: 74 69 66 69 65 72 2e 20 20 46 6f 72 20 37 2d 62  tifier.  For 7-b
2d20: 69 74 20 63 68 61 72 61 63 74 65 72 73 2c 20 0a  it characters, .
2d30: 2a 2a 20 73 71 6c 69 74 65 33 49 73 49 64 43 68  ** sqlite3IsIdCh
2d40: 61 72 5b 58 5d 20 6d 75 73 74 20 62 65 20 31 2e  ar[X] must be 1.
2d50: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 45 42 43 44 49  .**.** For EBCDI
2d60: 43 2c 20 74 68 65 20 72 75 6c 65 73 20 61 72 65  C, the rules are
2d70: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 62 75   more complex bu
2d80: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a  t have the same.
2d90: 2a 2a 20 65 6e 64 20 72 65 73 75 6c 74 2e 0a 2a  ** end result..*
2da0: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 30 36  *.** Ticket #106
2db0: 36 2e 20 20 74 68 65 20 53 51 4c 20 73 74 61 6e  6.  the SQL stan
2dc0: 64 61 72 64 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dard does not al
2dd0: 6c 6f 77 20 27 24 27 20 69 6e 20 74 68 65 0a 2a  low '$' in the.*
2de0: 2a 20 6d 69 64 64 6c 65 20 6f 66 20 69 64 65 6e  * middle of iden
2df0: 74 69 66 69 65 72 73 2e 20 20 42 75 74 20 6d 61  tifiers.  But ma
2e00: 6e 79 20 53 51 4c 20 69 6d 70 6c 65 6d 65 6e 74  ny SQL implement
2e10: 61 74 69 6f 6e 73 20 64 6f 2e 20 0a 2a 2a 20 53  ations do. .** S
2e20: 51 4c 69 74 65 20 77 69 6c 6c 20 61 6c 6c 6f 77  QLite will allow
2e30: 20 27 24 27 20 69 6e 20 69 64 65 6e 74 69 66 69   '$' in identifi
2e40: 65 72 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62  ers for compatib
2e50: 69 6c 69 74 79 2e 0a 2a 2a 20 42 75 74 20 74 68  ility..** But th
2e60: 65 20 66 65 61 74 75 72 65 20 69 73 20 75 6e 64  e feature is und
2e70: 6f 63 75 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 23 64  ocumented..*/.#d
2e80: 65 66 69 6e 65 20 49 64 43 68 61 72 28 43 29 20  efine IdChar(C) 
2e90: 20 28 28 73 71 6c 69 74 65 33 43 74 79 70 65 4d   ((sqlite3CtypeM
2ea0: 61 70 5b 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ap[(unsigned cha
2eb0: 72 29 43 5d 26 30 78 34 36 29 21 3d 30 29 0a 0a  r)C]&0x46)!=0)..
2ec0: 2f 2a 0a 2a 2a 20 49 67 6e 6f 72 65 20 74 65 73  /*.** Ignore tes
2ed0: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 0a 2a  tcase() macros.*
2ee0: 2f 0a 23 64 65 66 69 6e 65 20 74 65 73 74 63 61  /.#define testca
2ef0: 73 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b  se(X)../*.** Tok
2f00: 65 6e 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65  en values.*/.#de
2f10: 66 69 6e 65 20 54 4b 5f 53 50 41 43 45 20 20 20  fine TK_SPACE   
2f20: 20 30 0a 23 64 65 66 69 6e 65 20 54 4b 5f 4e 41   0.#define TK_NA
2f30: 4d 45 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65  ME     1.#define
2f40: 20 54 4b 5f 4c 49 54 45 52 41 4c 20 20 32 0a 23   TK_LITERAL  2.#
2f50: 64 65 66 69 6e 65 20 54 4b 5f 50 55 4e 43 54 20  define TK_PUNCT 
2f60: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 54 4b 5f     3.#define TK_
2f70: 45 52 52 4f 52 20 20 20 20 34 0a 0a 23 64 65 66  ERROR    4..#def
2f80: 69 6e 65 20 54 4b 5f 4d 49 4e 55 53 20 20 20 20  ine TK_MINUS    
2f90: 54 4b 5f 50 55 4e 43 54 0a 23 64 65 66 69 6e 65  TK_PUNCT.#define
2fa0: 20 54 4b 5f 4c 50 20 20 20 20 20 20 20 54 4b 5f   TK_LP       TK_
2fb0: 50 55 4e 43 54 0a 23 64 65 66 69 6e 65 20 54 4b  PUNCT.#define TK
2fc0: 5f 52 50 20 20 20 20 20 20 20 54 4b 5f 50 55 4e  _RP       TK_PUN
2fd0: 43 54 0a 23 64 65 66 69 6e 65 20 54 4b 5f 53 45  CT.#define TK_SE
2fe0: 4d 49 20 20 20 20 20 54 4b 5f 50 55 4e 43 54 0a  MI     TK_PUNCT.
2ff0: 23 64 65 66 69 6e 65 20 54 4b 5f 50 4c 55 53 20  #define TK_PLUS 
3000: 20 20 20 20 54 4b 5f 50 55 4e 43 54 0a 23 64 65      TK_PUNCT.#de
3010: 66 69 6e 65 20 54 4b 5f 53 54 41 52 20 20 20 20  fine TK_STAR    
3020: 20 54 4b 5f 50 55 4e 43 54 0a 23 64 65 66 69 6e   TK_PUNCT.#defin
3030: 65 20 54 4b 5f 53 4c 41 53 48 20 20 20 20 54 4b  e TK_SLASH    TK
3040: 5f 50 55 4e 43 54 0a 23 64 65 66 69 6e 65 20 54  _PUNCT.#define T
3050: 4b 5f 52 45 4d 20 20 20 20 20 20 54 4b 5f 50 55  K_REM      TK_PU
3060: 4e 43 54 0a 23 64 65 66 69 6e 65 20 54 4b 5f 45  NCT.#define TK_E
3070: 51 20 20 20 20 20 20 20 54 4b 5f 50 55 4e 43 54  Q       TK_PUNCT
3080: 0a 23 64 65 66 69 6e 65 20 54 4b 5f 4c 45 20 20  .#define TK_LE  
3090: 20 20 20 20 20 54 4b 5f 50 55 4e 43 54 0a 23 64       TK_PUNCT.#d
30a0: 65 66 69 6e 65 20 54 4b 5f 4e 45 20 20 20 20 20  efine TK_NE     
30b0: 20 20 54 4b 5f 50 55 4e 43 54 0a 23 64 65 66 69    TK_PUNCT.#defi
30c0: 6e 65 20 54 4b 5f 4c 53 48 49 46 54 20 20 20 54  ne TK_LSHIFT   T
30d0: 4b 5f 50 55 4e 43 54 0a 23 64 65 66 69 6e 65 20  K_PUNCT.#define 
30e0: 54 4b 5f 4c 54 20 20 20 20 20 20 20 54 4b 5f 50  TK_LT       TK_P
30f0: 55 4e 43 54 0a 23 64 65 66 69 6e 65 20 54 4b 5f  UNCT.#define TK_
3100: 47 45 20 20 20 20 20 20 20 54 4b 5f 50 55 4e 43  GE       TK_PUNC
3110: 54 0a 23 64 65 66 69 6e 65 20 54 4b 5f 52 53 48  T.#define TK_RSH
3120: 49 46 54 20 20 20 54 4b 5f 50 55 4e 43 54 0a 23  IFT   TK_PUNCT.#
3130: 64 65 66 69 6e 65 20 54 4b 5f 47 54 20 20 20 20  define TK_GT    
3140: 20 20 20 54 4b 5f 50 55 4e 43 54 0a 23 64 65 66     TK_PUNCT.#def
3150: 69 6e 65 20 54 4b 5f 47 45 20 20 20 20 20 20 20  ine TK_GE       
3160: 54 4b 5f 50 55 4e 43 54 0a 23 64 65 66 69 6e 65  TK_PUNCT.#define
3170: 20 54 4b 5f 42 49 54 4f 52 20 20 20 20 54 4b 5f   TK_BITOR    TK_
3180: 50 55 4e 43 54 0a 23 64 65 66 69 6e 65 20 54 4b  PUNCT.#define TK
3190: 5f 43 4f 4e 43 41 54 20 20 20 54 4b 5f 50 55 4e  _CONCAT   TK_PUN
31a0: 43 54 0a 23 64 65 66 69 6e 65 20 54 4b 5f 43 4f  CT.#define TK_CO
31b0: 4d 4d 41 20 20 20 20 54 4b 5f 50 55 4e 43 54 0a  MMA    TK_PUNCT.
31c0: 23 64 65 66 69 6e 65 20 54 4b 5f 42 49 54 41 4e  #define TK_BITAN
31d0: 44 20 20 20 54 4b 5f 50 55 4e 43 54 0a 23 64 65  D   TK_PUNCT.#de
31e0: 66 69 6e 65 20 54 4b 5f 42 49 54 4e 4f 54 20 20  fine TK_BITNOT  
31f0: 20 54 4b 5f 50 55 4e 43 54 0a 23 64 65 66 69 6e   TK_PUNCT.#defin
3200: 65 20 54 4b 5f 53 54 52 49 4e 47 20 20 20 54 4b  e TK_STRING   TK
3210: 5f 4c 49 54 45 52 41 4c 0a 23 64 65 66 69 6e 65  _LITERAL.#define
3220: 20 54 4b 5f 49 44 20 20 20 20 20 20 20 54 4b 5f   TK_ID       TK_
3230: 4e 41 4d 45 0a 23 64 65 66 69 6e 65 20 54 4b 5f  NAME.#define TK_
3240: 49 4c 4c 45 47 41 4c 20 20 54 4b 5f 45 52 52 4f  ILLEGAL  TK_ERRO
3250: 52 0a 23 64 65 66 69 6e 65 20 54 4b 5f 44 4f 54  R.#define TK_DOT
3260: 20 20 20 20 20 20 54 4b 5f 50 55 4e 43 54 0a 23        TK_PUNCT.#
3270: 64 65 66 69 6e 65 20 54 4b 5f 49 4e 54 45 47 45  define TK_INTEGE
3280: 52 20 20 54 4b 5f 4c 49 54 45 52 41 4c 0a 23 64  R  TK_LITERAL.#d
3290: 65 66 69 6e 65 20 54 4b 5f 46 4c 4f 41 54 20 20  efine TK_FLOAT  
32a0: 20 20 54 4b 5f 4c 49 54 45 52 41 4c 0a 23 64 65    TK_LITERAL.#de
32b0: 66 69 6e 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  fine TK_VARIABLE
32c0: 20 54 4b 5f 4c 49 54 45 52 41 4c 0a 23 64 65 66   TK_LITERAL.#def
32d0: 69 6e 65 20 54 4b 5f 42 4c 4f 42 20 20 20 20 20  ine TK_BLOB     
32e0: 54 4b 5f 4c 49 54 45 52 41 4c 0a 0a 2f 2a 0a 2a  TK_LITERAL../*.*
32f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
3300: 67 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 6f  gth (in bytes) o
3310: 66 20 74 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  f the token that
3320: 20 62 65 67 69 6e 73 20 61 74 20 7a 5b 30 5d 2e   begins at z[0].
3330: 20 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 74   .** Store the t
3340: 6f 6b 65 6e 20 74 79 70 65 20 69 6e 20 2a 74 6f  oken type in *to
3350: 6b 65 6e 54 79 70 65 20 62 65 66 6f 72 65 20 72  kenType before r
3360: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
3370: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 47  tic int sqlite3G
3380: 65 74 54 6f 6b 65 6e 28 63 6f 6e 73 74 20 75 6e  etToken(const un
3390: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20  signed char *z, 
33a0: 69 6e 74 20 2a 74 6f 6b 65 6e 54 79 70 65 29 7b  int *tokenType){
33b0: 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20 73  .  int i, c;.  s
33c0: 77 69 74 63 68 28 20 61 69 43 6c 61 73 73 5b 2a  witch( aiClass[*
33d0: 7a 5d 20 29 7b 20 20 2f 2a 20 53 77 69 74 63 68  z] ){  /* Switch
33e0: 20 6f 6e 20 74 68 65 20 63 68 61 72 61 63 74 65   on the characte
33f0: 72 2d 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66  r-class of the f
3400: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 20 20  irst byte.      
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 6f      ** of the to
3430: 6b 65 6e 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  ken. See the com
3440: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 43 43 5f 20  ment on the CC_ 
3450: 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 20 20  defines.        
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 2a 2a 20 61 62 6f 76 65 2e 20 2a 2f 0a 20    ** above. */. 
3480: 20 20 20 63 61 73 65 20 43 43 5f 53 50 41 43 45     case CC_SPACE
3490: 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  : {.      for(i=
34a0: 31 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  1; sqlite3Isspac
34b0: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
34c0: 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65        *tokenType
34d0: 20 3d 20 54 4b 5f 53 50 41 43 45 3b 0a 20 20 20   = TK_SPACE;.   
34e0: 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20     return i;.   
34f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 43 43 5f 4d   }.    case CC_M
3500: 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 66  INUS: {.      if
3510: 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[1]=='-' ){. 
3520: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 32 3b 20         for(i=2; 
3530: 28 63 3d 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63  (c=z[i])!=0 && c
3540: 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\n'; i++){}. 
3550: 20 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70         *tokenTyp
3560: 65 20 3d 20 54 4b 5f 53 50 41 43 45 3b 0a 20 20  e = TK_SPACE;.  
3570: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
3580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 74        }.      *t
3590: 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 4d 49  okenType = TK_MI
35a0: 4e 55 53 3b 0a 20 20 20 20 20 20 72 65 74 75 72  NUS;.      retur
35b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
35c0: 61 73 65 20 43 43 5f 4c 50 3a 20 7b 0a 20 20 20  ase CC_LP: {.   
35d0: 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20 3d 20     *tokenType = 
35e0: 54 4b 5f 4c 50 3b 0a 20 20 20 20 20 20 72 65 74  TK_LP;.      ret
35f0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
3600: 20 63 61 73 65 20 43 43 5f 52 50 3a 20 7b 0a 20   case CC_RP: {. 
3610: 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20       *tokenType 
3620: 3d 20 54 4b 5f 52 50 3b 0a 20 20 20 20 20 20 72  = TK_RP;.      r
3630: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
3640: 20 20 20 63 61 73 65 20 43 43 5f 53 45 4d 49 3a     case CC_SEMI:
3650: 20 7b 0a 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54   {.      *tokenT
3660: 79 70 65 20 3d 20 54 4b 5f 53 45 4d 49 3b 0a 20  ype = TK_SEMI;. 
3670: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3680: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43 43     }.    case CC
3690: 5f 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 2a  _PLUS: {.      *
36a0: 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 50  tokenType = TK_P
36b0: 4c 55 53 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LUS;.      retur
36c0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
36d0: 61 73 65 20 43 43 5f 53 54 41 52 3a 20 7b 0a 20  ase CC_STAR: {. 
36e0: 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20       *tokenType 
36f0: 3d 20 54 4b 5f 53 54 41 52 3b 0a 20 20 20 20 20  = TK_STAR;.     
3700: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3710: 0a 20 20 20 20 63 61 73 65 20 43 43 5f 53 4c 41  .    case CC_SLA
3720: 53 48 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  SH: {.      if( 
3730: 7a 5b 31 5d 21 3d 27 2a 27 20 7c 7c 20 7a 5b 32  z[1]!='*' || z[2
3740: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
3750: 2a 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f  *tokenType = TK_
3760: 53 4c 41 53 48 3b 0a 20 20 20 20 20 20 20 20 72  SLASH;.        r
3770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3780: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 33 2c 20  .      for(i=3, 
3790: 63 3d 7a 5b 32 5d 3b 20 28 63 21 3d 27 2a 27 20  c=z[2]; (c!='*' 
37a0: 7c 7c 20 7a 5b 69 5d 21 3d 27 2f 27 29 20 26 26  || z[i]!='/') &&
37b0: 20 28 63 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b   (c=z[i])!=0; i+
37c0: 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 63  +){}.      if( c
37d0: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 2a 74   ) i++;.      *t
37e0: 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 53 50  okenType = TK_SP
37f0: 41 43 45 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ACE;.      retur
3800: 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n i;.    }.    c
3810: 61 73 65 20 43 43 5f 50 45 52 43 45 4e 54 3a 20  ase CC_PERCENT: 
3820: 7b 0a 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79  {.      *tokenTy
3830: 70 65 20 3d 20 54 4b 5f 52 45 4d 3b 0a 20 20 20  pe = TK_REM;.   
3840: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3850: 20 7d 0a 20 20 20 20 63 61 73 65 20 43 43 5f 45   }.    case CC_E
3860: 51 3a 20 7b 0a 20 20 20 20 20 20 2a 74 6f 6b 65  Q: {.      *toke
3870: 6e 54 79 70 65 20 3d 20 54 4b 5f 45 51 3b 0a 20  nType = TK_EQ;. 
3880: 20 20 20 20 20 72 65 74 75 72 6e 20 31 20 2b 20       return 1 + 
3890: 28 7a 5b 31 5d 3d 3d 27 3d 27 29 3b 0a 20 20 20  (z[1]=='=');.   
38a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 43 43 5f 4c   }.    case CC_L
38b0: 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28  T: {.      if( (
38c0: 63 3d 7a 5b 31 5d 29 3d 3d 27 3d 27 20 29 7b 0a  c=z[1])=='=' ){.
38d0: 20 20 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79          *tokenTy
38e0: 70 65 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20  pe = TK_LE;.    
38f0: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
3900: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
3910: 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='>' ){.        
3920: 2a 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f  *tokenType = TK_
3930: 4e 45 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  NE;.        retu
3940: 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 2;.      }els
3950: 65 20 69 66 28 20 63 3d 3d 27 3c 27 20 29 7b 0a  e if( c=='<' ){.
3960: 20 20 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79          *tokenTy
3970: 70 65 20 3d 20 54 4b 5f 4c 53 48 49 46 54 3b 0a  pe = TK_LSHIFT;.
3980: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
3990: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
39a0: 20 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70         *tokenTyp
39b0: 65 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 20 20 20  e = TK_LT;.     
39c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
39d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
39e0: 61 73 65 20 43 43 5f 47 54 3a 20 7b 0a 20 20 20  ase CC_GT: {.   
39f0: 20 20 20 69 66 28 20 28 63 3d 7a 5b 31 5d 29 3d     if( (c=z[1])=
3a00: 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='=' ){.        
3a10: 2a 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f  *tokenType = TK_
3a20: 47 45 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  GE;.        retu
3a30: 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 2;.      }els
3a40: 65 20 69 66 28 20 63 3d 3d 27 3e 27 20 29 7b 0a  e if( c=='>' ){.
3a50: 20 20 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79          *tokenTy
3a60: 70 65 20 3d 20 54 4b 5f 52 53 48 49 46 54 3b 0a  pe = TK_RSHIFT;.
3a70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
3a80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3a90: 20 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70         *tokenTyp
3aa0: 65 20 3d 20 54 4b 5f 47 54 3b 0a 20 20 20 20 20  e = TK_GT;.     
3ab0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3ac0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
3ad0: 61 73 65 20 43 43 5f 42 41 4e 47 3a 20 7b 0a 20  ase CC_BANG: {. 
3ae0: 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d 27       if( z[1]!='
3af0: 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 74  =' ){.        *t
3b00: 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 49 4c  okenType = TK_IL
3b10: 4c 45 47 41 4c 3b 0a 20 20 20 20 20 20 20 20 72  LEGAL;.        r
3b20: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3b30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 74  else{.        *t
3b40: 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 4e 45  okenType = TK_NE
3b50: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3b60: 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   2;.      }.    
3b70: 7d 0a 20 20 20 20 63 61 73 65 20 43 43 5f 50 49  }.    case CC_PI
3b80: 50 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  PE: {.      if( 
3b90: 7a 5b 31 5d 21 3d 27 7c 27 20 29 7b 0a 20 20 20  z[1]!='|' ){.   
3ba0: 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20       *tokenType 
3bb0: 3d 20 54 4b 5f 42 49 54 4f 52 3b 0a 20 20 20 20  = TK_BITOR;.    
3bc0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3bd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3be0: 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20 3d 20     *tokenType = 
3bf0: 54 4b 5f 43 4f 4e 43 41 54 3b 0a 20 20 20 20 20  TK_CONCAT;.     
3c00: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
3c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
3c20: 61 73 65 20 43 43 5f 43 4f 4d 4d 41 3a 20 7b 0a  ase CC_COMMA: {.
3c30: 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65        *tokenType
3c40: 20 3d 20 54 4b 5f 43 4f 4d 4d 41 3b 0a 20 20 20   = TK_COMMA;.   
3c50: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3c60: 20 7d 0a 20 20 20 20 63 61 73 65 20 43 43 5f 41   }.    case CC_A
3c70: 4e 44 3a 20 7b 0a 20 20 20 20 20 20 2a 74 6f 6b  ND: {.      *tok
3c80: 65 6e 54 79 70 65 20 3d 20 54 4b 5f 42 49 54 41  enType = TK_BITA
3c90: 4e 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ND;.      return
3ca0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
3cb0: 73 65 20 43 43 5f 54 49 4c 44 41 3a 20 7b 0a 20  se CC_TILDA: {. 
3cc0: 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20       *tokenType 
3cd0: 3d 20 54 4b 5f 42 49 54 4e 4f 54 3b 0a 20 20 20  = TK_BITNOT;.   
3ce0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3cf0: 20 7d 0a 20 20 20 20 63 61 73 65 20 43 43 5f 51   }.    case CC_Q
3d00: 55 4f 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  UOTE: {.      in
3d10: 74 20 64 65 6c 69 6d 20 3d 20 7a 5b 30 5d 3b 0a  t delim = z[0];.
3d20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
3d30: 64 65 6c 69 6d 3d 3d 27 60 27 20 29 3b 0a 20 20  delim=='`' );.  
3d40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 65      testcase( de
3d50: 6c 69 6d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  lim=='\'' );.   
3d60: 20 20 20 74 65 73 74 63 61 73 65 28 20 64 65 6c     testcase( del
3d70: 69 6d 3d 3d 27 22 27 20 29 3b 0a 20 20 20 20 20  im=='"' );.     
3d80: 20 66 6f 72 28 69 3d 31 3b 20 28 63 3d 7a 5b 69   for(i=1; (c=z[i
3d90: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
3da0: 20 20 20 20 20 69 66 28 20 63 3d 3d 64 65 6c 69       if( c==deli
3db0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  m ){.          i
3dc0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 64 65 6c 69 6d  f( z[i+1]==delim
3dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3de0: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i++;.          }
3df0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3e00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3e10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
3e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3e30: 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
3e40: 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20 3d      *tokenType =
3e50: 20 54 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20   TK_STRING;.    
3e60: 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a      return i+1;.
3e70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3e80: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
3e90: 2a 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f  *tokenType = TK_
3ea0: 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
3eb0: 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 65  rn i+1;.      }e
3ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 74 6f  lse{.        *to
3ed0: 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 49 4c 4c  kenType = TK_ILL
3ee0: 45 47 41 4c 3b 0a 20 20 20 20 20 20 20 20 72 65  EGAL;.        re
3ef0: 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a  turn i;.      }.
3f00: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43      }.    case C
3f10: 43 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 69  C_DOT: {.      i
3f20: 66 28 20 21 73 71 6c 69 74 65 33 49 73 64 69 67  f( !sqlite3Isdig
3f30: 69 74 28 7a 5b 31 5d 29 20 29 7b 0a 20 20 20 20  it(z[1]) ){.    
3f40: 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20 3d      *tokenType =
3f50: 20 54 4b 5f 44 4f 54 3b 0a 20 20 20 20 20 20 20   TK_DOT;.       
3f60: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3f70: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   }.      /* If t
3f80: 68 65 20 6e 65 78 74 20 63 68 61 72 61 63 74 65  he next characte
3f90: 72 20 69 73 20 61 20 64 69 67 69 74 2c 20 74 68  r is a digit, th
3fa0: 69 73 20 69 73 20 61 20 66 6c 6f 61 74 69 6e 67  is is a floating
3fb0: 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
3fc0: 6e 75 6d 62 65 72 20 74 68 61 74 20 62 65 67 69  number that begi
3fd0: 6e 73 20 77 69 74 68 20 22 2e 22 2e 20 20 46 61  ns with ".".  Fa
3fe0: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
3ff0: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
4000: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43 43 5f    }.    case CC_
4010: 44 49 47 49 54 3a 20 7b 0a 20 20 20 20 20 20 2a  DIGIT: {.      *
4020: 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 49  tokenType = TK_I
4030: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 69 66  NTEGER;.      if
4040: 28 20 7a 5b 30 5d 3d 3d 27 30 27 20 26 26 20 28  ( z[0]=='0' && (
4050: 7a 5b 31 5d 3d 3d 27 78 27 20 7c 7c 20 7a 5b 31  z[1]=='x' || z[1
4060: 5d 3d 3d 27 58 27 29 20 26 26 20 73 71 6c 69 74  ]=='X') && sqlit
4070: 65 33 49 73 78 64 69 67 69 74 28 7a 5b 32 5d 29  e3Isxdigit(z[2])
4080: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
4090: 69 3d 33 3b 20 73 71 6c 69 74 65 33 49 73 78 64  i=3; sqlite3Isxd
40a0: 69 67 69 74 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  igit(z[i]); i++)
40b0: 7b 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {}.        retur
40c0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
40d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
40e0: 74 65 33 49 73 64 69 67 69 74 28 7a 5b 69 5d 29  te3Isdigit(z[i])
40f0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69  ; i++){}.      i
4100: 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20 29 7b 0a  f( z[i]=='.' ){.
4110: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
4120: 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
4130: 74 65 33 49 73 64 69 67 69 74 28 7a 5b 69 5d 29  te3Isdigit(z[i])
4140: 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ i++; }.     
4150: 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20 3d 20     *tokenType = 
4160: 54 4b 5f 46 4c 4f 41 54 3b 0a 20 20 20 20 20 20  TK_FLOAT;.      
4170: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 7a 5b 69  }.      if( (z[i
4180: 5d 3d 3d 27 65 27 20 7c 7c 20 7a 5b 69 5d 3d 3d  ]=='e' || z[i]==
4190: 27 45 27 29 20 26 26 0a 20 20 20 20 20 20 20 20  'E') &&.        
41a0: 20 20 20 28 20 73 71 6c 69 74 65 33 49 73 64 69     ( sqlite3Isdi
41b0: 67 69 74 28 7a 5b 69 2b 31 5d 29 20 0a 20 20 20  git(z[i+1]) .   
41c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 7a 5b           || ((z[
41d0: 69 2b 31 5d 3d 3d 27 2b 27 20 7c 7c 20 7a 5b 69  i+1]=='+' || z[i
41e0: 2b 31 5d 3d 3d 27 2d 27 29 20 26 26 20 73 71 6c  +1]=='-') && sql
41f0: 69 74 65 33 49 73 64 69 67 69 74 28 7a 5b 69 2b  ite3Isdigit(z[i+
4200: 32 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  2])).           
4210: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
4220: 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20     i += 2;.     
4230: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
4240: 33 49 73 64 69 67 69 74 28 7a 5b 69 5d 29 20 29  3Isdigit(z[i]) )
4250: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  { i++; }.       
4260: 20 2a 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b   *tokenType = TK
4270: 5f 46 4c 4f 41 54 3b 0a 20 20 20 20 20 20 7d 0a  _FLOAT;.      }.
4280: 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 64 43        while( IdC
4290: 68 61 72 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  har(z[i]) ){.   
42a0: 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20       *tokenType 
42b0: 3d 20 54 4b 5f 49 4c 4c 45 47 41 4c 3b 0a 20 20  = TK_ILLEGAL;.  
42c0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
42d0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
42e0: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  i;.    }.    cas
42f0: 65 20 43 43 5f 51 55 4f 54 45 32 3a 20 7b 0a 20  e CC_QUOTE2: {. 
4300: 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 63 3d       for(i=1, c=
4310: 7a 5b 30 5d 3b 20 63 21 3d 27 5d 27 20 26 26 20  z[0]; c!=']' && 
4320: 28 63 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  (c=z[i])!=0; i++
4330: 29 7b 7d 0a 20 20 20 20 20 20 2a 74 6f 6b 65 6e  ){}.      *token
4340: 54 79 70 65 20 3d 20 63 3d 3d 27 5d 27 20 3f 20  Type = c==']' ? 
4350: 54 4b 5f 49 44 20 3a 20 54 4b 5f 49 4c 4c 45 47  TK_ID : TK_ILLEG
4360: 41 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  AL;.      return
4370: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   i;.    }.    ca
4380: 73 65 20 43 43 5f 56 41 52 4e 55 4d 3a 20 7b 0a  se CC_VARNUM: {.
4390: 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70 65        *tokenType
43a0: 20 3d 20 54 4b 5f 56 41 52 49 41 42 4c 45 3b 0a   = TK_VARIABLE;.
43b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 73        for(i=1; s
43c0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 5b  qlite3Isdigit(z[
43d0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
43e0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20    return i;.    
43f0: 7d 0a 20 20 20 20 63 61 73 65 20 43 43 5f 44 4f  }.    case CC_DO
4400: 4c 4c 41 52 3a 0a 20 20 20 20 63 61 73 65 20 43  LLAR:.    case C
4410: 43 5f 56 41 52 41 4c 50 48 41 3a 20 7b 0a 20 20  C_VARALPHA: {.  
4420: 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
4430: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 7a       testcase( z
4440: 5b 30 5d 3d 3d 27 24 27 20 29 3b 20 20 74 65 73  [0]=='$' );  tes
4450: 74 63 61 73 65 28 20 7a 5b 30 5d 3d 3d 27 40 27  tcase( z[0]=='@'
4460: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4470: 73 65 28 20 7a 5b 30 5d 3d 3d 27 3a 27 20 29 3b  se( z[0]==':' );
4480: 20 20 74 65 73 74 63 61 73 65 28 20 7a 5b 30 5d    testcase( z[0]
4490: 3d 3d 27 23 27 20 29 3b 0a 20 20 20 20 20 20 2a  =='#' );.      *
44a0: 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 56  tokenType = TK_V
44b0: 41 52 49 41 42 4c 45 3b 0a 20 20 20 20 20 20 66  ARIABLE;.      f
44c0: 6f 72 28 69 3d 31 3b 20 28 63 3d 7a 5b 69 5d 29  or(i=1; (c=z[i])
44d0: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
44e0: 20 20 20 69 66 28 20 49 64 43 68 61 72 28 63 29     if( IdChar(c)
44f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 2b   ){.          n+
4500: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
4510: 20 69 66 28 20 63 3d 3d 27 28 27 20 26 26 20 6e   if( c=='(' && n
4520: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
4530: 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  do{.            
4540: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i++;.          }
4550: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 69 5d 29 21  while( (c=z[i])!
4560: 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 49 73  =0 && !sqlite3Is
4570: 73 70 61 63 65 28 63 29 20 26 26 20 63 21 3d 27  space(c) && c!='
4580: 29 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )' );.          
4590: 69 66 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20  if( c==')' ){.  
45a0: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
45b0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 74 6f 6b              *tok
45d0: 65 6e 54 79 70 65 20 3d 20 54 4b 5f 49 4c 4c 45  enType = TK_ILLE
45e0: 47 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  GAL;.          }
45f0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4600: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
4610: 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 7a 5b  if( c==':' && z[
4620: 69 2b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20  i+1]==':' ){.   
4630: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
4640: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4660: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4670: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 2a      if( n==0 ) *
4680: 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 49  tokenType = TK_I
4690: 4c 4c 45 47 41 4c 3b 0a 20 20 20 20 20 20 72 65  LLEGAL;.      re
46a0: 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
46b0: 20 20 63 61 73 65 20 43 43 5f 4b 59 57 44 3a 20    case CC_KYWD: 
46c0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  {.      for(i=1;
46d0: 20 61 69 43 6c 61 73 73 5b 7a 5b 69 5d 5d 3c 3d   aiClass[z[i]]<=
46e0: 43 43 5f 4b 59 57 44 3b 20 69 2b 2b 29 7b 7d 0a  CC_KYWD; i++){}.
46f0: 20 20 20 20 20 20 69 66 28 20 49 64 43 68 61 72        if( IdChar
4700: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
4710: 20 20 2f 2a 20 54 68 69 73 20 74 6f 6b 65 6e 20    /* This token 
4720: 73 74 61 72 74 65 64 20 6f 75 74 20 75 73 69 6e  started out usin
4730: 67 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  g characters tha
4740: 74 20 63 61 6e 20 61 70 70 65 61 72 20 69 6e 20  t can appear in 
4750: 6b 65 79 77 6f 72 64 73 2c 0a 20 20 20 20 20 20  keywords,.      
4760: 20 20 2a 2a 20 62 75 74 20 7a 5b 69 5d 20 69 73    ** but z[i] is
4770: 20 61 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74   a character not
4780: 20 61 6c 6c 6f 77 65 64 20 77 69 74 68 69 6e 20   allowed within 
4790: 6b 65 79 77 6f 72 64 73 2c 20 73 6f 20 74 68 69  keywords, so thi
47a0: 73 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 2a  s must.        *
47b0: 2a 20 62 65 20 61 6e 20 69 64 65 6e 74 69 66 69  * be an identifi
47c0: 65 72 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20  er instead */.  
47d0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
47e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
47f0: 7d 0a 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79  }.      *tokenTy
4800: 70 65 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 20 20  pe = TK_ID;.    
4810: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20    return i;.    
4820: 7d 0a 20 20 20 20 63 61 73 65 20 43 43 5f 58 3a  }.    case CC_X:
4830: 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
4840: 65 28 20 7a 5b 30 5d 3d 3d 27 78 27 20 29 3b 20  e( z[0]=='x' ); 
4850: 74 65 73 74 63 61 73 65 28 20 7a 5b 30 5d 3d 3d  testcase( z[0]==
4860: 27 58 27 20 29 3b 0a 20 20 20 20 20 20 69 66 28  'X' );.      if(
4870: 20 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20   z[1]=='\'' ){. 
4880: 20 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70         *tokenTyp
4890: 65 20 3d 20 54 4b 5f 42 4c 4f 42 3b 0a 20 20 20  e = TK_BLOB;.   
48a0: 20 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 73 71       for(i=2; sq
48b0: 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 5b  lite3Isxdigit(z[
48c0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
48d0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 5c      if( z[i]!='\
48e0: 27 27 20 7c 7c 20 69 25 32 20 29 7b 0a 20 20 20  '' || i%2 ){.   
48f0: 20 20 20 20 20 20 20 2a 74 6f 6b 65 6e 54 79 70         *tokenTyp
4900: 65 20 3d 20 54 4b 5f 49 4c 4c 45 47 41 4c 3b 0a  e = TK_ILLEGAL;.
4910: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
4920: 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27   z[i] && z[i]!='
4930: 5c 27 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20  \'' ){ i++; }.  
4940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4950: 69 66 28 20 7a 5b 69 5d 20 29 20 69 2b 2b 3b 0a  if( z[i] ) i++;.
4960: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
4970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4980: 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
4990: 61 20 42 4c 4f 42 20 6c 69 74 65 72 61 6c 2c 20  a BLOB literal, 
49a0: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
49b0: 61 6e 20 49 44 2c 20 73 69 6e 63 65 20 6e 6f 0a  an ID, since no.
49c0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 20 6b 65 79        ** SQL key
49d0: 77 6f 72 64 73 20 73 74 61 72 74 20 77 69 74 68  words start with
49e0: 20 74 68 65 20 6c 65 74 74 65 72 20 27 78 27 2e   the letter 'x'.
49f0: 20 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a    Fall through *
4a00: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
4a10: 20 43 43 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20   CC_ID: {.      
4a20: 69 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  i = 1;.      bre
4a30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
4a40: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2a  fault: {.      *
4a50: 74 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4b 5f 49  tokenType = TK_I
4a60: 4c 4c 45 47 41 4c 3b 0a 20 20 20 20 20 20 72 65  LLEGAL;.      re
4a70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4a80: 7d 0a 20 20 77 68 69 6c 65 28 20 49 64 43 68 61  }.  while( IdCha
4a90: 72 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  r(z[i]) ){ i++; 
4aa0: 7d 0a 20 20 2a 74 6f 6b 65 6e 54 79 70 65 20 3d  }.  *tokenType =
4ab0: 20 54 4b 5f 49 44 3b 0a 20 20 72 65 74 75 72 6e   TK_ID;.  return
4ac0: 20 69 3b 0a 7d 0a 0a 63 68 61 72 20 2a 73 71 6c   i;.}..char *sql
4ad0: 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 28 63  ite3_normalize(c
4ae0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
4af0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  {.  char *z;    
4b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4b10: 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20 2a   output string *
4b20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
4b30: 34 20 6e 5a 3b 20 20 20 20 20 2f 2a 20 53 69 7a  4 nZ;     /* Siz
4b40: 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
4b50: 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65 73 20  string in bytes 
4b60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
4b70: 36 34 20 6e 53 71 6c 3b 20 20 20 2f 2a 20 53 69  64 nSql;   /* Si
4b80: 7a 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ze of the input 
4b90: 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65 73 20  string in bytes 
4ba0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
4bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
4bc0: 78 74 20 63 68 61 72 61 63 74 65 72 20 74 6f 20  xt character to 
4bd0: 72 65 61 64 20 66 72 6f 6d 20 7a 53 71 6c 5b 5d  read from zSql[]
4be0: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4c00: 65 78 74 20 73 6c 6f 74 20 74 6f 20 66 69 6c 6c  ext slot to fill
4c10: 20 69 6e 20 6f 6e 20 7a 5b 5d 20 2a 2f 0a 20 20   in on z[] */.  
4c20: 69 6e 74 20 74 6f 6b 65 6e 54 79 70 65 3b 20 20  int tokenType;  
4c30: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
4c40: 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 20   the next token 
4c50: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
4c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
4c70: 7a 65 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  ze of the next t
4c80: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b  oken */.  int k;
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
4cb0: 2a 2f 0a 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72  */..  nSql = str
4cc0: 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 6e 5a 20  len(zSql);.  nZ 
4cd0: 3d 20 6e 53 71 6c 3b 0a 20 20 7a 20 3d 20 73 71  = nSql;.  z = sq
4ce0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
4cf0: 6e 5a 2b 32 20 29 3b 0a 20 20 69 66 28 20 7a 3d  nZ+2 );.  if( z=
4d00: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4d10: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c   for(i=j=0; zSql
4d20: 5b 69 5d 3b 20 69 20 2b 3d 20 6e 29 7b 0a 20 20  [i]; i += n){.  
4d30: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74    n = sqlite3Get
4d40: 54 6f 6b 65 6e 28 28 75 6e 73 69 67 6e 65 64 20  Token((unsigned 
4d50: 63 68 61 72 2a 29 7a 53 71 6c 2b 69 2c 20 26 74  char*)zSql+i, &t
4d60: 6f 6b 65 6e 54 79 70 65 29 3b 0a 20 20 20 20 73  okenType);.    s
4d70: 77 69 74 63 68 28 20 74 6f 6b 65 6e 54 79 70 65  witch( tokenType
4d80: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54   ){.      case T
4d90: 4b 5f 53 50 41 43 45 3a 20 7b 0a 20 20 20 20 20  K_SPACE: {.     
4da0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4db0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
4dc0: 45 52 52 4f 52 3a 20 7b 0a 20 20 20 20 20 20 20  ERROR: {.       
4dd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
4de0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4df0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4e00: 20 20 63 61 73 65 20 54 4b 5f 4c 49 54 45 52 41    case TK_LITERA
4e10: 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  L: {.        z[j
4e20: 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 20  ++] = '?';.     
4e30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4e40: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
4e50: 50 55 4e 43 54 3a 0a 20 20 20 20 20 20 63 61 73  PUNCT:.      cas
4e60: 65 20 54 4b 5f 4e 41 4d 45 3a 20 7b 0a 20 20 20  e TK_NAME: {.   
4e70: 20 20 20 20 20 69 66 28 20 6e 3d 3d 34 20 26 26       if( n==4 &&
4e80: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
4e90: 70 28 7a 53 71 6c 2b 69 2c 22 4e 55 4c 4c 22 2c  p(zSql+i,"NULL",
4ea0: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
4eb0: 20 20 20 69 66 28 20 28 6a 3e 3d 33 20 26 26 20     if( (j>=3 && 
4ec0: 73 74 72 6e 63 6d 70 28 7a 2b 6a 2d 32 2c 22 69  strncmp(z+j-2,"i
4ed0: 73 22 2c 32 29 3d 3d 30 20 26 26 20 21 49 64 43  s",2)==0 && !IdC
4ee0: 68 61 72 28 7a 5b 6a 2d 33 5d 29 29 0a 20 20 20  har(z[j-3])).   
4ef0: 20 20 20 20 20 20 20 20 7c 7c 20 28 6a 3e 3d 34          || (j>=4
4f00: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b 6a 2d   && strncmp(z+j-
4f10: 33 2c 22 6e 6f 74 22 2c 33 29 3d 3d 30 20 26 26  3,"not",3)==0 &&
4f20: 20 21 49 64 43 68 61 72 28 7a 5b 6a 2d 34 5d 29   !IdChar(z[j-4])
4f30: 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
4f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 55             /* NU
4f50: 4c 4c 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20  LL is a keyword 
4f60: 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 6e 6f  in this case, no
4f70: 74 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  t a literal valu
4f80: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d  e */.          }
4f90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4fa0: 20 20 2f 2a 20 48 65 72 65 20 74 68 65 20 4e 55    /* Here the NU
4fb0: 4c 4c 20 69 73 20 61 20 6c 69 74 65 72 61 6c 20  LL is a literal 
4fc0: 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 20  value */.       
4fd0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 3f       z[j++] = '?
4fe0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ';.            b
4ff0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
5000: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
5010: 20 20 20 20 69 66 28 20 6a 3e 30 20 26 26 20 49      if( j>0 && I
5020: 64 43 68 61 72 28 7a 5b 6a 2d 31 5d 29 20 26 26  dChar(z[j-1]) &&
5030: 20 49 64 43 68 61 72 28 7a 53 71 6c 5b 69 5d 29   IdChar(zSql[i])
5040: 20 29 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b   ) z[j++] = ' ';
5050: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  .        for(k=0
5060: 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ; k<n; k++){.   
5070: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
5080: 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a  sqlite3Tolower(z
5090: 53 71 6c 5b 69 2b 6b 5d 29 3b 0a 20 20 20 20 20  Sql[i+k]);.     
50a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
50b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
50c0: 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6a  }.  }.  while( j
50d0: 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 3d 3d 27 20  >0 && z[j-1]==' 
50e0: 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 69 66  ' ){ j--; }.  if
50f0: 28 20 69 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( i>0 && z[j-1]!
5100: 3d 27 3b 27 20 29 7b 20 7a 5b 6a 2b 2b 5d 20 3d  =';' ){ z[j++] =
5110: 20 27 3b 27 3b 20 7d 0a 20 20 7a 5b 6a 5d 20 3d   ';'; }.  z[j] =
5120: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61   0;..  /* Make a
5130: 20 73 65 63 6f 6e 64 20 70 61 73 73 20 63 6f 6e   second pass con
5140: 76 65 72 74 69 6e 67 20 22 69 6e 28 2e 2e 2e 29  verting "in(...)
5150: 22 20 77 68 65 72 65 20 74 68 65 20 22 2e 2e 2e  " where the "...
5160: 22 20 69 73 20 6e 6f 74 20 61 0a 20 20 2a 2a 20  " is not a.  ** 
5170: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
5180: 20 69 6e 74 6f 20 22 69 6e 28 3f 2c 3f 2c 3f 29   into "in(?,?,?)
5190: 22 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  " */.  for(i=0; 
51a0: 69 3c 6a 3b 20 69 3d 6e 29 7b 0a 20 20 20 20 63  i<j; i=n){.    c
51b0: 68 61 72 20 2a 7a 49 6e 20 3d 20 73 74 72 73 74  har *zIn = strst
51c0: 72 28 7a 2b 69 2c 20 22 69 6e 28 22 29 3b 0a 20  r(z+i, "in(");. 
51d0: 20 20 20 69 6e 74 20 6e 50 61 72 65 6e 3b 0a 20     int nParen;. 
51e0: 20 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20     if( zIn==0 ) 
51f0: 62 72 65 61 6b 3b 0a 20 20 20 20 6e 20 3d 20 28  break;.    n = (
5200: 69 6e 74 29 28 7a 49 6e 2d 7a 29 2b 33 3b 20 20  int)(zIn-z)+3;  
5210: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
5220: 74 20 63 68 61 72 20 70 61 73 74 20 22 69 6e 28  t char past "in(
5230: 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 20 26  " */.    if( n &
5240: 26 20 49 64 43 68 61 72 28 7a 49 6e 5b 2d 31 5d  & IdChar(zIn[-1]
5250: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
5260: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 49    if( strncmp(zI
5270: 6e 2c 20 22 69 6e 28 73 65 6c 65 63 74 22 2c 39  n, "in(select",9
5280: 29 3d 3d 30 20 26 26 20 21 49 64 43 68 61 72 28  )==0 && !IdChar(
5290: 7a 49 6e 5b 39 5d 29 20 29 20 63 6f 6e 74 69 6e  zIn[9]) ) contin
52a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  ue;.    if( strn
52b0: 63 6d 70 28 7a 49 6e 2c 20 22 69 6e 28 77 69 74  cmp(zIn, "in(wit
52c0: 68 22 2c 37 29 3d 3d 30 20 26 26 20 21 49 64 43  h",7)==0 && !IdC
52d0: 68 61 72 28 7a 49 6e 5b 37 5d 29 20 29 20 63 6f  har(zIn[7]) ) co
52e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
52f0: 6e 50 61 72 65 6e 3d 31 2c 20 6b 3d 30 3b 20 7a  nParen=1, k=0; z
5300: 5b 6e 2b 6b 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  [n+k]; k++){.   
5310: 20 20 20 69 66 28 20 7a 5b 6e 2b 6b 5d 3d 3d 27     if( z[n+k]=='
5320: 28 27 20 29 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20  (' ) nParen++;. 
5330: 20 20 20 20 20 69 66 28 20 7a 5b 6e 2b 6b 5d 3d       if( z[n+k]=
5340: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
5350: 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20  nParen--;.      
5360: 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 30 20    if( nParen==0 
5370: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
5380: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 6b 20  .    }.    /* k 
5390: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
53a0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22 2e   bytes in the ".
53b0: 2e 2e 22 20 77 69 74 68 69 6e 20 22 69 6e 28 2e  .." within "in(.
53c0: 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 69 66 28 20  ..)" */.    if( 
53d0: 6b 3c 35 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  k<5 ){.      z =
53e0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
53f0: 36 34 28 7a 2c 20 6a 2b 28 35 2d 6b 29 2b 31 29  64(z, j+(5-k)+1)
5400: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30  ;.      if( z==0
5410: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5420: 20 20 20 6d 65 6d 6d 6f 76 65 28 7a 2b 6e 2b 35     memmove(z+n+5
5430: 2c 20 7a 2b 6e 2b 6b 2c 20 6a 2d 28 6e 2b 6b 29  , z+n+k, j-(n+k)
5440: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
5450: 20 6b 3e 35 20 29 7b 0a 20 20 20 20 20 20 6d 65   k>5 ){.      me
5460: 6d 6d 6f 76 65 28 7a 2b 6e 2b 35 2c 20 7a 2b 6e  mmove(z+n+5, z+n
5470: 2b 6b 2c 20 6a 2d 28 6e 2b 6b 29 29 3b 0a 20 20  +k, j-(n+k));.  
5480: 20 20 7d 0a 20 20 20 20 6a 20 3d 20 6a 2d 6b 2b    }.    j = j-k+
5490: 35 3b 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b  5;.    z[j] = 0;
54a0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 2b 6e 2c  .    memcpy(z+n,
54b0: 20 22 3f 2c 3f 2c 3f 22 2c 20 35 29 3b 0a 20 20   "?,?,?", 5);.  
54c0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
54d0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69  ./*.** For testi
54e0: 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 6f 72 20  ng purposes, or 
54f0: 74 6f 20 62 75 69 6c 64 20 61 20 73 74 61 6e 64  to build a stand
5500: 2d 61 6c 6f 6e 65 20 53 51 4c 20 6e 6f 72 6d 61  -alone SQL norma
5510: 6c 69 7a 65 72 20 70 72 6f 67 72 61 6d 2c 0a 2a  lizer program,.*
5520: 2a 20 63 6f 6d 70 69 6c 65 20 74 68 69 73 20 6f  * compile this o
5530: 6e 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 77  ne source file w
5540: 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ith the -DSQLITE
5550: 5f 4e 4f 52 4d 41 4c 49 5a 45 5f 43 4c 49 20 61  _NORMALIZE_CLI a
5560: 6e 64 20 6c 69 6e 6b 0a 2a 2a 20 69 74 20 61 67  nd link.** it ag
5570: 61 69 6e 73 74 20 61 6e 79 20 53 51 4c 69 74 65  ainst any SQLite
5580: 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65 20 72   library.  The r
5590: 65 73 75 6c 74 69 6e 67 20 63 6f 6d 6d 61 6e 64  esulting command
55a0: 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 69  -line program wi
55b0: 6c 6c 0a 2a 2a 20 72 75 6e 20 73 71 6c 69 74 65  ll.** run sqlite
55c0: 33 5f 6e 6f 72 6d 61 6c 69 7a 65 28 29 20 6f 76  3_normalize() ov
55d0: 65 72 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  er the text of a
55e0: 6c 6c 20 66 69 6c 65 73 20 6e 61 6d 65 64 20 6f  ll files named o
55f0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 0a 2a  n the command-.*
5600: 2a 20 6c 69 6e 65 20 61 6e 64 20 73 68 6f 77 20  * line and show 
5610: 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 74  the result on st
5620: 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 0a 2a  andard output..*
5630: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
5640: 4e 4f 52 4d 41 4c 49 5a 45 5f 43 4c 49 0a 23 69  NORMALIZE_CLI.#i
5650: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
5660: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
5670: 62 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 42 72 65 61  b.h>../*.** Brea
5680: 6b 20 7a 49 6e 20 75 70 20 69 6e 74 6f 20 73 65  k zIn up into se
5690: 70 61 72 61 74 65 20 53 51 4c 20 73 74 61 74 65  parate SQL state
56a0: 6d 65 6e 74 73 20 61 6e 64 20 72 75 6e 20 73 71  ments and run sq
56b0: 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 28  lite3_normalize(
56c0: 29 0a 2a 2a 20 6f 6e 20 65 61 63 68 20 6f 6e 65  ).** on each one
56d0: 2e 20 20 50 72 69 6e 74 20 74 68 65 20 72 65 73  .  Print the res
56e0: 75 6c 74 20 6f 66 20 65 61 63 68 20 72 75 6e 2e  ult of each run.
56f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5700: 6e 6f 72 6d 61 6c 69 7a 65 46 69 6c 65 28 63 68  normalizeFile(ch
5710: 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 69 6e 74 20  ar *zIn){.  int 
5720: 69 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20  i;.  if( zIn==0 
5730: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
5740: 69 3d 30 3b 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b  i=0; zIn[i]; i++
5750: 29 7b 0a 20 20 20 20 63 68 61 72 20 63 53 61 76  ){.    char cSav
5760: 65 64 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 5b  ed;.    if( zIn[
5770: 69 5d 21 3d 27 3b 27 20 29 20 63 6f 6e 74 69 6e  i]!=';' ) contin
5780: 75 65 3b 0a 20 20 20 20 63 53 61 76 65 64 20 3d  ue;.    cSaved =
5790: 20 7a 49 6e 5b 69 2b 31 5d 3b 0a 20 20 20 20 7a   zIn[i+1];.    z
57a0: 49 6e 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 20  In[i+1] = 0;.   
57b0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6d   if( sqlite3_com
57c0: 70 6c 65 74 65 28 7a 49 6e 29 20 29 7b 0a 20 20  plete(zIn) ){.  
57d0: 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
57e0: 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69   sqlite3_normali
57f0: 7a 65 28 7a 49 6e 29 3b 0a 20 20 20 20 20 20 69  ze(zIn);.      i
5800: 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  f( zOut ){.     
5810: 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22     printf("%s\n"
5820: 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  , zOut);.       
5830: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
5840: 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ut);.      }else
5850: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
5860: 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52  f(stderr, "ERROR
5870: 3a 20 25 73 5c 6e 22 2c 20 7a 49 6e 29 3b 0a 20  : %s\n", zIn);. 
5880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 49 6e       }.      zIn
5890: 5b 69 2b 31 5d 20 3d 20 63 53 61 76 65 64 3b 0a  [i+1] = cSaved;.
58a0: 20 20 20 20 20 20 7a 49 6e 20 2b 3d 20 69 2b 31        zIn += i+1
58b0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a  ;.      i = -1;.
58c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
58d0: 20 7a 49 6e 5b 69 2b 31 5d 20 3d 20 63 53 61 76   zIn[i+1] = cSav
58e0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ed;.    }.  }.}.
58f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  ./*.** The main 
5900: 72 6f 75 74 69 6e 65 20 66 6f 72 20 22 73 71 6c  routine for "sql
5910: 5f 6e 6f 72 6d 61 6c 69 7a 65 22 2e 20 20 52 65  _normalize".  Re
5920: 61 64 20 66 69 6c 65 73 20 6e 61 6d 65 64 20 6f  ad files named o
5930: 6e 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  n the.** command
5940: 2d 6c 69 6e 65 20 61 6e 64 20 72 75 6e 20 74 68  -line and run th
5950: 65 20 74 65 78 74 20 6f 66 20 65 61 63 68 20 74  e text of each t
5960: 68 72 6f 75 67 68 20 73 71 6c 69 74 65 33 5f 6e  hrough sqlite3_n
5970: 6f 72 6d 61 6c 69 7a 65 28 29 2e 0a 2a 2f 0a 69  ormalize()..*/.i
5980: 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
5990: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
59a0: 20 20 69 6e 74 20 69 3b 0a 20 20 46 49 4c 45 20    int i;.  FILE 
59b0: 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75  *in;.  char *zBu
59c0: 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  f = 0;.  sqlite3
59d0: 5f 69 6e 74 36 34 20 73 7a 2c 20 67 6f 74 3b 0a  _int64 sz, got;.
59e0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
59f0: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  gc; i++){.    in
5a00: 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 69 5d   = fopen(argv[i]
5a10: 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
5a20: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
5a30: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
5a40: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25  "cannot open \"%
5a50: 73 5c 22 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29  s\"\n", argv[i])
5a60: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
5a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 73 65 65  ;.    }.    fsee
5a80: 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e  k(in, 0, SEEK_EN
5a90: 44 29 3b 0a 20 20 20 20 73 7a 20 3d 20 66 74 65  D);.    sz = fte
5aa0: 6c 6c 28 69 6e 29 3b 0a 20 20 20 20 72 65 77 69  ll(in);.    rewi
5ab0: 6e 64 28 69 6e 29 3b 0a 20 20 20 20 7a 42 75 66  nd(in);.    zBuf
5ac0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
5ad0: 6f 63 36 34 28 7a 42 75 66 2c 20 73 7a 2b 31 29  oc64(zBuf, sz+1)
5ae0: 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d  ;.    if( zBuf==
5af0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
5b00: 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
5b10: 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72  ed to malloc for
5b20: 20 25 6c 6c 64 20 62 79 74 65 73 5c 6e 22 2c 20   %lld bytes\n", 
5b30: 73 7a 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  sz);.      exit(
5b40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  1);.    }.    go
5b50: 74 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  t = fread(zBuf, 
5b60: 31 2c 20 73 7a 2c 20 69 6e 29 3b 0a 20 20 20 20  1, sz, in);.    
5b70: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
5b80: 69 66 28 20 67 6f 74 21 3d 73 7a 20 29 7b 0a 20  if( got!=sz ){. 
5b90: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
5ba0: 65 72 72 2c 20 22 6f 6e 6c 79 20 61 62 6c 65 20  err, "only able 
5bb0: 74 6f 20 72 65 61 64 20 25 6c 6c 64 20 6f 66 20  to read %lld of 
5bc0: 25 6c 6c 64 20 62 79 74 65 73 20 66 72 6f 6d 20  %lld bytes from 
5bd0: 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
5be0: 20 20 20 20 20 20 20 20 20 67 6f 74 2c 20 73 7a           got, sz
5bf0: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
5c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75  }else{.      zBu
5c10: 66 5b 67 6f 74 5d 20 3d 20 30 3b 0a 20 20 20 20  f[got] = 0;.    
5c20: 20 20 6e 6f 72 6d 61 6c 69 7a 65 46 69 6c 65 28    normalizeFile(
5c30: 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zBuf);.    }.  }
5c40: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5c50: 7a 42 75 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  zBuf);.}.#endif 
5c60: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 52 4d 41 4c  /* SQLITE_NORMAL
5c70: 49 5a 45 5f 43 4c 49 20 2a 2f 0a                 IZE_CLI */.