/ Hex Artifact Content
Login

Artifact 535183afb3c75628b78ce82612931ac7cdf26f14:


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 23 64   SQLITE_ASCII.#d
0340: 65 66 69 6e 65 20 49 64 43 68 61 72 28 43 29 20  efine IdChar(C) 
0350: 20 28 28 73 71 6c 69 74 65 33 43 74 79 70 65 4d   ((sqlite3CtypeM
0360: 61 70 5b 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ap[(unsigned cha
0370: 72 29 43 5d 26 30 78 34 36 29 21 3d 30 29 0a 23  r)C]&0x46)!=0).#
0380: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
0390: 49 54 45 5f 45 42 43 44 49 43 0a 65 78 74 65 72  ITE_EBCDIC.exter
03a0: 6e 20 63 6f 6e 73 74 20 63 68 61 72 20 73 71 6c  n const char sql
03b0: 69 74 65 33 49 73 45 62 63 64 69 63 49 64 43 68  ite3IsEbcdicIdCh
03c0: 61 72 5b 5d 3b 0a 23 64 65 66 69 6e 65 20 49 64  ar[];.#define Id
03d0: 43 68 61 72 28 43 29 20 20 28 28 28 63 3d 43 29  Char(C)  (((c=C)
03e0: 3e 3d 30 78 34 32 20 26 26 20 73 71 6c 69 74 65  >=0x42 && sqlite
03f0: 33 49 73 45 62 63 64 69 63 49 64 43 68 61 72 5b  3IsEbcdicIdChar[
0400: 63 2d 30 78 34 30 5d 29 29 0a 23 65 6e 64 69 66  c-0x40])).#endif
0410: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0420: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 20 2a  E_AMALGAMATION *
0430: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 20  /.../*.** Token 
0440: 74 79 70 65 73 20 75 73 65 64 20 62 79 20 74 68  types used by th
0450: 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  e sqlite3_comple
0460: 74 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  te() routine.  S
0470: 65 65 20 74 68 65 20 68 65 61 64 65 72 0a 2a 2a  ee the header.**
0480: 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 61   comments on tha
0490: 74 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20  t procedure for 
04a0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
04b0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69  mation..*/.#defi
04c0: 6e 65 20 74 6b 53 45 4d 49 20 20 20 20 30 0a 23  ne tkSEMI    0.#
04d0: 64 65 66 69 6e 65 20 74 6b 57 53 20 20 20 20 20  define tkWS     
04e0: 20 31 0a 23 64 65 66 69 6e 65 20 74 6b 4f 54 48   1.#define tkOTH
04f0: 45 52 20 20 20 32 0a 23 69 66 6e 64 65 66 20 53  ER   2.#ifndef S
0500: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
0510: 45 52 0a 23 64 65 66 69 6e 65 20 74 6b 45 58 50  ER.#define tkEXP
0520: 4c 41 49 4e 20 33 0a 23 64 65 66 69 6e 65 20 74  LAIN 3.#define t
0530: 6b 43 52 45 41 54 45 20 20 34 0a 23 64 65 66 69  kCREATE  4.#defi
0540: 6e 65 20 74 6b 54 45 4d 50 20 20 20 20 35 0a 23  ne tkTEMP    5.#
0550: 64 65 66 69 6e 65 20 74 6b 54 52 49 47 47 45 52  define tkTRIGGER
0560: 20 36 0a 23 64 65 66 69 6e 65 20 74 6b 45 4e 44   6.#define tkEND
0570: 20 20 20 20 20 37 0a 23 65 6e 64 69 66 0a 0a 2f       7.#endif../
0580: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
0590: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 53 51   if the given SQ
05a0: 4c 20 73 74 72 69 6e 67 20 65 6e 64 73 20 69 6e  L string ends in
05b0: 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a   a semicolon..**
05c0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64  .** Special hand
05d0: 6c 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 20  ling is require 
05e0: 66 6f 72 20 43 52 45 41 54 45 20 54 52 49 47 47  for CREATE TRIGG
05f0: 45 52 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ER statements..*
0600: 2a 20 57 68 65 6e 65 76 65 72 20 74 68 65 20 43  * Whenever the C
0610: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 6b 65  REATE TRIGGER ke
0620: 79 77 6f 72 64 73 20 61 72 65 20 73 65 65 6e 2c  ywords are seen,
0630: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
0640: 2a 20 6d 75 73 74 20 65 6e 64 20 77 69 74 68 20  * must end with 
0650: 22 3b 45 4e 44 3b 22 2e 0a 2a 2a 0a 2a 2a 20 54  ";END;"..**.** T
0660: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0670: 6f 6e 20 75 73 65 73 20 61 20 73 74 61 74 65 20  on uses a state 
0680: 6d 61 63 68 69 6e 65 20 77 69 74 68 20 38 20 73  machine with 8 s
0690: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  tates:.**.**   (
06a0: 30 29 20 49 4e 56 41 4c 49 44 20 20 20 57 65 20  0) INVALID   We 
06b0: 68 61 76 65 20 6e 6f 74 20 79 65 74 20 73 65 65  have not yet see
06c0: 6e 20 61 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61  n a non-whitespa
06d0: 63 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ce character..**
06e0: 0a 2a 2a 20 20 20 28 31 29 20 53 54 41 52 54 20  .**   (1) START 
06f0: 20 20 20 20 41 74 20 74 68 65 20 62 65 67 69 6e      At the begin
0700: 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61  ning or end of a
0710: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  n SQL statement.
0720: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
0730: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0740: 20 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69    returns 1 if i
0750: 74 20 65 6e 64 73 20 69 6e 20 74 68 65 20 53 54  t ends in the ST
0760: 41 52 54 20 73 74 61 74 65 20 61 6e 64 20 30 20  ART state and 0 
0770: 69 66 20 69 74 20 65 6e 64 73 0a 2a 2a 20 20 20  if it ends.**   
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
0790: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
07a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 4e 4f  ..**.**   (2) NO
07b0: 52 4d 41 4c 20 20 20 20 57 65 20 61 72 65 20 69  RMAL    We are i
07c0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
07d0: 73 74 61 74 65 6d 65 6e 74 20 77 68 69 63 68 20  statement which 
07e0: 65 6e 64 73 20 77 69 74 68 20 61 20 73 69 6e 67  ends with a sing
07f0: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
0800: 20 20 20 20 20 20 73 65 6d 69 63 6f 6c 6f 6e 2e        semicolon.
0810: 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 45 58 50  .**.**   (3) EXP
0820: 4c 41 49 4e 20 20 20 54 68 65 20 6b 65 79 77 6f  LAIN   The keywo
0830: 72 64 20 45 58 50 4c 41 49 4e 20 68 61 73 20 62  rd EXPLAIN has b
0840: 65 65 6e 20 73 65 65 6e 20 61 74 20 74 68 65 20  een seen at the 
0850: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 0a 2a 2a  beginning of .**
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a   a statement..**
0880: 0a 2a 2a 20 20 20 28 34 29 20 43 52 45 41 54 45  .**   (4) CREATE
0890: 20 20 20 20 54 68 65 20 6b 65 79 77 6f 72 64 20      The keyword 
08a0: 43 52 45 41 54 45 20 68 61 73 20 62 65 65 6e 20  CREATE has been 
08b0: 73 65 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  seen at the begi
08c0: 6e 6e 69 6e 67 20 6f 66 20 61 0a 2a 2a 20 20 20  nning of a.**   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
08e0: 61 74 65 6d 65 6e 74 2c 20 70 6f 73 73 69 62 6c  atement, possibl
08f0: 79 20 70 72 65 63 65 64 65 64 20 62 79 20 45 58  y preceded by EX
0900: 50 4c 41 49 4e 20 61 6e 64 2f 6f 72 20 66 6f 6c  PLAIN and/or fol
0910: 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
0920: 20 20 20 20 20 20 20 20 20 20 20 20 54 45 4d 50              TEMP
0930: 20 6f 72 20 54 45 4d 50 4f 52 41 52 59 0a 2a 2a   or TEMPORARY.**
0940: 0a 2a 2a 20 20 20 28 35 29 20 54 52 49 47 47 45  .**   (5) TRIGGE
0950: 52 20 20 20 57 65 20 61 72 65 20 69 6e 20 74 68  R   We are in th
0960: 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72  e middle of a tr
0970: 69 67 67 65 72 20 64 65 66 69 6e 69 74 69 6f 6e  igger definition
0980: 20 74 68 61 74 20 6d 75 73 74 20 62 65 0a 2a 2a   that must be.**
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 65 6e 64 65 64 20 62 79 20 61 20 73 65 6d 69   ended by a semi
09b0: 63 6f 6c 6f 6e 2c 20 74 68 65 20 6b 65 79 77 6f  colon, the keywo
09c0: 72 64 20 45 4e 44 2c 20 61 6e 64 20 61 6e 6f 74  rd END, and anot
09d0: 68 65 72 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a  her semicolon..*
09e0: 2a 0a 2a 2a 20 20 20 28 36 29 20 53 45 4d 49 20  *.**   (6) SEMI 
09f0: 20 20 20 20 20 57 65 27 76 65 20 73 65 65 6e 20       We've seen 
0a00: 74 68 65 20 66 69 72 73 74 20 73 65 6d 69 63 6f  the first semico
0a10: 6c 6f 6e 20 69 6e 20 74 68 65 20 22 3b 45 4e 44  lon in the ";END
0a20: 3b 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  ;" that occurs a
0a30: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
0a40: 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66 20       the end of 
0a50: 61 20 74 72 69 67 67 65 72 20 64 65 66 69 6e 69  a trigger defini
0a60: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  tion..**.**   (7
0a70: 29 20 45 4e 44 20 20 20 20 20 20 20 57 65 27 76  ) END       We'v
0a80: 65 20 73 65 65 6e 20 74 68 65 20 22 3b 45 4e 44  e seen the ";END
0a90: 22 20 6f 66 20 74 68 65 20 22 3b 45 4e 44 3b 22  " of the ";END;"
0aa0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
0ab0: 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20  the end.**      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 61 20             of a 
0ad0: 74 72 69 67 67 65 72 20 64 65 66 69 6e 69 74 69  trigger definiti
0ae0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 69  on..**.** Transi
0af0: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 20 73 74  tions between st
0b00: 61 74 65 73 20 61 62 6f 76 65 20 61 72 65 20 64  ates above are d
0b10: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 6f 6b  etermined by tok
0b20: 65 6e 73 20 65 78 74 72 61 63 74 65 64 0a 2a 2a  ens extracted.**
0b30: 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 2e   from the input.
0b40: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
0b50: 74 6f 6b 65 6e 73 20 61 72 65 20 73 69 67 6e 69  tokens are signi
0b60: 66 69 63 61 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  ficant:.**.**   
0b70: 28 30 29 20 74 6b 53 45 4d 49 20 20 20 20 20 20  (0) tkSEMI      
0b80: 41 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a 20  A semicolon..** 
0b90: 20 20 28 31 29 20 74 6b 57 53 20 20 20 20 20 20    (1) tkWS      
0ba0: 20 20 57 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a    Whitespace..**
0bb0: 20 20 20 28 32 29 20 74 6b 4f 54 48 45 52 20 20     (2) tkOTHER  
0bc0: 20 20 20 41 6e 79 20 6f 74 68 65 72 20 53 51 4c     Any other SQL
0bd0: 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 20 20 28 33 29   token..**   (3)
0be0: 20 74 6b 45 58 50 4c 41 49 4e 20 20 20 54 68 65   tkEXPLAIN   The
0bf0: 20 22 65 78 70 6c 61 69 6e 22 20 6b 65 79 77 6f   "explain" keywo
0c00: 72 64 2e 0a 2a 2a 20 20 20 28 34 29 20 74 6b 43  rd..**   (4) tkC
0c10: 52 45 41 54 45 20 20 20 20 54 68 65 20 22 63 72  REATE    The "cr
0c20: 65 61 74 65 22 20 6b 65 79 77 6f 72 64 2e 0a 2a  eate" keyword..*
0c30: 2a 20 20 20 28 35 29 20 74 6b 54 45 4d 50 20 20  *   (5) tkTEMP  
0c40: 20 20 20 20 54 68 65 20 22 74 65 6d 70 22 20 6f      The "temp" o
0c50: 72 20 22 74 65 6d 70 6f 72 61 72 79 22 20 6b 65  r "temporary" ke
0c60: 79 77 6f 72 64 2e 0a 2a 2a 20 20 20 28 36 29 20  yword..**   (6) 
0c70: 74 6b 54 52 49 47 47 45 52 20 20 20 54 68 65 20  tkTRIGGER   The 
0c80: 22 74 72 69 67 67 65 72 22 20 6b 65 79 77 6f 72  "trigger" keywor
0c90: 64 2e 0a 2a 2a 20 20 20 28 37 29 20 74 6b 45 4e  d..**   (7) tkEN
0ca0: 44 20 20 20 20 20 20 20 54 68 65 20 22 65 6e 64  D       The "end
0cb0: 22 20 6b 65 79 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a  " keyword..**.**
0cc0: 20 57 68 69 74 65 73 70 61 63 65 20 6e 65 76 65   Whitespace neve
0cd0: 72 20 63 61 75 73 65 73 20 61 20 73 74 61 74 65  r causes a state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 61 6e 64 20   transition and 
0cf0: 69 73 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65  is always ignore
0d00: 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  d..** This means
0d10: 20 74 68 61 74 20 61 20 53 51 4c 20 73 74 72 69   that a SQL stri
0d20: 6e 67 20 6f 66 20 61 6c 6c 20 77 68 69 74 65 73  ng of all whites
0d30: 70 61 63 65 20 69 73 20 69 6e 76 61 6c 69 64 2e  pace is invalid.
0d40: 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 63 6f 6d  .**.** If we com
0d50: 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45  pile with SQLITE
0d60: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 2c 20 61  _OMIT_TRIGGER, a
0d70: 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74  ll of the comput
0d80: 61 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a 20  ation needed.** 
0d90: 74 6f 20 72 65 63 6f 67 6e 69 7a 65 20 74 68 65  to recognize the
0da0: 20 65 6e 64 20 6f 66 20 61 20 74 72 69 67 67 65   end of a trigge
0db0: 72 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  r can be omitted
0dc0: 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 20 74  .  All we have t
0dd0: 6f 20 64 6f 0a 2a 2a 20 69 73 20 6c 6f 6f 6b 20  o do.** is look 
0de0: 66 6f 72 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20  for a semicolon 
0df0: 74 68 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74  that is not part
0e00: 20 6f 66 20 61 6e 20 73 74 72 69 6e 67 20 6f 72   of an string or
0e10: 20 63 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   comment..*/.int
0e20: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
0e30: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  e(const char *zS
0e40: 71 6c 29 7b 0a 20 20 75 38 20 73 74 61 74 65 20  ql){.  u8 state 
0e50: 3d 20 30 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e  = 0;   /* Curren
0e60: 74 20 73 74 61 74 65 2c 20 75 73 69 6e 67 20 6e  t state, using n
0e70: 75 6d 62 65 72 73 20 64 65 66 69 6e 65 64 20 69  umbers defined i
0e80: 6e 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  n header comment
0e90: 20 2a 2f 0a 20 20 75 38 20 74 6f 6b 65 6e 3b 20   */.  u8 token; 
0ea0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
0eb0: 66 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e  f the next token
0ec0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0ed0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
0ee0: 0a 20 20 2f 2a 20 41 20 63 6f 6d 70 6c 65 78 20  .  /* A complex 
0ef0: 73 74 61 74 65 6d 65 6e 74 20 6d 61 63 68 69 6e  statement machin
0f00: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 63 74  e used to detect
0f10: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 43 52   the end of a CR
0f20: 45 41 54 45 20 54 52 49 47 47 45 52 0a 20 20 2a  EATE TRIGGER.  *
0f30: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  * statement.  Th
0f40: 69 73 20 69 73 20 74 68 65 20 6e 6f 72 6d 61 6c  is is the normal
0f50: 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 74   case..  */.  st
0f60: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 72  atic const u8 tr
0f70: 61 6e 73 5b 38 5d 5b 38 5d 20 3d 20 7b 0a 20 20  ans[8][8] = {.  
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 2f 2a 20 54 6f 6b 65 6e 3a 20 20 20 20     /* Token:    
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
0fd0: 20 20 20 20 2f 2a 20 53 74 61 74 65 3a 20 20 20      /* State:   
0fe0: 20 20 20 20 2a 2a 20 20 53 45 4d 49 20 20 57 53      **  SEMI  WS
0ff0: 20 20 4f 54 48 45 52 20 20 45 58 50 4c 41 49 4e    OTHER  EXPLAIN
1000: 20 20 43 52 45 41 54 45 20 20 54 45 4d 50 20 20    CREATE  TEMP  
1010: 54 52 49 47 47 45 52 20 20 45 4e 44 20 2a 2f 0a  TRIGGER  END */.
1020: 20 20 20 20 20 2f 2a 20 30 20 49 4e 56 41 4c 49       /* 0 INVALI
1030: 44 3a 20 2a 2f 20 7b 20 20 20 20 31 2c 20 20 30  D: */ {    1,  0
1040: 2c 20 20 20 20 20 32 2c 20 20 20 20 20 20 20 33  ,     2,       3
1050: 2c 20 20 20 20 20 20 34 2c 20 20 20 20 32 2c 20  ,      4,    2, 
1060: 20 20 20 20 20 20 32 2c 20 20 20 32 2c 20 7d 2c        2,   2, },
1070: 0a 20 20 20 20 20 2f 2a 20 31 20 20 20 53 54 41  .     /* 1   STA
1080: 52 54 3a 20 2a 2f 20 7b 20 20 20 20 31 2c 20 20  RT: */ {    1,  
1090: 31 2c 20 20 20 20 20 32 2c 20 20 20 20 20 20 20  1,     2,       
10a0: 33 2c 20 20 20 20 20 20 34 2c 20 20 20 20 32 2c  3,      4,    2,
10b0: 20 20 20 20 20 20 20 32 2c 20 20 20 32 2c 20 7d         2,   2, }
10c0: 2c 0a 20 20 20 20 20 2f 2a 20 32 20 20 4e 4f 52  ,.     /* 2  NOR
10d0: 4d 41 4c 3a 20 2a 2f 20 7b 20 20 20 20 31 2c 20  MAL: */ {    1, 
10e0: 20 32 2c 20 20 20 20 20 32 2c 20 20 20 20 20 20   2,     2,      
10f0: 20 32 2c 20 20 20 20 20 20 32 2c 20 20 20 20 32   2,      2,    2
1100: 2c 20 20 20 20 20 20 20 32 2c 20 20 20 32 2c 20  ,       2,   2, 
1110: 7d 2c 0a 20 20 20 20 20 2f 2a 20 33 20 45 58 50  },.     /* 3 EXP
1120: 4c 41 49 4e 3a 20 2a 2f 20 7b 20 20 20 20 31 2c  LAIN: */ {    1,
1130: 20 20 33 2c 20 20 20 20 20 33 2c 20 20 20 20 20    3,     3,     
1140: 20 20 32 2c 20 20 20 20 20 20 34 2c 20 20 20 20    2,      4,    
1150: 32 2c 20 20 20 20 20 20 20 32 2c 20 20 20 32 2c  2,       2,   2,
1160: 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 34 20 20 43   },.     /* 4  C
1170: 52 45 41 54 45 3a 20 2a 2f 20 7b 20 20 20 20 31  REATE: */ {    1
1180: 2c 20 20 34 2c 20 20 20 20 20 32 2c 20 20 20 20  ,  4,     2,    
1190: 20 20 20 32 2c 20 20 20 20 20 20 32 2c 20 20 20     2,      2,   
11a0: 20 34 2c 20 20 20 20 20 20 20 35 2c 20 20 20 32   4,       5,   2
11b0: 2c 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 35 20 54  , },.     /* 5 T
11c0: 52 49 47 47 45 52 3a 20 2a 2f 20 7b 20 20 20 20  RIGGER: */ {    
11d0: 36 2c 20 20 35 2c 20 20 20 20 20 35 2c 20 20 20  6,  5,     5,   
11e0: 20 20 20 20 35 2c 20 20 20 20 20 20 35 2c 20 20      5,      5,  
11f0: 20 20 35 2c 20 20 20 20 20 20 20 35 2c 20 20 20    5,       5,   
1200: 35 2c 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 36 20  5, },.     /* 6 
1210: 20 20 20 53 45 4d 49 3a 20 2a 2f 20 7b 20 20 20     SEMI: */ {   
1220: 20 36 2c 20 20 36 2c 20 20 20 20 20 35 2c 20 20   6,  6,     5,  
1230: 20 20 20 20 20 35 2c 20 20 20 20 20 20 35 2c 20       5,      5, 
1240: 20 20 20 35 2c 20 20 20 20 20 20 20 35 2c 20 20     5,       5,  
1250: 20 37 2c 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 37   7, },.     /* 7
1260: 20 20 20 20 20 45 4e 44 3a 20 2a 2f 20 7b 20 20       END: */ {  
1270: 20 20 31 2c 20 20 37 2c 20 20 20 20 20 35 2c 20    1,  7,     5, 
1280: 20 20 20 20 20 20 35 2c 20 20 20 20 20 20 35 2c        5,      5,
1290: 20 20 20 20 35 2c 20 20 20 20 20 20 20 35 2c 20      5,       5, 
12a0: 20 20 35 2c 20 7d 2c 0a 20 20 7d 3b 0a 23 65 6c    5, },.  };.#el
12b0: 73 65 0a 20 20 2f 2a 20 49 66 20 74 72 69 67 67  se.  /* If trigg
12c0: 65 72 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70  ers are not supp
12d0: 6f 72 74 65 64 20 62 79 20 74 68 69 73 20 63 6f  orted by this co
12e0: 6d 70 69 6c 65 20 74 68 65 6e 20 74 68 65 20 73  mpile then the s
12f0: 74 61 74 65 6d 65 6e 74 20 6d 61 63 68 69 6e 65  tatement machine
1300: 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 64 65  .  ** used to de
1310: 74 65 63 74 20 74 68 65 20 65 6e 64 20 6f 66 20  tect the end of 
1320: 61 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6d  a statement is m
1330: 75 63 68 20 73 69 6d 70 6c 65 72 0a 20 20 2a 2f  uch simpler.  */
1340: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1350: 75 38 20 74 72 61 6e 73 5b 33 5d 5b 33 5d 20 3d  u8 trans[3][3] =
1360: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1370: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e          /* Token
1380: 3a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  :           */. 
1390: 20 20 20 20 2f 2a 20 53 74 61 74 65 3a 20 20 20      /* State:   
13a0: 20 20 20 20 2a 2a 20 20 53 45 4d 49 20 20 57 53      **  SEMI  WS
13b0: 20 20 4f 54 48 45 52 20 2a 2f 0a 20 20 20 20 20    OTHER */.     
13c0: 2f 2a 20 30 20 49 4e 56 41 4c 49 44 3a 20 2a 2f  /* 0 INVALID: */
13d0: 20 7b 20 20 20 20 31 2c 20 20 30 2c 20 20 20 20   {    1,  0,    
13e0: 20 32 2c 20 7d 2c 0a 20 20 20 20 20 2f 2a 20 31   2, },.     /* 1
13f0: 20 20 20 53 54 41 52 54 3a 20 2a 2f 20 7b 20 20     START: */ {  
1400: 20 20 31 2c 20 20 31 2c 20 20 20 20 20 32 2c 20    1,  1,     2, 
1410: 7d 2c 0a 20 20 20 20 20 2f 2a 20 32 20 20 4e 4f  },.     /* 2  NO
1420: 52 4d 41 4c 3a 20 2a 2f 20 7b 20 20 20 20 31 2c  RMAL: */ {    1,
1430: 20 20 32 2c 20 20 20 20 20 32 2c 20 7d 2c 0a 20    2,     2, },. 
1440: 20 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   };.#endif /* SQ
1450: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
1460: 52 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 2a  R */..  while( *
1470: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 73 77 69 74  zSql ){.    swit
1480: 63 68 28 20 2a 7a 53 71 6c 20 29 7b 0a 20 20 20  ch( *zSql ){.   
1490: 20 20 20 63 61 73 65 20 27 3b 27 3a 20 7b 20 20     case ';': {  
14a0: 2f 2a 20 41 20 73 65 6d 69 63 6f 6c 6f 6e 20 2a  /* A semicolon *
14b0: 2f 0a 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20  /.        token 
14c0: 3d 20 74 6b 53 45 4d 49 3b 0a 20 20 20 20 20 20  = tkSEMI;.      
14d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14e0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 20 27 3a  .      case ' ':
14f0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 5c 72 27  .      case '\r'
1500: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 5c 74  :.      case '\t
1510: 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 5c  ':.      case '\
1520: 6e 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27  n':.      case '
1530: 5c 66 27 3a 20 7b 20 20 2f 2a 20 57 68 69 74 65  \f': {  /* White
1540: 20 73 70 61 63 65 20 69 73 20 69 67 6e 6f 72 65   space is ignore
1550: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 6f 6b  d */.        tok
1560: 65 6e 20 3d 20 74 6b 57 53 3b 0a 20 20 20 20 20  en = tkWS;.     
1570: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1580: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 2f 27  }.      case '/'
1590: 3a 20 7b 20 20 20 2f 2a 20 43 2d 73 74 79 6c 65  : {   /* C-style
15a0: 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
15b0: 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 31 5d       if( zSql[1]
15c0: 21 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20  !='*' ){.       
15d0: 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48     token = tkOTH
15e0: 45 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ER;.          br
15f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1600: 20 20 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20 32         zSql += 2
1610: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
1620: 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 7a 53 71   zSql[0] && (zSq
1630: 6c 5b 30 5d 21 3d 27 2a 27 20 7c 7c 20 7a 53 71  l[0]!='*' || zSq
1640: 6c 5b 31 5d 21 3d 27 2f 27 29 20 29 7b 20 7a 53  l[1]!='/') ){ zS
1650: 71 6c 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20  ql++; }.        
1660: 69 66 28 20 7a 53 71 6c 5b 30 5d 3d 3d 30 20 29  if( zSql[0]==0 )
1670: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1680: 20 20 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20     zSql++;.     
1690: 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 57 53 3b     token = tkWS;
16a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
16c0: 73 65 20 27 2d 27 3a 20 7b 20 20 20 2f 2a 20 53  se '-': {   /* S
16d0: 51 4c 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74  QL-style comment
16e0: 73 20 66 72 6f 6d 20 22 2d 2d 22 20 74 6f 20 65  s from "--" to e
16f0: 6e 64 20 6f 66 20 6c 69 6e 65 20 2a 2f 0a 20 20  nd of line */.  
1700: 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 31        if( zSql[1
1710: 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
1720: 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54      token = tkOT
1730: 48 45 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62  HER;.          b
1740: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1750: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
1760: 7a 53 71 6c 20 26 26 20 2a 7a 53 71 6c 21 3d 27  zSql && *zSql!='
1770: 5c 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d  \n' ){ zSql++; }
1780: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53  .        if( *zS
1790: 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 73  ql==0 ) return s
17a0: 74 61 74 65 3d 3d 31 3b 0a 20 20 20 20 20 20 20  tate==1;.       
17b0: 20 74 6f 6b 65 6e 20 3d 20 74 6b 57 53 3b 0a 20   token = tkWS;. 
17c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
17e0: 20 27 5b 27 3a 20 7b 20 20 20 2f 2a 20 4d 69 63   '[': {   /* Mic
17f0: 72 6f 73 6f 66 74 2d 73 74 79 6c 65 20 69 64 65  rosoft-style ide
1800: 6e 74 69 66 69 65 72 73 20 69 6e 20 5b 2e 2e 2e  ntifiers in [...
1810: 5d 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 71  ] */.        zSq
1820: 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77 68 69  l++;.        whi
1830: 6c 65 28 20 2a 7a 53 71 6c 20 26 26 20 2a 7a 53  le( *zSql && *zS
1840: 71 6c 21 3d 27 5d 27 20 29 7b 20 7a 53 71 6c 2b  ql!=']' ){ zSql+
1850: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  +; }.        if(
1860: 20 2a 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75   *zSql==0 ) retu
1870: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 74 6f  rn 0;.        to
1880: 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20  ken = tkOTHER;. 
1890: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
18b0: 20 27 60 27 3a 20 20 20 20 20 2f 2a 20 47 72 61   '`':     /* Gra
18c0: 76 65 2d 61 63 63 65 6e 74 20 71 75 6f 74 65 64  ve-accent quoted
18d0: 20 73 79 6d 62 6f 6c 73 20 75 73 65 64 20 62 79   symbols used by
18e0: 20 4d 79 53 51 4c 20 2a 2f 0a 20 20 20 20 20 20   MySQL */.      
18f0: 63 61 73 65 20 27 22 27 3a 20 20 20 20 20 2f 2a  case '"':     /*
1900: 20 73 69 6e 67 6c 65 2d 20 61 6e 64 20 64 6f 75   single- and dou
1910: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
1920: 67 73 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65  gs */.      case
1930: 20 27 5c 27 27 3a 20 7b 0a 20 20 20 20 20 20 20   '\'': {.       
1940: 20 69 6e 74 20 63 20 3d 20 2a 7a 53 71 6c 3b 0a   int c = *zSql;.
1950: 20 20 20 20 20 20 20 20 7a 53 71 6c 2b 2b 3b 0a          zSql++;.
1960: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
1970: 7a 53 71 6c 20 26 26 20 2a 7a 53 71 6c 21 3d 63  zSql && *zSql!=c
1980: 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20   ){ zSql++; }.  
1990: 20 20 20 20 20 20 69 66 28 20 2a 7a 53 71 6c 3d        if( *zSql=
19a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19b0: 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74         token = t
19c0: 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20 20 20 20  kOTHER;.        
19d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
19e0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
19f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
1a00: 43 44 49 43 0a 20 20 20 20 20 20 20 20 75 6e 73  CDIC.        uns
1a10: 69 67 6e 65 64 20 63 68 61 72 20 63 3b 0a 23 65  igned char c;.#e
1a20: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
1a30: 20 49 64 43 68 61 72 28 28 75 38 29 2a 7a 53 71   IdChar((u8)*zSq
1a40: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
1a50: 2f 2a 20 4b 65 79 77 6f 72 64 73 20 61 6e 64 20  /* Keywords and 
1a60: 75 6e 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  unquoted identif
1a70: 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  iers */.        
1a80: 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
1a90: 20 20 20 20 20 66 6f 72 28 6e 49 64 3d 31 3b 20       for(nId=1; 
1aa0: 49 64 43 68 61 72 28 7a 53 71 6c 5b 6e 49 64 5d  IdChar(zSql[nId]
1ab0: 29 3b 20 6e 49 64 2b 2b 29 7b 7d 0a 23 69 66 64  ); nId++){}.#ifd
1ac0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1ad0: 52 49 47 47 45 52 0a 20 20 20 20 20 20 20 20 20  RIGGER.         
1ae0: 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52   token = tkOTHER
1af0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
1b00: 20 20 73 77 69 74 63 68 28 20 2a 7a 53 71 6c 20    switch( *zSql 
1b10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
1b20: 61 73 65 20 27 63 27 3a 20 63 61 73 65 20 27 43  ase 'c': case 'C
1b30: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ': {.           
1b40: 20 20 20 69 66 28 20 6e 49 64 3d 3d 36 20 26 26     if( nId==6 &&
1b50: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1b60: 28 7a 53 71 6c 2c 20 22 63 72 65 61 74 65 22 2c  (zSql, "create",
1b70: 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   6)==0 ){.      
1b80: 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20            token 
1b90: 3d 20 74 6b 43 52 45 41 54 45 3b 0a 20 20 20 20  = tkCREATE;.    
1ba0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bc0: 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52   token = tkOTHER
1bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1be0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1c00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1c10: 20 63 61 73 65 20 27 74 27 3a 20 63 61 73 65 20   case 't': case 
1c20: 27 54 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  'T': {.         
1c30: 20 20 20 20 20 69 66 28 20 6e 49 64 3d 3d 37 20       if( nId==7 
1c40: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
1c50: 6d 70 28 7a 53 71 6c 2c 20 22 74 72 69 67 67 65  mp(zSql, "trigge
1c60: 72 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  r", 7)==0 ){.   
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b               tok
1c80: 65 6e 20 3d 20 74 6b 54 52 49 47 47 45 52 3b 0a  en = tkTRIGGER;.
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
1ca0: 6c 73 65 20 69 66 28 20 6e 49 64 3d 3d 34 20 26  lse if( nId==4 &
1cb0: 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
1cc0: 70 28 7a 53 71 6c 2c 20 22 74 65 6d 70 22 2c 20  p(zSql, "temp", 
1cd0: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
1ce0: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d           token =
1cf0: 20 74 6b 54 45 4d 50 3b 0a 20 20 20 20 20 20 20   tkTEMP;.       
1d00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1d10: 20 6e 49 64 3d 3d 39 20 26 26 20 73 71 6c 69 74   nId==9 && sqlit
1d20: 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c  e3StrNICmp(zSql,
1d30: 20 22 74 65 6d 70 6f 72 61 72 79 22 2c 20 39 29   "temporary", 9)
1d40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1d50: 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74         token = t
1d60: 6b 54 45 4d 50 3b 0a 20 20 20 20 20 20 20 20 20  kTEMP;.         
1d70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65              toke
1d90: 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20  n = tkOTHER;.   
1da0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1db0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1dc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
1de0: 20 27 65 27 3a 20 20 63 61 73 65 20 27 45 27 3a   'e':  case 'E':
1df0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1e00: 20 69 66 28 20 6e 49 64 3d 3d 33 20 26 26 20 73   if( nId==3 && s
1e10: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
1e20: 53 71 6c 2c 20 22 65 6e 64 22 2c 20 33 29 3d 3d  Sql, "end", 3)==
1e30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1e40: 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 45       token = tkE
1e50: 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ND;.            
1e60: 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20    }else.#ifndef 
1e70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1e80: 41 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  AIN.            
1e90: 20 20 69 66 28 20 6e 49 64 3d 3d 37 20 26 26 20    if( nId==7 && 
1ea0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1eb0: 7a 53 71 6c 2c 20 22 65 78 70 6c 61 69 6e 22 2c  zSql, "explain",
1ec0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   7)==0 ){.      
1ed0: 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20            token 
1ee0: 3d 20 74 6b 45 58 50 4c 41 49 4e 3b 0a 20 20 20  = tkEXPLAIN;.   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1f00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1f10: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1f20: 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20          token = 
1f30: 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20 20 20  tkOTHER;.       
1f40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f70: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
1f80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1f90: 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52   token = tkOTHER
1fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1fc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1fd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1fe0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 2a  E_OMIT_TRIGGER *
1ff0: 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c  /.          zSql
2000: 20 2b 3d 20 6e 49 64 2d 31 3b 0a 20 20 20 20 20   += nId-1;.     
2010: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2020: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73      /* Operators
2030: 20 61 6e 64 20 73 70 65 63 69 61 6c 20 73 79 6d   and special sym
2040: 62 6f 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  bols */.        
2050: 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45    token = tkOTHE
2060: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
2070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2080: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 74    }.    }.    st
2090: 61 74 65 20 3d 20 74 72 61 6e 73 5b 73 74 61 74  ate = trans[stat
20a0: 65 5d 5b 74 6f 6b 65 6e 5d 3b 0a 20 20 20 20 7a  e][token];.    z
20b0: 53 71 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Sql++;.  }.  ret
20c0: 75 72 6e 20 73 74 61 74 65 3d 3d 31 3b 0a 7d 0a  urn state==1;.}.
20d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20e0: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
20f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2100: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2110: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
2120: 65 28 29 20 72 6f 75 74 69 6e 65 20 64 65 73 63  e() routine desc
2130: 72 69 62 65 64 0a 2a 2a 20 61 62 6f 76 65 2c 20  ribed.** above, 
2140: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
2150: 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 71  parameter is req
2160: 75 69 72 65 64 20 74 6f 20 62 65 20 55 54 46 2d  uired to be UTF-
2170: 31 36 20 65 6e 63 6f 64 65 64 2c 20 6e 6f 74 0a  16 encoded, not.
2180: 2a 2a 20 55 54 46 2d 38 2e 0a 2a 2f 0a 69 6e 74  ** UTF-8..*/.int
2190: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
21a0: 65 31 36 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  e16(const void *
21b0: 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  zSql){.  sqlite3
21c0: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
21d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c  char const *zSql
21e0: 38 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  8;.  int rc = SQ
21f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 23 69 66  LITE_NOMEM;..#if
2200: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2210: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
2220: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
2230: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
2240: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
2250: 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  dif.  pVal = sql
2260: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
2270: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
2280: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
2290: 7a 53 71 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  zSql, SQLITE_UTF
22a0: 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45  16NATIVE, SQLITE
22b0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 53 71 6c  _STATIC);.  zSql
22c0: 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  8 = sqlite3Value
22d0: 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
22e0: 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a  E_UTF8);.  if( z
22f0: 53 71 6c 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sql8 ){.    rc =
2300: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
2310: 65 28 7a 53 71 6c 38 29 3b 0a 20 20 7d 65 6c 73  e(zSql8);.  }els
2320: 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
2330: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
2340: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
2350: 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
2360: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
2370: 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
2380: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2390: 55 54 46 31 36 20 2a 2f 0a 23 65 6e 64 69 66 20  UTF16 */.#endif 
23a0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
23b0: 4f 4d 50 4c 45 54 45 20 2a 2f 0a                 OMPLETE */.