/ Hex Artifact Content
Login

Artifact 4de937dfdd4c79a501772ab2035b26082f337a79:


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 2a 0a 2a 2a 20 24 49 64 3a  e it..**.** $Id:
0290: 20 63 6f 6d 70 6c 65 74 65 2e 63 2c 76 20 31 2e   complete.c,v 1.
02a0: 31 20 32 30 30 35 2f 30 38 2f 31 34 20 31 37 3a  1 2005/08/14 17:
02b0: 35 33 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a  53:21 drh Exp $.
02c0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
02d0: 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 6e 64 65  iteInt.h".#ifnde
02e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
02f0: 4d 50 4c 45 54 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  MPLETE../*.** Th
0300: 69 73 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e  is is defined in
0310: 20 74 6f 6b 65 6e 69 7a 65 2e 63 2e 20 20 57 65   tokenize.c.  We
0320: 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 69 6d   just have to im
0330: 70 6f 72 74 20 74 68 65 20 64 65 66 69 6e 69 74  port the definit
0340: 69 6f 6e 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 63  ion..*/.extern c
0350: 6f 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65  onst char sqlite
0360: 33 49 73 49 64 43 68 61 72 5b 5d 3b 0a 23 64 65  3IsIdChar[];.#de
0370: 66 69 6e 65 20 49 64 43 68 61 72 28 43 29 20 20  fine IdChar(C)  
0380: 28 28 28 63 3d 43 29 26 30 78 38 30 29 21 3d 30  (((c=C)&0x80)!=0
0390: 20 7c 7c 20 28 63 3e 30 78 31 66 20 26 26 20 73   || (c>0x1f && s
03a0: 71 6c 69 74 65 33 49 73 49 64 43 68 61 72 5b 63  qlite3IsIdChar[c
03b0: 2d 30 78 32 30 5d 29 29 0a 0a 0a 2f 2a 0a 2a 2a  -0x20])).../*.**
03c0: 20 54 6f 6b 65 6e 20 74 79 70 65 73 20 75 73 65   Token types use
03d0: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
03e0: 5f 63 6f 6d 70 6c 65 74 65 28 29 20 72 6f 75 74  _complete() rout
03f0: 69 6e 65 2e 20 20 53 65 65 20 74 68 65 20 68 65  ine.  See the he
0400: 61 64 65 72 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73  ader.** comments
0410: 20 6f 6e 20 74 68 61 74 20 70 72 6f 63 65 64 75   on that procedu
0420: 72 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  re for additiona
0430: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0440: 2f 0a 23 64 65 66 69 6e 65 20 74 6b 53 45 4d 49  /.#define tkSEMI
0450: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 74 6b      0.#define tk
0460: 57 53 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e  WS      1.#defin
0470: 65 20 74 6b 4f 54 48 45 52 20 20 20 32 0a 23 64  e tkOTHER   2.#d
0480: 65 66 69 6e 65 20 74 6b 45 58 50 4c 41 49 4e 20  efine tkEXPLAIN 
0490: 33 0a 23 64 65 66 69 6e 65 20 74 6b 43 52 45 41  3.#define tkCREA
04a0: 54 45 20 20 34 0a 23 64 65 66 69 6e 65 20 74 6b  TE  4.#define tk
04b0: 54 45 4d 50 20 20 20 20 35 0a 23 64 65 66 69 6e  TEMP    5.#defin
04c0: 65 20 74 6b 54 52 49 47 47 45 52 20 36 0a 23 64  e tkTRIGGER 6.#d
04d0: 65 66 69 6e 65 20 74 6b 45 4e 44 20 20 20 20 20  efine tkEND     
04e0: 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  7../*.** Return 
04f0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
0500: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 65 6e 64  n SQL string end
0510: 73 20 69 6e 20 61 20 73 65 6d 69 63 6f 6c 6f 6e  s in a semicolon
0520: 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20  ..**.** Special 
0530: 68 61 6e 64 6c 69 6e 67 20 69 73 20 72 65 71 75  handling is requ
0540: 69 72 65 20 66 6f 72 20 43 52 45 41 54 45 20 54  ire for CREATE T
0550: 52 49 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74  RIGGER statement
0560: 73 2e 0a 2a 2a 20 57 68 65 6e 65 76 65 72 20 74  s..** Whenever t
0570: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
0580: 52 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 73  R keywords are s
0590: 65 65 6e 2c 20 74 68 65 20 73 74 61 74 65 6d 65  een, the stateme
05a0: 6e 74 0a 2a 2a 20 6d 75 73 74 20 65 6e 64 20 77  nt.** must end w
05b0: 69 74 68 20 22 3b 45 4e 44 3b 22 2e 0a 2a 2a 0a  ith ";END;"..**.
05c0: 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e  ** This implemen
05d0: 74 61 74 69 6f 6e 20 75 73 65 73 20 61 20 73 74  tation uses a st
05e0: 61 74 65 20 6d 61 63 68 69 6e 65 20 77 69 74 68  ate machine with
05f0: 20 37 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a   7 states:.**.**
0600: 20 20 20 28 30 29 20 53 54 41 52 54 20 20 20 20     (0) START    
0610: 20 41 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   At the beginnin
0620: 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 53  g or end of an S
0630: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  QL statement.  T
0640: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 20  his routine.**  
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
0660: 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 65  eturns 1 if it e
0670: 6e 64 73 20 69 6e 20 74 68 65 20 53 54 41 52 54  nds in the START
0680: 20 73 74 61 74 65 20 61 6e 64 20 30 20 69 66 20   state and 0 if 
0690: 69 74 20 65 6e 64 73 0a 2a 2a 20 20 20 20 20 20  it ends.**      
06a0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 6e             in an
06b0: 79 20 6f 74 68 65 72 20 73 74 61 74 65 2e 0a 2a  y other state..*
06c0: 2a 0a 2a 2a 20 20 20 28 31 29 20 4e 4f 52 4d 41  *.**   (1) NORMA
06d0: 4c 20 20 20 20 57 65 20 61 72 65 20 69 6e 20 74  L    We are in t
06e0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 73 74 61  he middle of sta
06f0: 74 65 6d 65 6e 74 20 77 68 69 63 68 20 65 6e 64  tement which end
0700: 73 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 0a  s with a single.
0710: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0720: 20 20 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a     semicolon..**
0730: 0a 2a 2a 20 20 20 28 32 29 20 45 58 50 4c 41 49  .**   (2) EXPLAI
0740: 4e 20 20 20 54 68 65 20 6b 65 79 77 6f 72 64 20  N   The keyword 
0750: 45 58 50 4c 41 49 4e 20 68 61 73 20 62 65 65 6e  EXPLAIN has been
0760: 20 73 65 65 6e 20 61 74 20 74 68 65 20 62 65 67   seen at the beg
0770: 69 6e 6e 69 6e 67 20 6f 66 20 0a 2a 2a 20 20 20  inning of .**   
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 20                a 
0790: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
07a0: 20 20 20 28 33 29 20 43 52 45 41 54 45 20 20 20     (3) CREATE   
07b0: 20 54 68 65 20 6b 65 79 77 6f 72 64 20 43 52 45   The keyword CRE
07c0: 41 54 45 20 68 61 73 20 62 65 65 6e 20 73 65 65  ATE has been see
07d0: 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
07e0: 6e 67 20 6f 66 20 61 0a 2a 2a 20 20 20 20 20 20  ng of a.**      
07f0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0800: 6d 65 6e 74 2c 20 70 6f 73 73 69 62 6c 79 20 70  ment, possibly p
0810: 72 65 63 65 65 64 65 64 20 62 79 20 45 58 50 4c  receeded by EXPL
0820: 41 49 4e 20 61 6e 64 2f 6f 72 20 66 6f 6c 6c 6f  AIN and/or follo
0830: 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
0840: 20 20 20 20 20 20 20 20 20 20 54 45 4d 50 20 6f            TEMP o
0850: 72 20 54 45 4d 50 4f 52 41 52 59 0a 2a 2a 0a 2a  r TEMPORARY.**.*
0860: 2a 20 20 20 28 34 29 20 54 52 49 47 47 45 52 20  *   (4) TRIGGER 
0870: 20 20 57 65 20 61 72 65 20 69 6e 20 74 68 65 20    We are in the 
0880: 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 69 67  middle of a trig
0890: 67 65 72 20 64 65 66 69 6e 69 74 69 6f 6e 20 74  ger definition t
08a0: 68 61 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20  hat must be.**  
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
08c0: 6e 64 65 64 20 62 79 20 61 20 73 65 6d 69 63 6f  nded by a semico
08d0: 6c 6f 6e 2c 20 74 68 65 20 6b 65 79 77 6f 72 64  lon, the keyword
08e0: 20 45 4e 44 2c 20 61 6e 64 20 61 6e 6f 74 68 65   END, and anothe
08f0: 72 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a 0a  r semicolon..**.
0900: 2a 2a 20 20 20 28 35 29 20 53 45 4d 49 20 20 20  **   (5) SEMI   
0910: 20 20 20 57 65 27 76 65 20 73 65 65 6e 20 74 68     We've seen th
0920: 65 20 66 69 72 73 74 20 73 65 6d 69 63 6f 6c 6f  e first semicolo
0930: 6e 20 69 6e 20 74 68 65 20 22 3b 45 4e 44 3b 22  n in the ";END;"
0940: 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 0a   that occurs at.
0950: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0960: 20 20 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20     the end of a 
0970: 74 72 69 67 67 65 72 20 64 65 66 69 6e 69 74 69  trigger definiti
0980: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  on..**.**   (6) 
0990: 45 4e 44 20 20 20 20 20 20 20 57 65 27 76 65 20  END       We've 
09a0: 73 65 65 6e 20 74 68 65 20 22 3b 45 4e 44 22 20  seen the ";END" 
09b0: 6f 66 20 74 68 65 20 22 3b 45 4e 44 3b 22 20 74  of the ";END;" t
09c0: 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
09d0: 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  e end.**        
09e0: 20 20 20 20 20 20 20 20 20 6f 66 20 61 20 74 72           of a tr
09f0: 69 67 67 65 72 20 64 69 66 69 6e 69 74 69 6f 6e  igger difinition
0a00: 2e 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 69 74 69  ..**.** Transiti
0a10: 6f 6e 73 20 62 65 74 77 65 65 6e 20 73 74 61 74  ons between stat
0a20: 65 73 20 61 62 6f 76 65 20 61 72 65 20 64 65 74  es above are det
0a30: 65 72 6d 69 6e 65 64 20 62 79 20 74 6f 6b 65 6e  ermined by token
0a40: 73 20 65 78 74 72 61 63 74 65 64 0a 2a 2a 20 66  s extracted.** f
0a50: 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 2e 20 20  rom the input.  
0a60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f  The following to
0a70: 6b 65 6e 73 20 61 72 65 20 73 69 67 6e 69 66 69  kens are signifi
0a80: 63 61 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 30  cant:.**.**   (0
0a90: 29 20 74 6b 53 45 4d 49 20 20 20 20 20 20 41 20  ) tkSEMI      A 
0aa0: 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a 20 20 20  semicolon..**   
0ab0: 28 31 29 20 74 6b 57 53 20 20 20 20 20 20 20 20  (1) tkWS        
0ac0: 57 68 69 74 65 73 70 61 63 65 0a 2a 2a 20 20 20  Whitespace.**   
0ad0: 28 32 29 20 74 6b 4f 54 48 45 52 20 20 20 20 20  (2) tkOTHER     
0ae0: 41 6e 79 20 6f 74 68 65 72 20 53 51 4c 20 74 6f  Any other SQL to
0af0: 6b 65 6e 2e 0a 2a 2a 20 20 20 28 33 29 20 74 6b  ken..**   (3) tk
0b00: 45 58 50 4c 41 49 4e 20 20 20 54 68 65 20 22 65  EXPLAIN   The "e
0b10: 78 70 6c 61 69 6e 22 20 6b 65 79 77 6f 72 64 2e  xplain" keyword.
0b20: 0a 2a 2a 20 20 20 28 34 29 20 74 6b 43 52 45 41  .**   (4) tkCREA
0b30: 54 45 20 20 20 20 54 68 65 20 22 63 72 65 61 74  TE    The "creat
0b40: 65 22 20 6b 65 79 77 6f 72 64 2e 0a 2a 2a 20 20  e" keyword..**  
0b50: 20 28 35 29 20 74 6b 54 45 4d 50 20 20 20 20 20   (5) tkTEMP     
0b60: 20 54 68 65 20 22 74 65 6d 70 22 20 6f 72 20 22   The "temp" or "
0b70: 74 65 6d 70 6f 72 61 72 79 22 20 6b 65 79 77 6f  temporary" keywo
0b80: 72 64 2e 0a 2a 2a 20 20 20 28 36 29 20 74 6b 54  rd..**   (6) tkT
0b90: 52 49 47 47 45 52 20 20 20 54 68 65 20 22 74 72  RIGGER   The "tr
0ba0: 69 67 67 65 72 22 20 6b 65 79 77 6f 72 64 2e 0a  igger" keyword..
0bb0: 2a 2a 20 20 20 28 37 29 20 74 6b 45 4e 44 20 20  **   (7) tkEND  
0bc0: 20 20 20 20 20 54 68 65 20 22 65 6e 64 22 20 6b       The "end" k
0bd0: 65 79 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  eyword..**.** Wh
0be0: 69 74 65 73 70 61 63 65 20 6e 65 76 65 72 20 63  itespace never c
0bf0: 61 75 73 65 73 20 61 20 73 74 61 74 65 20 74 72  auses a state tr
0c00: 61 6e 73 69 74 69 6f 6e 20 61 6e 64 20 69 73 20  ansition and is 
0c10: 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64 2e 0a  always ignored..
0c20: 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 63 6f 6d 70  **.** If we comp
0c30: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c40: 4f 4d 49 54 5f 54 52 49 47 47 45 52 2c 20 61 6c  OMIT_TRIGGER, al
0c50: 6c 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 61  l of the computa
0c60: 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a 20 74  tion needed.** t
0c70: 6f 20 72 65 63 6f 67 6e 69 7a 65 20 74 68 65 20  o recognize the 
0c80: 65 6e 64 20 6f 66 20 61 20 74 72 69 67 67 65 72  end of a trigger
0c90: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
0ca0: 20 20 41 6c 6c 20 77 65 20 68 61 76 65 20 74 6f    All we have to
0cb0: 20 64 6f 0a 2a 2a 20 69 73 20 6c 6f 6f 6b 20 66   do.** is look f
0cc0: 6f 72 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  or a semicolon t
0cd0: 68 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  hat is not part 
0ce0: 6f 66 20 61 6e 20 73 74 72 69 6e 67 20 6f 72 20  of an string or 
0cf0: 63 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  comment..*/.int 
0d00: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
0d10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71  (const char *zSq
0d20: 6c 29 7b 0a 20 20 75 38 20 73 74 61 74 65 20 3d  l){.  u8 state =
0d30: 20 30 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e 74   0;   /* Current
0d40: 20 73 74 61 74 65 2c 20 75 73 69 6e 67 20 6e 75   state, using nu
0d50: 6d 62 65 72 73 20 64 65 66 69 6e 65 64 20 69 6e  mbers defined in
0d60: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
0d70: 2a 2f 0a 20 20 75 38 20 74 6f 6b 65 6e 3b 20 20  */.  u8 token;  
0d80: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
0d90: 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 20   the next token 
0da0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0db0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
0dc0: 20 20 2f 2a 20 41 20 63 6f 6d 70 6c 65 78 20 73    /* A complex s
0dd0: 74 61 74 65 6d 65 6e 74 20 6d 61 63 68 69 6e 65  tatement machine
0de0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 63 74 20   used to detect 
0df0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 43 52 45  the end of a CRE
0e00: 41 54 45 20 54 52 49 47 47 45 52 0a 20 20 2a 2a  ATE TRIGGER.  **
0e10: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
0e20: 73 20 69 73 20 74 68 65 20 6e 6f 72 6d 61 6c 20  s is the normal 
0e30: 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 74 61  case..  */.  sta
0e40: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 72 61  tic const u8 tra
0e50: 6e 73 5b 37 5d 5b 38 5d 20 3d 20 7b 0a 20 20 20  ns[7][8] = {.   
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 2f 2a 20 54 6f 6b 65 6e 3a 20 20 20 20 20    /* Token:     
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
0eb0: 20 20 20 2f 2a 20 53 74 61 74 65 3a 20 20 20 20     /* State:    
0ec0: 20 20 20 2a 2a 20 20 53 45 4d 49 20 20 57 53 20     **  SEMI  WS 
0ed0: 20 4f 54 48 45 52 20 45 58 50 4c 41 49 4e 20 20   OTHER EXPLAIN  
0ee0: 43 52 45 41 54 45 20 20 54 45 4d 50 20 20 54 52  CREATE  TEMP  TR
0ef0: 49 47 47 45 52 20 20 45 4e 44 20 20 2a 2f 0a 20  IGGER  END  */. 
0f00: 20 20 20 20 2f 2a 20 30 20 20 20 53 54 41 52 54      /* 0   START
0f10: 3a 20 2a 2f 20 7b 20 20 20 20 30 2c 20 20 30 2c  : */ {    0,  0,
0f20: 20 20 20 20 20 31 2c 20 20 20 20 20 20 32 2c 20       1,      2, 
0f30: 20 20 20 20 20 33 2c 20 20 20 20 31 2c 20 20 20       3,    1,   
0f40: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 7d 2c 0a      1,   1,  },.
0f50: 20 20 20 20 20 2f 2a 20 31 20 20 4e 4f 52 4d 41       /* 1  NORMA
0f60: 4c 3a 20 2a 2f 20 7b 20 20 20 20 30 2c 20 20 31  L: */ {    0,  1
0f70: 2c 20 20 20 20 20 31 2c 20 20 20 20 20 20 31 2c  ,     1,      1,
0f80: 20 20 20 20 20 20 31 2c 20 20 20 20 31 2c 20 20        1,    1,  
0f90: 20 20 20 20 20 31 2c 20 20 20 31 2c 20 20 7d 2c       1,   1,  },
0fa0: 0a 20 20 20 20 20 2f 2a 20 32 20 45 58 50 4c 41  .     /* 2 EXPLA
0fb0: 49 4e 3a 20 2a 2f 20 7b 20 20 20 20 30 2c 20 20  IN: */ {    0,  
0fc0: 32 2c 20 20 20 20 20 31 2c 20 20 20 20 20 20 31  2,     1,      1
0fd0: 2c 20 20 20 20 20 20 33 2c 20 20 20 20 31 2c 20  ,      3,    1, 
0fe0: 20 20 20 20 20 20 31 2c 20 20 20 31 2c 20 20 7d        1,   1,  }
0ff0: 2c 0a 20 20 20 20 20 2f 2a 20 33 20 20 43 52 45  ,.     /* 3  CRE
1000: 41 54 45 3a 20 2a 2f 20 7b 20 20 20 20 30 2c 20  ATE: */ {    0, 
1010: 20 33 2c 20 20 20 20 20 31 2c 20 20 20 20 20 20   3,     1,      
1020: 31 2c 20 20 20 20 20 20 31 2c 20 20 20 20 33 2c  1,      1,    3,
1030: 20 20 20 20 20 20 20 34 2c 20 20 20 31 2c 20 20         4,   1,  
1040: 7d 2c 0a 20 20 20 20 20 2f 2a 20 34 20 54 52 49  },.     /* 4 TRI
1050: 47 47 45 52 3a 20 2a 2f 20 7b 20 20 20 20 35 2c  GGER: */ {    5,
1060: 20 20 34 2c 20 20 20 20 20 34 2c 20 20 20 20 20    4,     4,     
1070: 20 34 2c 20 20 20 20 20 20 34 2c 20 20 20 20 34   4,      4,    4
1080: 2c 20 20 20 20 20 20 20 34 2c 20 20 20 34 2c 20  ,       4,   4, 
1090: 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 35 20 20 20   },.     /* 5   
10a0: 20 53 45 4d 49 3a 20 2a 2f 20 7b 20 20 20 20 35   SEMI: */ {    5
10b0: 2c 20 20 35 2c 20 20 20 20 20 34 2c 20 20 20 20  ,  5,     4,    
10c0: 20 20 34 2c 20 20 20 20 20 20 34 2c 20 20 20 20    4,      4,    
10d0: 34 2c 20 20 20 20 20 20 20 34 2c 20 20 20 36 2c  4,       4,   6,
10e0: 20 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 36 20 20    },.     /* 6  
10f0: 20 20 20 45 4e 44 3a 20 2a 2f 20 7b 20 20 20 20     END: */ {    
1100: 30 2c 20 20 36 2c 20 20 20 20 20 34 2c 20 20 20  0,  6,     4,   
1110: 20 20 20 34 2c 20 20 20 20 20 20 34 2c 20 20 20     4,      4,   
1120: 20 34 2c 20 20 20 20 20 20 20 34 2c 20 20 20 34   4,       4,   4
1130: 2c 20 20 7d 2c 0a 20 20 7d 3b 0a 23 65 6c 73 65  ,  },.  };.#else
1140: 0a 20 20 2f 2a 20 49 66 20 74 72 69 67 67 65 72  .  /* If trigger
1150: 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72  s are not suppor
1160: 65 64 20 62 79 20 74 68 69 73 20 63 6f 6d 70 69  ed by this compi
1170: 6c 65 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  le then the stat
1180: 65 6d 65 6e 74 20 6d 61 63 68 69 6e 65 0a 20 20  ement machine.  
1190: 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74 65 63  ** used to detec
11a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 73  t the end of a s
11b0: 74 61 74 65 6d 65 6e 74 20 69 73 20 6d 75 63 68  tatement is much
11c0: 20 73 69 6d 70 6c 69 65 72 0a 20 20 2a 2f 0a 20   simplier.  */. 
11d0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
11e0: 20 74 72 61 6e 73 5b 32 5d 5b 33 5d 20 3d 20 7b   trans[2][3] = {
11f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1200: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 3a 20        /* Token: 
1210: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1220: 20 20 2f 2a 20 53 74 61 74 65 3a 20 20 20 20 20    /* State:     
1230: 20 20 2a 2a 20 20 53 45 4d 49 20 20 57 53 20 20    **  SEMI  WS  
1240: 4f 54 48 45 52 20 2a 2f 0a 20 20 20 20 20 2f 2a  OTHER */.     /*
1250: 20 30 20 20 20 53 54 41 52 54 3a 20 2a 2f 20 7b   0   START: */ {
1260: 20 20 20 20 30 2c 20 20 30 2c 20 20 20 20 20 31      0,  0,     1
1270: 2c 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 31 20 20  , },.     /* 1  
1280: 4e 4f 52 4d 41 4c 3a 20 2a 2f 20 7b 20 20 20 20  NORMAL: */ {    
1290: 30 2c 20 20 31 2c 20 20 20 20 20 31 2c 20 7d 2c  0,  1,     1, },
12a0: 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  .  };.#endif /* 
12b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
12c0: 47 45 52 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28  GER */..  while(
12d0: 20 2a 7a 53 71 6c 20 29 7b 0a 20 20 20 20 73 77   *zSql ){.    sw
12e0: 69 74 63 68 28 20 2a 7a 53 71 6c 20 29 7b 0a 20  itch( *zSql ){. 
12f0: 20 20 20 20 20 63 61 73 65 20 27 3b 27 3a 20 7b       case ';': {
1300: 20 20 2f 2a 20 41 20 73 65 6d 69 63 6f 6c 6f 6e    /* A semicolon
1310: 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 6f 6b 65   */.        toke
1320: 6e 20 3d 20 74 6b 53 45 4d 49 3b 0a 20 20 20 20  n = tkSEMI;.    
1330: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1340: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 20   }.      case ' 
1350: 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 5c  ':.      case '\
1360: 72 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27  r':.      case '
1370: 5c 74 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  \t':.      case 
1380: 27 5c 6e 27 3a 0a 20 20 20 20 20 20 63 61 73 65  '\n':.      case
1390: 20 27 5c 66 27 3a 20 7b 20 20 2f 2a 20 57 68 69   '\f': {  /* Whi
13a0: 74 65 20 73 70 61 63 65 20 69 73 20 69 67 6e 6f  te space is igno
13b0: 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  red */.        t
13c0: 6f 6b 65 6e 20 3d 20 74 6b 57 53 3b 0a 20 20 20  oken = tkWS;.   
13d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13e0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27    }.      case '
13f0: 2f 27 3a 20 7b 20 20 20 2f 2a 20 43 2d 73 74 79  /': {   /* C-sty
1400: 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  le comments */. 
1410: 20 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b         if( zSql[
1420: 31 5d 21 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20  1]!='*' ){.     
1430: 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f       token = tkO
1440: 54 48 45 52 3b 0a 20 20 20 20 20 20 20 20 20 20  THER;.          
1450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1460: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 2b 3d  .        zSql +=
1470: 20 32 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   2;.        whil
1480: 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 7a  e( zSql[0] && (z
1490: 53 71 6c 5b 30 5d 21 3d 27 2a 27 20 7c 7c 20 7a  Sql[0]!='*' || z
14a0: 53 71 6c 5b 31 5d 21 3d 27 2f 27 29 20 29 7b 20  Sql[1]!='/') ){ 
14b0: 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  zSql++; }.      
14c0: 20 20 69 66 28 20 7a 53 71 6c 5b 30 5d 3d 3d 30    if( zSql[0]==0
14d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
14e0: 20 20 20 20 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20       zSql++;.   
14f0: 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 57       token = tkW
1500: 53 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  S;.        break
1510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1520: 63 61 73 65 20 27 2d 27 3a 20 7b 20 20 20 2f 2a  case '-': {   /*
1530: 20 53 51 4c 2d 73 74 79 6c 65 20 63 6f 6d 6d 65   SQL-style comme
1540: 6e 74 73 20 66 72 6f 6d 20 22 2d 2d 22 20 74 6f  nts from "--" to
1550: 20 65 6e 64 20 6f 66 20 6c 69 6e 65 20 2a 2f 0a   end of line */.
1560: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c          if( zSql
1570: 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [1]!='-' ){.    
1580: 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b        token = tk
1590: 4f 54 48 45 52 3b 0a 20 20 20 20 20 20 20 20 20  OTHER;.         
15a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15b0: 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  }.        while(
15c0: 20 2a 7a 53 71 6c 20 26 26 20 2a 7a 53 71 6c 21   *zSql && *zSql!
15d0: 3d 27 5c 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b  ='\n' ){ zSql++;
15e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a   }.        if( *
15f0: 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
1600: 20 73 74 61 74 65 3d 3d 30 3b 0a 20 20 20 20 20   state==0;.     
1610: 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 57 53 3b     token = tkWS;
1620: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
1640: 73 65 20 27 5b 27 3a 20 7b 20 20 20 2f 2a 20 4d  se '[': {   /* M
1650: 69 63 72 6f 73 6f 66 74 2d 73 74 79 6c 65 20 69  icrosoft-style i
1660: 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 5b 2e  dentifiers in [.
1670: 2e 2e 5d 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ..] */.        z
1680: 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77  Sql++;.        w
1690: 68 69 6c 65 28 20 2a 7a 53 71 6c 20 26 26 20 2a  hile( *zSql && *
16a0: 7a 53 71 6c 21 3d 27 5d 27 20 29 7b 20 7a 53 71  zSql!=']' ){ zSq
16b0: 6c 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  l++; }.        i
16c0: 66 28 20 2a 7a 53 71 6c 3d 3d 30 20 29 20 72 65  f( *zSql==0 ) re
16d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
16e0: 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b  token = tkOTHER;
16f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
1710: 73 65 20 27 60 27 3a 20 20 20 20 20 2f 2a 20 47  se '`':     /* G
1720: 72 61 76 65 2d 61 63 63 65 6e 74 20 71 75 6f 74  rave-accent quot
1730: 65 64 20 73 79 6d 62 6f 6c 73 20 75 73 65 64 20  ed symbols used 
1740: 62 79 20 4d 79 53 51 4c 20 2a 2f 0a 20 20 20 20  by MySQL */.    
1750: 20 20 63 61 73 65 20 27 22 27 3a 20 20 20 20 20    case '"':     
1760: 2f 2a 20 73 69 6e 67 6c 65 2d 20 61 6e 64 20 64  /* single- and d
1770: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
1780: 69 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 63 61  ings */.      ca
1790: 73 65 20 27 5c 27 27 3a 20 7b 0a 20 20 20 20 20  se '\'': {.     
17a0: 20 20 20 69 6e 74 20 63 20 3d 20 2a 7a 53 71 6c     int c = *zSql
17b0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 2b 2b  ;.        zSql++
17c0: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
17d0: 20 2a 7a 53 71 6c 20 26 26 20 2a 7a 53 71 6c 21   *zSql && *zSql!
17e0: 3d 63 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a  =c ){ zSql++; }.
17f0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 71          if( *zSq
1800: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1810: 0a 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d  .        token =
1820: 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20 20   tkOTHER;.      
1830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1840: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
1850: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
1860: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 64 43  .        if( IdC
1870: 68 61 72 28 28 75 38 29 2a 7a 53 71 6c 29 20 29  har((u8)*zSql) )
1880: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  {.          /* K
1890: 65 79 77 6f 72 64 73 20 61 6e 64 20 75 6e 71 75  eywords and unqu
18a0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 73  oted identifiers
18b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
18c0: 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 20 20 20  t nId;.         
18d0: 20 66 6f 72 28 6e 49 64 3d 31 3b 20 49 64 43 68   for(nId=1; IdCh
18e0: 61 72 28 7a 53 71 6c 5b 6e 49 64 5d 29 3b 20 6e  ar(zSql[nId]); n
18f0: 49 64 2b 2b 29 7b 7d 0a 23 69 66 64 65 66 20 53  Id++){}.#ifdef S
1900: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1910: 45 52 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6b  ER.          tok
1920: 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 23 65  en = tkOTHER;.#e
1930: 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 73 77  lse.          sw
1940: 69 74 63 68 28 20 2a 7a 53 71 6c 20 29 7b 0a 20  itch( *zSql ){. 
1950: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
1960: 27 63 27 3a 20 63 61 73 65 20 27 43 27 3a 20 7b  'c': case 'C': {
1970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1980: 66 28 20 6e 49 64 3d 3d 36 20 26 26 20 73 71 6c  f( nId==6 && sql
1990: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 71  ite3StrNICmp(zSq
19a0: 6c 2c 20 22 63 72 65 61 74 65 22 2c 20 36 29 3d  l, "create", 6)=
19b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
19c0: 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b        token = tk
19d0: 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20  CREATE;.        
19e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b               tok
1a00: 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20  en = tkOTHER;.  
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1a30: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
1a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
1a50: 65 20 27 74 27 3a 20 63 61 73 65 20 27 54 27 3a  e 't': case 'T':
1a60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1a70: 20 69 66 28 20 6e 49 64 3d 3d 37 20 26 26 20 73   if( nId==7 && s
1a80: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
1a90: 53 71 6c 2c 20 22 74 72 69 67 67 65 72 22 2c 20  Sql, "trigger", 
1aa0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
1ab0: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d           token =
1ac0: 20 74 6b 54 52 49 47 47 45 52 3b 0a 20 20 20 20   tkTRIGGER;.    
1ad0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
1ae0: 69 66 28 20 6e 49 64 3d 3d 34 20 26 26 20 73 71  if( nId==4 && sq
1af0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 53  lite3StrNICmp(zS
1b00: 71 6c 2c 20 22 74 65 6d 70 22 2c 20 34 29 3d 3d  ql, "temp", 4)==
1b10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1b20: 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 54       token = tkT
1b30: 45 4d 50 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EMP;.           
1b40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 49 64     }else if( nId
1b50: 3d 3d 39 20 26 26 20 73 71 6c 69 74 65 33 53 74  ==9 && sqlite3St
1b60: 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20 22 74 65  rNICmp(zSql, "te
1b70: 6d 70 6f 72 61 72 79 22 2c 20 39 29 3d 3d 30 20  mporary", 9)==0 
1b80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b90: 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 54 45 4d     token = tkTEM
1ba0: 50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  P;.             
1bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bc0: 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20          token = 
1bd0: 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20 20 20  tkOTHER;.       
1be0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1c00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c10: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 65 27          case 'e'
1c20: 3a 20 20 63 61 73 65 20 27 45 27 3a 20 7b 0a 20  :  case 'E': {. 
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1c40: 20 6e 49 64 3d 3d 33 20 26 26 20 73 71 6c 69 74   nId==3 && sqlit
1c50: 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c  e3StrNICmp(zSql,
1c60: 20 22 65 6e 64 22 2c 20 33 29 3d 3d 30 20 29 7b   "end", 3)==0 ){
1c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c80: 20 74 6f 6b 65 6e 20 3d 20 74 6b 45 4e 44 3b 0a   token = tkEND;.
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
1ca0: 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
1cb0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1cd0: 28 20 6e 49 64 3d 3d 37 20 26 26 20 73 71 6c 69  ( nId==7 && sqli
1ce0: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c  te3StrNICmp(zSql
1cf0: 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 3d  , "explain", 7)=
1d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d10: 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b        token = tk
1d20: 45 58 50 4c 41 49 4e 3b 0a 20 20 20 20 20 20 20  EXPLAIN;.       
1d30: 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
1d40: 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
1d50: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
1d60: 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54      token = tkOT
1d70: 48 45 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  HER;.           
1d80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1db0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b               tok
1dd0: 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20  en = tkOTHER;.  
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1df0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
1e00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
1e10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1e20: 49 54 5f 54 52 49 47 47 45 52 20 2a 2f 0a 20 20  IT_TRIGGER */.  
1e30: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20          zSql += 
1e40: 6e 49 64 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  nId-1;.        }
1e50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e60: 2f 2a 20 4f 70 65 72 61 74 6f 72 73 20 61 6e 64  /* Operators and
1e70: 20 73 70 65 63 69 61 6c 20 73 79 6d 62 6f 6c 73   special symbols
1e80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 6f   */.          to
1e90: 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20  ken = tkOTHER;. 
1ea0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1eb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1ec0: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 20      }.    state 
1ed0: 3d 20 74 72 61 6e 73 5b 73 74 61 74 65 5d 5b 74  = trans[state][t
1ee0: 6f 6b 65 6e 5d 3b 0a 20 20 20 20 7a 53 71 6c 2b  oken];.    zSql+
1ef0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
1f00: 73 74 61 74 65 3d 3d 30 3b 0a 7d 0a 0a 23 69 66  state==0;.}..#if
1f10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f20: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 54 68 69  _UTF16./*.** Thi
1f30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
1f40: 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c   same as the sql
1f50: 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 29 20  ite3_complete() 
1f60: 72 6f 75 74 69 6e 65 20 64 65 73 63 72 69 62 65  routine describe
1f70: 64 0a 2a 2a 20 61 62 6f 76 65 2c 20 65 78 63 65  d.** above, exce
1f80: 70 74 20 74 68 61 74 20 74 68 65 20 70 61 72 61  pt that the para
1f90: 6d 65 74 65 72 20 69 73 20 72 65 71 75 69 72 65  meter is require
1fa0: 64 20 74 6f 20 62 65 20 55 54 46 2d 31 36 20 65  d to be UTF-16 e
1fb0: 6e 63 6f 64 65 64 2c 20 6e 6f 74 0a 2a 2a 20 55  ncoded, not.** U
1fc0: 54 46 2d 38 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TF-8..*/.int sql
1fd0: 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28  ite3_complete16(
1fe0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
1ff0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ){.  sqlite3_val
2000: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 63 68 61 72  ue *pVal;.  char
2010: 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 38 3b 0a 20   const *zSql8;. 
2020: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20   int rc = 0;..  
2030: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
2040: 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69  lueNew();.  sqli
2050: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
2060: 56 61 6c 2c 20 2d 31 2c 20 7a 53 71 6c 2c 20 53  Val, -1, zSql, S
2070: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
2080: 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
2090: 29 3b 0a 20 20 7a 53 71 6c 38 20 3d 20 73 71 6c  );.  zSql8 = sql
20a0: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
20b0: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  al, SQLITE_UTF8)
20c0: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 38 20 29 7b  ;.  if( zSql8 ){
20d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20e0: 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 38  3_complete(zSql8
20f0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2100: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
2110: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2120: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2130: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 23  _OMIT_UTF16 */.#
2140: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2150: 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 2a 2f  OMIT_COMPLETE */
2160: 0a                                               .