/ Hex Artifact Content
Login

Artifact 77016e5a2766cf8b84381397152d2c99ea4b218f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6e 20 74 6f 6b  ******.** An tok
0180: 65 6e 69 7a 65 72 20 66 6f 72 20 53 51 4c 0a 2a  enizer for SQL.*
0190: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
01a0: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 74  ontains C code t
01b0: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
01c0: 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  he sqlite3_compl
01d0: 65 74 65 28 29 20 41 50 49 2e 0a 2a 2a 20 54 68  ete() API..** Th
01e0: 69 73 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20  is code used to 
01f0: 62 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  be part of the t
0200: 6f 6b 65 6e 69 7a 65 72 2e 63 20 73 6f 75 72 63  okenizer.c sourc
0210: 65 20 66 69 6c 65 2e 20 20 42 75 74 20 62 79 0a  e file.  But by.
0220: 2a 2a 20 73 65 70 61 72 61 74 69 6e 67 20 69 74  ** separating it
0230: 20 6f 75 74 2c 20 74 68 65 20 63 6f 64 65 20 77   out, the code w
0240: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
0250: 61 6c 6c 79 20 6f 6d 69 74 74 65 64 20 66 72 6f  ally omitted fro
0260: 6d 0a 2a 2a 20 73 74 61 74 69 63 20 6c 69 6e 6b  m.** static link
0270: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73  s that do not us
0280: 65 20 69 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  e it..*/.#includ
0290: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
02a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
02b0: 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 0a 2f 2a  MIT_COMPLETE../*
02c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 64 65 66 69  .** This is defi
02d0: 6e 65 64 20 69 6e 20 74 6f 6b 65 6e 69 7a 65 2e  ned in tokenize.
02e0: 63 2e 20 20 57 65 20 6a 75 73 74 20 68 61 76 65  c.  We just have
02f0: 20 74 6f 20 69 6d 70 6f 72 74 20 74 68 65 20 64   to import the d
0300: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
0310: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  fndef SQLITE_AMA
0320: 4c 47 41 4d 41 54 49 4f 4e 0a 23 69 66 64 65 66  LGAMATION.#ifdef
0330: 20 53 51 4c 49 54 45 5f 41 53 43 49 49 0a 65 78   SQLITE_ASCII.ex
0340: 74 65 72 6e 20 63 6f 6e 73 74 20 63 68 61 72 20  tern const char 
0350: 73 71 6c 69 74 65 33 49 73 41 73 63 69 69 49 64  sqlite3IsAsciiId
0360: 43 68 61 72 5b 5d 3b 0a 23 64 65 66 69 6e 65 20  Char[];.#define 
0370: 49 64 43 68 61 72 28 43 29 20 20 28 28 28 63 3d  IdChar(C)  (((c=
0380: 43 29 26 30 78 38 30 29 21 3d 30 20 7c 7c 20 28  C)&0x80)!=0 || (
0390: 63 3e 30 78 31 66 20 26 26 20 73 71 6c 69 74 65  c>0x1f && sqlite
03a0: 33 49 73 41 73 63 69 69 49 64 43 68 61 72 5b 63  3IsAsciiIdChar[c
03b0: 2d 30 78 32 30 5d 29 29 0a 23 65 6e 64 69 66 0a  -0x20])).#endif.
03c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
03d0: 43 44 49 43 0a 65 78 74 65 72 6e 20 63 6f 6e 73  CDIC.extern cons
03e0: 74 20 63 68 61 72 20 73 71 6c 69 74 65 33 49 73  t char sqlite3Is
03f0: 45 62 63 64 69 63 49 64 43 68 61 72 5b 5d 3b 0a  EbcdicIdChar[];.
0400: 23 64 65 66 69 6e 65 20 49 64 43 68 61 72 28 43  #define IdChar(C
0410: 29 20 20 28 28 28 63 3d 43 29 3e 3d 30 78 34 32  )  (((c=C)>=0x42
0420: 20 26 26 20 73 71 6c 69 74 65 33 49 73 45 62 63   && sqlite3IsEbc
0430: 64 69 63 49 64 43 68 61 72 5b 63 2d 30 78 34 30  dicIdChar[c-0x40
0440: 5d 29 29 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ])).#endif.#endi
0450: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 41 4d 41 4c  f /* SQLITE_AMAL
0460: 47 41 4d 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 2f 2a  GAMATION */.../*
0470: 0a 2a 2a 20 54 6f 6b 65 6e 20 74 79 70 65 73 20  .** Token types 
0480: 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  used by the sqli
0490: 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 29 20 72  te3_complete() r
04a0: 6f 75 74 69 6e 65 2e 20 20 53 65 65 20 74 68 65  outine.  See the
04b0: 20 68 65 61 64 65 72 0a 2a 2a 20 63 6f 6d 6d 65   header.** comme
04c0: 6e 74 73 20 6f 6e 20 74 68 61 74 20 70 72 6f 63  nts on that proc
04d0: 65 64 75 72 65 20 66 6f 72 20 61 64 64 69 74 69  edure for additi
04e0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
04f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 74 6b 53  ..*/.#define tkS
0500: 45 4d 49 20 20 20 20 30 0a 23 64 65 66 69 6e 65  EMI    0.#define
0510: 20 74 6b 57 53 20 20 20 20 20 20 31 0a 23 64 65   tkWS      1.#de
0520: 66 69 6e 65 20 74 6b 4f 54 48 45 52 20 20 20 32  fine tkOTHER   2
0530: 0a 23 64 65 66 69 6e 65 20 74 6b 45 58 50 4c 41  .#define tkEXPLA
0540: 49 4e 20 33 0a 23 64 65 66 69 6e 65 20 74 6b 43  IN 3.#define tkC
0550: 52 45 41 54 45 20 20 34 0a 23 64 65 66 69 6e 65  REATE  4.#define
0560: 20 74 6b 54 45 4d 50 20 20 20 20 35 0a 23 64 65   tkTEMP    5.#de
0570: 66 69 6e 65 20 74 6b 54 52 49 47 47 45 52 20 36  fine tkTRIGGER 6
0580: 0a 23 64 65 66 69 6e 65 20 74 6b 45 4e 44 20 20  .#define tkEND  
0590: 20 20 20 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75     7../*.** Retu
05a0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
05b0: 69 76 65 6e 20 53 51 4c 20 73 74 72 69 6e 67 20  iven SQL string 
05c0: 65 6e 64 73 20 69 6e 20 61 20 73 65 6d 69 63 6f  ends in a semico
05d0: 6c 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  lon..**.** Speci
05e0: 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 72  al handling is r
05f0: 65 71 75 69 72 65 20 66 6f 72 20 43 52 45 41 54  equire for CREAT
0600: 45 20 54 52 49 47 47 45 52 20 73 74 61 74 65 6d  E TRIGGER statem
0610: 65 6e 74 73 2e 0a 2a 2a 20 57 68 65 6e 65 76 65  ents..** Wheneve
0620: 72 20 74 68 65 20 43 52 45 41 54 45 20 54 52 49  r the CREATE TRI
0630: 47 47 45 52 20 6b 65 79 77 6f 72 64 73 20 61 72  GGER keywords ar
0640: 65 20 73 65 65 6e 2c 20 74 68 65 20 73 74 61 74  e seen, the stat
0650: 65 6d 65 6e 74 0a 2a 2a 20 6d 75 73 74 20 65 6e  ement.** must en
0660: 64 20 77 69 74 68 20 22 3b 45 4e 44 3b 22 2e 0a  d with ";END;"..
0670: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65  **.** This imple
0680: 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 61  mentation uses a
0690: 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 20 77   state machine w
06a0: 69 74 68 20 37 20 73 74 61 74 65 73 3a 0a 2a 2a  ith 7 states:.**
06b0: 0a 2a 2a 20 20 20 28 30 29 20 53 54 41 52 54 20  .**   (0) START 
06c0: 20 20 20 20 41 74 20 74 68 65 20 62 65 67 69 6e      At the begin
06d0: 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61  ning or end of a
06e0: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  n SQL statement.
06f0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
0700: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0710: 20 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69    returns 1 if i
0720: 74 20 65 6e 64 73 20 69 6e 20 74 68 65 20 53 54  t ends in the ST
0730: 41 52 54 20 73 74 61 74 65 20 61 6e 64 20 30 20  ART state and 0 
0740: 69 66 20 69 74 20 65 6e 64 73 0a 2a 2a 20 20 20  if it ends.**   
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
0760: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
0770: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 4e 4f  ..**.**   (1) NO
0780: 52 4d 41 4c 20 20 20 20 57 65 20 61 72 65 20 69  RMAL    We are i
0790: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
07a0: 73 74 61 74 65 6d 65 6e 74 20 77 68 69 63 68 20  statement which 
07b0: 65 6e 64 73 20 77 69 74 68 20 61 20 73 69 6e 67  ends with a sing
07c0: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
07d0: 20 20 20 20 20 20 73 65 6d 69 63 6f 6c 6f 6e 2e        semicolon.
07e0: 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 45 58 50  .**.**   (2) EXP
07f0: 4c 41 49 4e 20 20 20 54 68 65 20 6b 65 79 77 6f  LAIN   The keywo
0800: 72 64 20 45 58 50 4c 41 49 4e 20 68 61 73 20 62  rd EXPLAIN has b
0810: 65 65 6e 20 73 65 65 6e 20 61 74 20 74 68 65 20  een seen at the 
0820: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 0a 2a 2a  beginning of .**
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a   a statement..**
0850: 0a 2a 2a 20 20 20 28 33 29 20 43 52 45 41 54 45  .**   (3) CREATE
0860: 20 20 20 20 54 68 65 20 6b 65 79 77 6f 72 64 20      The keyword 
0870: 43 52 45 41 54 45 20 68 61 73 20 62 65 65 6e 20  CREATE has been 
0880: 73 65 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  seen at the begi
0890: 6e 6e 69 6e 67 20 6f 66 20 61 0a 2a 2a 20 20 20  nning of a.**   
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
08b0: 61 74 65 6d 65 6e 74 2c 20 70 6f 73 73 69 62 6c  atement, possibl
08c0: 79 20 70 72 65 63 65 65 64 65 64 20 62 79 20 45  y preceeded by E
08d0: 58 50 4c 41 49 4e 20 61 6e 64 2f 6f 72 20 66 6f  XPLAIN and/or fo
08e0: 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20  llowed by.**    
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45 4d               TEM
0900: 50 20 6f 72 20 54 45 4d 50 4f 52 41 52 59 0a 2a  P or TEMPORARY.*
0910: 2a 0a 2a 2a 20 20 20 28 34 29 20 54 52 49 47 47  *.**   (4) TRIGG
0920: 45 52 20 20 20 57 65 20 61 72 65 20 69 6e 20 74  ER   We are in t
0930: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74  he middle of a t
0940: 72 69 67 67 65 72 20 64 65 66 69 6e 69 74 69 6f  rigger definitio
0950: 6e 20 74 68 61 74 20 6d 75 73 74 20 62 65 0a 2a  n that must be.*
0960: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0970: 20 20 65 6e 64 65 64 20 62 79 20 61 20 73 65 6d    ended by a sem
0980: 69 63 6f 6c 6f 6e 2c 20 74 68 65 20 6b 65 79 77  icolon, the keyw
0990: 6f 72 64 20 45 4e 44 2c 20 61 6e 64 20 61 6e 6f  ord END, and ano
09a0: 74 68 65 72 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a  ther semicolon..
09b0: 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 53 45 4d 49  **.**   (5) SEMI
09c0: 20 20 20 20 20 20 57 65 27 76 65 20 73 65 65 6e        We've seen
09d0: 20 74 68 65 20 66 69 72 73 74 20 73 65 6d 69 63   the first semic
09e0: 6f 6c 6f 6e 20 69 6e 20 74 68 65 20 22 3b 45 4e  olon in the ";EN
09f0: 44 3b 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  D;" that occurs 
0a00: 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
0a10: 20 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66        the end of
0a20: 20 61 20 74 72 69 67 67 65 72 20 64 65 66 69 6e   a trigger defin
0a30: 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  ition..**.**   (
0a40: 36 29 20 45 4e 44 20 20 20 20 20 20 20 57 65 27  6) END       We'
0a50: 76 65 20 73 65 65 6e 20 74 68 65 20 22 3b 45 4e  ve seen the ";EN
0a60: 44 22 20 6f 66 20 74 68 65 20 22 3b 45 4e 44 3b  D" of the ";END;
0a70: 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  " that occurs at
0a80: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20   the end.**     
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 61              of a
0aa0: 20 74 72 69 67 67 65 72 20 64 69 66 69 6e 69 74   trigger difinit
0ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  ion..**.** Trans
0ac0: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 20 73  itions between s
0ad0: 74 61 74 65 73 20 61 62 6f 76 65 20 61 72 65 20  tates above are 
0ae0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 6f  determined by to
0af0: 6b 65 6e 73 20 65 78 74 72 61 63 74 65 64 0a 2a  kens extracted.*
0b00: 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  * from the input
0b10: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
0b20: 20 74 6f 6b 65 6e 73 20 61 72 65 20 73 69 67 6e   tokens are sign
0b30: 69 66 69 63 61 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20  ificant:.**.**  
0b40: 20 28 30 29 20 74 6b 53 45 4d 49 20 20 20 20 20   (0) tkSEMI     
0b50: 20 41 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a   A semicolon..**
0b60: 20 20 20 28 31 29 20 74 6b 57 53 20 20 20 20 20     (1) tkWS     
0b70: 20 20 20 57 68 69 74 65 73 70 61 63 65 0a 2a 2a     Whitespace.**
0b80: 20 20 20 28 32 29 20 74 6b 4f 54 48 45 52 20 20     (2) tkOTHER  
0b90: 20 20 20 41 6e 79 20 6f 74 68 65 72 20 53 51 4c     Any other SQL
0ba0: 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 20 20 28 33 29   token..**   (3)
0bb0: 20 74 6b 45 58 50 4c 41 49 4e 20 20 20 54 68 65   tkEXPLAIN   The
0bc0: 20 22 65 78 70 6c 61 69 6e 22 20 6b 65 79 77 6f   "explain" keywo
0bd0: 72 64 2e 0a 2a 2a 20 20 20 28 34 29 20 74 6b 43  rd..**   (4) tkC
0be0: 52 45 41 54 45 20 20 20 20 54 68 65 20 22 63 72  REATE    The "cr
0bf0: 65 61 74 65 22 20 6b 65 79 77 6f 72 64 2e 0a 2a  eate" keyword..*
0c00: 2a 20 20 20 28 35 29 20 74 6b 54 45 4d 50 20 20  *   (5) tkTEMP  
0c10: 20 20 20 20 54 68 65 20 22 74 65 6d 70 22 20 6f      The "temp" o
0c20: 72 20 22 74 65 6d 70 6f 72 61 72 79 22 20 6b 65  r "temporary" ke
0c30: 79 77 6f 72 64 2e 0a 2a 2a 20 20 20 28 36 29 20  yword..**   (6) 
0c40: 74 6b 54 52 49 47 47 45 52 20 20 20 54 68 65 20  tkTRIGGER   The 
0c50: 22 74 72 69 67 67 65 72 22 20 6b 65 79 77 6f 72  "trigger" keywor
0c60: 64 2e 0a 2a 2a 20 20 20 28 37 29 20 74 6b 45 4e  d..**   (7) tkEN
0c70: 44 20 20 20 20 20 20 20 54 68 65 20 22 65 6e 64  D       The "end
0c80: 22 20 6b 65 79 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a  " keyword..**.**
0c90: 20 57 68 69 74 65 73 70 61 63 65 20 6e 65 76 65   Whitespace neve
0ca0: 72 20 63 61 75 73 65 73 20 61 20 73 74 61 74 65  r causes a state
0cb0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 61 6e 64 20   transition and 
0cc0: 69 73 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65  is always ignore
0cd0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 63  d..**.** If we c
0ce0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0cf0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 2c  TE_OMIT_TRIGGER,
0d00: 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6d 70   all of the comp
0d10: 75 74 61 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a  utation needed.*
0d20: 2a 20 74 6f 20 72 65 63 6f 67 6e 69 7a 65 20 74  * to recognize t
0d30: 68 65 20 65 6e 64 20 6f 66 20 61 20 74 72 69 67  he end of a trig
0d40: 67 65 72 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  ger can be omitt
0d50: 65 64 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65  ed.  All we have
0d60: 20 74 6f 20 64 6f 0a 2a 2a 20 69 73 20 6c 6f 6f   to do.** is loo
0d70: 6b 20 66 6f 72 20 61 20 73 65 6d 69 63 6f 6c 6f  k for a semicolo
0d80: 6e 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 61  n that is not pa
0d90: 72 74 20 6f 66 20 61 6e 20 73 74 72 69 6e 67 20  rt of an string 
0da0: 6f 72 20 63 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 69  or comment..*/.i
0db0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  nt sqlite3_compl
0dc0: 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ete(const char *
0dd0: 7a 53 71 6c 29 7b 0a 20 20 75 38 20 73 74 61 74  zSql){.  u8 stat
0de0: 65 20 3d 20 30 3b 20 20 20 2f 2a 20 43 75 72 72  e = 0;   /* Curr
0df0: 65 6e 74 20 73 74 61 74 65 2c 20 75 73 69 6e 67  ent state, using
0e00: 20 6e 75 6d 62 65 72 73 20 64 65 66 69 6e 65 64   numbers defined
0e10: 20 69 6e 20 68 65 61 64 65 72 20 63 6f 6d 6d 65   in header comme
0e20: 6e 74 20 2a 2f 0a 20 20 75 38 20 74 6f 6b 65 6e  nt */.  u8 token
0e30: 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65  ;       /* Value
0e40: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74 6f 6b   of the next tok
0e50: 65 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  en */..#ifndef S
0e60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
0e70: 45 52 0a 20 20 2f 2a 20 41 20 63 6f 6d 70 6c 65  ER.  /* A comple
0e80: 78 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 63 68  x statement mach
0e90: 69 6e 65 20 75 73 65 64 20 74 6f 20 64 65 74 65  ine used to dete
0ea0: 63 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  ct the end of a 
0eb0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 0a 20  CREATE TRIGGER. 
0ec0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 20   ** statement.  
0ed0: 54 68 69 73 20 69 73 20 74 68 65 20 6e 6f 72 6d  This is the norm
0ee0: 61 6c 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  al case..  */.  
0ef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
0f00: 74 72 61 6e 73 5b 37 5d 5b 38 5d 20 3d 20 7b 0a  trans[7][8] = {.
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 3a 20 20       /* Token:  
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f                */
0f60: 0a 20 20 20 20 20 2f 2a 20 53 74 61 74 65 3a 20  .     /* State: 
0f70: 20 20 20 20 20 20 2a 2a 20 20 53 45 4d 49 20 20        **  SEMI  
0f80: 57 53 20 20 4f 54 48 45 52 20 45 58 50 4c 41 49  WS  OTHER EXPLAI
0f90: 4e 20 20 43 52 45 41 54 45 20 20 54 45 4d 50 20  N  CREATE  TEMP 
0fa0: 20 54 52 49 47 47 45 52 20 20 45 4e 44 20 20 2a   TRIGGER  END  *
0fb0: 2f 0a 20 20 20 20 20 2f 2a 20 30 20 20 20 53 54  /.     /* 0   ST
0fc0: 41 52 54 3a 20 2a 2f 20 7b 20 20 20 20 30 2c 20  ART: */ {    0, 
0fd0: 20 30 2c 20 20 20 20 20 31 2c 20 20 20 20 20 20   0,     1,      
0fe0: 32 2c 20 20 20 20 20 20 33 2c 20 20 20 20 31 2c  2,      3,    1,
0ff0: 20 20 20 20 20 20 20 31 2c 20 20 20 31 2c 20 20         1,   1,  
1000: 7d 2c 0a 20 20 20 20 20 2f 2a 20 31 20 20 4e 4f  },.     /* 1  NO
1010: 52 4d 41 4c 3a 20 2a 2f 20 7b 20 20 20 20 30 2c  RMAL: */ {    0,
1020: 20 20 31 2c 20 20 20 20 20 31 2c 20 20 20 20 20    1,     1,     
1030: 20 31 2c 20 20 20 20 20 20 31 2c 20 20 20 20 31   1,      1,    1
1040: 2c 20 20 20 20 20 20 20 31 2c 20 20 20 31 2c 20  ,       1,   1, 
1050: 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 32 20 45 58   },.     /* 2 EX
1060: 50 4c 41 49 4e 3a 20 2a 2f 20 7b 20 20 20 20 30  PLAIN: */ {    0
1070: 2c 20 20 32 2c 20 20 20 20 20 32 2c 20 20 20 20  ,  2,     2,    
1080: 20 20 31 2c 20 20 20 20 20 20 33 2c 20 20 20 20    1,      3,    
1090: 31 2c 20 20 20 20 20 20 20 31 2c 20 20 20 31 2c  1,       1,   1,
10a0: 20 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 33 20 20    },.     /* 3  
10b0: 43 52 45 41 54 45 3a 20 2a 2f 20 7b 20 20 20 20  CREATE: */ {    
10c0: 30 2c 20 20 33 2c 20 20 20 20 20 31 2c 20 20 20  0,  3,     1,   
10d0: 20 20 20 31 2c 20 20 20 20 20 20 31 2c 20 20 20     1,      1,   
10e0: 20 33 2c 20 20 20 20 20 20 20 34 2c 20 20 20 31   3,       4,   1
10f0: 2c 20 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 34 20  ,  },.     /* 4 
1100: 54 52 49 47 47 45 52 3a 20 2a 2f 20 7b 20 20 20  TRIGGER: */ {   
1110: 20 35 2c 20 20 34 2c 20 20 20 20 20 34 2c 20 20   5,  4,     4,  
1120: 20 20 20 20 34 2c 20 20 20 20 20 20 34 2c 20 20      4,      4,  
1130: 20 20 34 2c 20 20 20 20 20 20 20 34 2c 20 20 20    4,       4,   
1140: 34 2c 20 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 35  4,  },.     /* 5
1150: 20 20 20 20 53 45 4d 49 3a 20 2a 2f 20 7b 20 20      SEMI: */ {  
1160: 20 20 35 2c 20 20 35 2c 20 20 20 20 20 34 2c 20    5,  5,     4, 
1170: 20 20 20 20 20 34 2c 20 20 20 20 20 20 34 2c 20       4,      4, 
1180: 20 20 20 34 2c 20 20 20 20 20 20 20 34 2c 20 20     4,       4,  
1190: 20 36 2c 20 20 7d 2c 0a 20 20 20 20 20 2f 2a 20   6,  },.     /* 
11a0: 36 20 20 20 20 20 45 4e 44 3a 20 2a 2f 20 7b 20  6     END: */ { 
11b0: 20 20 20 30 2c 20 20 36 2c 20 20 20 20 20 34 2c     0,  6,     4,
11c0: 20 20 20 20 20 20 34 2c 20 20 20 20 20 20 34 2c        4,      4,
11d0: 20 20 20 20 34 2c 20 20 20 20 20 20 20 34 2c 20      4,       4, 
11e0: 20 20 34 2c 20 20 7d 2c 0a 20 20 7d 3b 0a 23 65    4,  },.  };.#e
11f0: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 72 69 67  lse.  /* If trig
1200: 67 65 72 73 20 61 72 65 20 6e 6f 74 20 73 75 70  gers are not sup
1210: 70 6f 72 65 64 20 62 79 20 74 68 69 73 20 63 6f  pored by this co
1220: 6d 70 69 6c 65 20 74 68 65 6e 20 74 68 65 20 73  mpile then the s
1230: 74 61 74 65 6d 65 6e 74 20 6d 61 63 68 69 6e 65  tatement machine
1240: 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 64 65  .  ** used to de
1250: 74 65 63 74 20 74 68 65 20 65 6e 64 20 6f 66 20  tect the end of 
1260: 61 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6d  a statement is m
1270: 75 63 68 20 73 69 6d 70 6c 69 65 72 0a 20 20 2a  uch simplier.  *
1280: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
1290: 20 75 38 20 74 72 61 6e 73 5b 32 5d 5b 33 5d 20   u8 trans[2][3] 
12a0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
12b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65           /* Toke
12c0: 6e 3a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  n:           */.
12d0: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 3a 20 20       /* State:  
12e0: 20 20 20 20 20 2a 2a 20 20 53 45 4d 49 20 20 57       **  SEMI  W
12f0: 53 20 20 4f 54 48 45 52 20 2a 2f 0a 20 20 20 20  S  OTHER */.    
1300: 20 2f 2a 20 30 20 20 20 53 54 41 52 54 3a 20 2a   /* 0   START: *
1310: 2f 20 7b 20 20 20 20 30 2c 20 20 30 2c 20 20 20  / {    0,  0,   
1320: 20 20 31 2c 20 7d 2c 0a 20 20 20 20 20 2f 2a 20    1, },.     /* 
1330: 31 20 20 4e 4f 52 4d 41 4c 3a 20 2a 2f 20 7b 20  1  NORMAL: */ { 
1340: 20 20 20 30 2c 20 20 31 2c 20 20 20 20 20 31 2c     0,  1,     1,
1350: 20 7d 2c 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 20   },.  };.#endif 
1360: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
1370: 52 49 47 47 45 52 20 2a 2f 0a 0a 20 20 77 68 69  RIGGER */..  whi
1380: 6c 65 28 20 2a 7a 53 71 6c 20 29 7b 0a 20 20 20  le( *zSql ){.   
1390: 20 73 77 69 74 63 68 28 20 2a 7a 53 71 6c 20 29   switch( *zSql )
13a0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 3b 27  {.      case ';'
13b0: 3a 20 7b 20 20 2f 2a 20 41 20 73 65 6d 69 63 6f  : {  /* A semico
13c0: 6c 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  lon */.        t
13d0: 6f 6b 65 6e 20 3d 20 74 6b 53 45 4d 49 3b 0a 20  oken = tkSEMI;. 
13e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
1400: 20 27 20 27 3a 0a 20 20 20 20 20 20 63 61 73 65   ' ':.      case
1410: 20 27 5c 72 27 3a 0a 20 20 20 20 20 20 63 61 73   '\r':.      cas
1420: 65 20 27 5c 74 27 3a 0a 20 20 20 20 20 20 63 61  e '\t':.      ca
1430: 73 65 20 27 5c 6e 27 3a 0a 20 20 20 20 20 20 63  se '\n':.      c
1440: 61 73 65 20 27 5c 66 27 3a 20 7b 20 20 2f 2a 20  ase '\f': {  /* 
1450: 57 68 69 74 65 20 73 70 61 63 65 20 69 73 20 69  White space is i
1460: 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  gnored */.      
1470: 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 57 53 3b 0a    token = tkWS;.
1480: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
14a0: 65 20 27 2f 27 3a 20 7b 20 20 20 2f 2a 20 43 2d  e '/': {   /* C-
14b0: 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a  style comments *
14c0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  /.        if( zS
14d0: 71 6c 5b 31 5d 21 3d 27 2a 27 20 29 7b 0a 20 20  ql[1]!='*' ){.  
14e0: 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20          token = 
14f0: 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20 20 20  tkOTHER;.       
1500: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1510: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 71 6c    }.        zSql
1520: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 77   += 2;.        w
1530: 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26  hile( zSql[0] &&
1540: 20 28 7a 53 71 6c 5b 30 5d 21 3d 27 2a 27 20 7c   (zSql[0]!='*' |
1550: 7c 20 7a 53 71 6c 5b 31 5d 21 3d 27 2f 27 29 20  | zSql[1]!='/') 
1560: 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 20  ){ zSql++; }.   
1570: 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 30 5d       if( zSql[0]
1580: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1590: 20 20 20 20 20 20 20 20 7a 53 71 6c 2b 2b 3b 0a          zSql++;.
15a0: 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20          token = 
15b0: 74 6b 57 53 3b 0a 20 20 20 20 20 20 20 20 62 72  tkWS;.        br
15c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15d0: 20 20 20 63 61 73 65 20 27 2d 27 3a 20 7b 20 20     case '-': {  
15e0: 20 2f 2a 20 53 51 4c 2d 73 74 79 6c 65 20 63 6f   /* SQL-style co
15f0: 6d 6d 65 6e 74 73 20 66 72 6f 6d 20 22 2d 2d 22  mments from "--"
1600: 20 74 6f 20 65 6e 64 20 6f 66 20 6c 69 6e 65 20   to end of line 
1610: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
1620: 53 71 6c 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20  Sql[1]!='-' ){. 
1630: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d           token =
1640: 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20 20   tkOTHER;.      
1650: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69     }.        whi
1670: 6c 65 28 20 2a 7a 53 71 6c 20 26 26 20 2a 7a 53  le( *zSql && *zS
1680: 71 6c 21 3d 27 5c 6e 27 20 29 7b 20 7a 53 71 6c  ql!='\n' ){ zSql
1690: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ++; }.        if
16a0: 28 20 2a 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  ( *zSql==0 ) ret
16b0: 75 72 6e 20 73 74 61 74 65 3d 3d 30 3b 0a 20 20  urn state==0;.  
16c0: 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b        token = tk
16d0: 57 53 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  WS;.        brea
16e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
16f0: 20 63 61 73 65 20 27 5b 27 3a 20 7b 20 20 20 2f   case '[': {   /
1700: 2a 20 4d 69 63 72 6f 73 6f 66 74 2d 73 74 79 6c  * Microsoft-styl
1710: 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  e identifiers in
1720: 20 5b 2e 2e 2e 5d 20 2a 2f 0a 20 20 20 20 20 20   [...] */.      
1730: 20 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20    zSql++;.      
1740: 20 20 77 68 69 6c 65 28 20 2a 7a 53 71 6c 20 26    while( *zSql &
1750: 26 20 2a 7a 53 71 6c 21 3d 27 5d 27 20 29 7b 20  & *zSql!=']' ){ 
1760: 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  zSql++; }.      
1770: 20 20 69 66 28 20 2a 7a 53 71 6c 3d 3d 30 20 29    if( *zSql==0 )
1780: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1790: 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48     token = tkOTH
17a0: 45 52 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ER;.        brea
17b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
17c0: 20 63 61 73 65 20 27 60 27 3a 20 20 20 20 20 2f   case '`':     /
17d0: 2a 20 47 72 61 76 65 2d 61 63 63 65 6e 74 20 71  * Grave-accent q
17e0: 75 6f 74 65 64 20 73 79 6d 62 6f 6c 73 20 75 73  uoted symbols us
17f0: 65 64 20 62 79 20 4d 79 53 51 4c 20 2a 2f 0a 20  ed by MySQL */. 
1800: 20 20 20 20 20 63 61 73 65 20 27 22 27 3a 20 20       case '"':  
1810: 20 20 20 2f 2a 20 73 69 6e 67 6c 65 2d 20 61 6e     /* single- an
1820: 64 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  d double-quoted 
1830: 73 74 72 69 6e 67 73 20 2a 2f 0a 20 20 20 20 20  strings */.     
1840: 20 63 61 73 65 20 27 5c 27 27 3a 20 7b 0a 20 20   case '\'': {.  
1850: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 7a        int c = *z
1860: 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 7a 53 71  Sql;.        zSq
1870: 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77 68 69  l++;.        whi
1880: 6c 65 28 20 2a 7a 53 71 6c 20 26 26 20 2a 7a 53  le( *zSql && *zS
1890: 71 6c 21 3d 63 20 29 7b 20 7a 53 71 6c 2b 2b 3b  ql!=c ){ zSql++;
18a0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a   }.        if( *
18b0: 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
18c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 74 6f 6b 65   0;.        toke
18d0: 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20  n = tkOTHER;.   
18e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18f0: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
1900: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t: {.        int
1910: 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   c;.        if( 
1920: 49 64 43 68 61 72 28 28 75 38 29 2a 7a 53 71 6c  IdChar((u8)*zSql
1930: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
1940: 2a 20 4b 65 79 77 6f 72 64 73 20 61 6e 64 20 75  * Keywords and u
1950: 6e 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66 69  nquoted identifi
1960: 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ers */.         
1970: 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20   int nId;.      
1980: 20 20 20 20 66 6f 72 28 6e 49 64 3d 31 3b 20 49      for(nId=1; I
1990: 64 43 68 61 72 28 7a 53 71 6c 5b 6e 49 64 5d 29  dChar(zSql[nId])
19a0: 3b 20 6e 49 64 2b 2b 29 7b 7d 0a 23 69 66 64 65  ; nId++){}.#ifde
19b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
19c0: 49 47 47 45 52 0a 20 20 20 20 20 20 20 20 20 20  IGGER.          
19d0: 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b  token = tkOTHER;
19e0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
19f0: 20 73 77 69 74 63 68 28 20 2a 7a 53 71 6c 20 29   switch( *zSql )
1a00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
1a10: 73 65 20 27 63 27 3a 20 63 61 73 65 20 27 43 27  se 'c': case 'C'
1a20: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
1a30: 20 20 69 66 28 20 6e 49 64 3d 3d 36 20 26 26 20    if( nId==6 && 
1a40: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1a50: 7a 53 71 6c 2c 20 22 63 72 65 61 74 65 22 2c 20  zSql, "create", 
1a60: 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
1a70: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d           token =
1a80: 20 74 6b 43 52 45 41 54 45 3b 0a 20 20 20 20 20   tkCREATE;.     
1a90: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b  token = tkOTHER;
1ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
1ae0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1af0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b00: 63 61 73 65 20 27 74 27 3a 20 63 61 73 65 20 27  case 't': case '
1b10: 54 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  T': {.          
1b20: 20 20 20 20 69 66 28 20 6e 49 64 3d 3d 37 20 26      if( nId==7 &
1b30: 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
1b40: 70 28 7a 53 71 6c 2c 20 22 74 72 69 67 67 65 72  p(zSql, "trigger
1b50: 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65              toke
1b70: 6e 20 3d 20 74 6b 54 52 49 47 47 45 52 3b 0a 20  n = tkTRIGGER;. 
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
1b90: 73 65 20 69 66 28 20 6e 49 64 3d 3d 34 20 26 26  se if( nId==4 &&
1ba0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1bb0: 28 7a 53 71 6c 2c 20 22 74 65 6d 70 22 2c 20 34  (zSql, "temp", 4
1bc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1bd0: 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20          token = 
1be0: 74 6b 54 45 4d 50 3b 0a 20 20 20 20 20 20 20 20  tkTEMP;.        
1bf0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c00: 6e 49 64 3d 3d 39 20 26 26 20 73 71 6c 69 74 65  nId==9 && sqlite
1c10: 33 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20  3StrNICmp(zSql, 
1c20: 22 74 65 6d 70 6f 72 61 72 79 22 2c 20 39 29 3d  "temporary", 9)=
1c30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1c40: 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b        token = tk
1c50: 54 45 4d 50 3b 0a 20 20 20 20 20 20 20 20 20 20  TEMP;.          
1c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c70: 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e             token
1c80: 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20   = tkOTHER;.    
1c90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ca0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
1cd0: 27 65 27 3a 20 20 63 61 73 65 20 27 45 27 3a 20  'e':  case 'E': 
1ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cf0: 69 66 28 20 6e 49 64 3d 3d 33 20 26 26 20 73 71  if( nId==3 && sq
1d00: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 53  lite3StrNICmp(zS
1d10: 71 6c 2c 20 22 65 6e 64 22 2c 20 33 29 3d 3d 30  ql, "end", 3)==0
1d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d30: 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 45 4e      token = tkEN
1d40: 44 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D;.             
1d50: 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
1d60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
1d70: 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  IN.             
1d80: 20 69 66 28 20 6e 49 64 3d 3d 37 20 26 26 20 73   if( nId==7 && s
1d90: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
1da0: 53 71 6c 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20  Sql, "explain", 
1db0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
1dc0: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d           token =
1dd0: 20 74 6b 45 58 50 4c 41 49 4e 3b 0a 20 20 20 20   tkEXPLAIN;.    
1de0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a            }else.
1df0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
1e00: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
1e10: 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74         token = t
1e20: 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20 20 20 20  kOTHER;.        
1e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e60: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
1e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e80: 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b  token = tkOTHER;
1e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
1ea0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1eb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1ec0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ed0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 2a 2f  _OMIT_TRIGGER */
1ee0: 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20  .          zSql 
1ef0: 2b 3d 20 6e 49 64 2d 31 3b 0a 20 20 20 20 20 20  += nId-1;.      
1f00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f10: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73 20     /* Operators 
1f20: 61 6e 64 20 73 70 65 63 69 61 6c 20 73 79 6d 62  and special symb
1f30: 6f 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ols */.         
1f40: 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52   token = tkOTHER
1f50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61   }.    }.    sta
1f80: 74 65 20 3d 20 74 72 61 6e 73 5b 73 74 61 74 65  te = trans[state
1f90: 5d 5b 74 6f 6b 65 6e 5d 3b 0a 20 20 20 20 7a 53  ][token];.    zS
1fa0: 71 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ql++;.  }.  retu
1fb0: 72 6e 20 73 74 61 74 65 3d 3d 30 3b 0a 7d 0a 0a  rn state==0;.}..
1fc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fd0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1fe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ff0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2000: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
2010: 28 29 20 72 6f 75 74 69 6e 65 20 64 65 73 63 72  () routine descr
2020: 69 62 65 64 0a 2a 2a 20 61 62 6f 76 65 2c 20 65  ibed.** above, e
2030: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 70  xcept that the p
2040: 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 71 75  arameter is requ
2050: 69 72 65 64 20 74 6f 20 62 65 20 55 54 46 2d 31  ired to be UTF-1
2060: 36 20 65 6e 63 6f 64 65 64 2c 20 6e 6f 74 0a 2a  6 encoded, not.*
2070: 2a 20 55 54 46 2d 38 2e 0a 2a 2f 0a 69 6e 74 20  * UTF-8..*/.int 
2080: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
2090: 31 36 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  16(const void *z
20a0: 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Sql){.  sqlite3_
20b0: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 63  value *pVal;.  c
20c0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 38  har const *zSql8
20d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 23 69 66 6e  ITE_NOMEM;..#ifn
20f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2100: 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
2110: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
2120: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
2130: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
2140: 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  if.  pVal = sqli
2150: 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
2160: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
2170: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a  tStr(pVal, -1, z
2180: 53 71 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Sql, SQLITE_UTF1
2190: 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f  6NATIVE, SQLITE_
21a0: 53 54 41 54 49 43 29 3b 0a 20 20 7a 53 71 6c 38  STATIC);.  zSql8
21b0: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
21c0: 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
21d0: 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 53  _UTF8);.  if( zS
21e0: 71 6c 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ql8 ){.    rc = 
21f0: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
2200: 28 7a 53 71 6c 38 29 3b 0a 20 20 7d 65 6c 73 65  (zSql8);.  }else
2210: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2220: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
2230: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
2240: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
2250: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
2260: 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  , rc);.}.#endif 
2270: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
2280: 54 46 31 36 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  TF16 */.#endif /
2290: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
22a0: 4d 50 4c 45 54 45 20 2a 2f 0a                    MPLETE */.