/ Hex Artifact Content
Login

Artifact a3634ab1e687055cd002e11b8f43eb75c17da23e:


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 23 69 66 64 65 66 20 53 51 4c  R */..#ifdef SQL
1470: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1480: 52 4d 4f 52 0a 20 20 69 66 28 20 7a 53 71 6c 3d  RMOR.  if( zSql=
1490: 3d 30 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  =0 ){.    (void)
14a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
14b0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
14c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14d0: 77 68 69 6c 65 28 20 2a 7a 53 71 6c 20 29 7b 0a  while( *zSql ){.
14e0: 20 20 20 20 73 77 69 74 63 68 28 20 2a 7a 53 71      switch( *zSq
14f0: 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  l ){.      case 
1500: 27 3b 27 3a 20 7b 20 20 2f 2a 20 41 20 73 65 6d  ';': {  /* A sem
1510: 69 63 6f 6c 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  icolon */.      
1520: 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 53 45 4d 49    token = tkSEMI
1530: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1540: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
1550: 61 73 65 20 27 20 27 3a 0a 20 20 20 20 20 20 63  ase ' ':.      c
1560: 61 73 65 20 27 5c 72 27 3a 0a 20 20 20 20 20 20  ase '\r':.      
1570: 63 61 73 65 20 27 5c 74 27 3a 0a 20 20 20 20 20  case '\t':.     
1580: 20 63 61 73 65 20 27 5c 6e 27 3a 0a 20 20 20 20   case '\n':.    
1590: 20 20 63 61 73 65 20 27 5c 66 27 3a 20 7b 20 20    case '\f': {  
15a0: 2f 2a 20 57 68 69 74 65 20 73 70 61 63 65 20 69  /* White space i
15b0: 73 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20  s ignored */.   
15c0: 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 57       token = tkW
15d0: 53 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  S;.        break
15e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15f0: 63 61 73 65 20 27 2f 27 3a 20 7b 20 20 20 2f 2a  case '/': {   /*
1600: 20 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74   C-style comment
1610: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
1620: 20 7a 53 71 6c 5b 31 5d 21 3d 27 2a 27 20 29 7b   zSql[1]!='*' ){
1630: 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e  .          token
1640: 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20   = tkOTHER;.    
1650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
1670: 53 71 6c 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  Sql += 2;.      
1680: 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d    while( zSql[0]
1690: 20 26 26 20 28 7a 53 71 6c 5b 30 5d 21 3d 27 2a   && (zSql[0]!='*
16a0: 27 20 7c 7c 20 7a 53 71 6c 5b 31 5d 21 3d 27 2f  ' || zSql[1]!='/
16b0: 27 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a  ') ){ zSql++; }.
16c0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c          if( zSql
16d0: 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [0]==0 ) return 
16e0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 2b  0;.        zSql+
16f0: 2b 3b 0a 20 20 20 20 20 20 20 20 74 6f 6b 65 6e  +;.        token
1700: 20 3d 20 74 6b 57 53 3b 0a 20 20 20 20 20 20 20   = tkWS;.       
1710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1720: 20 20 20 20 20 20 63 61 73 65 20 27 2d 27 3a 20        case '-': 
1730: 7b 20 20 20 2f 2a 20 53 51 4c 2d 73 74 79 6c 65  {   /* SQL-style
1740: 20 63 6f 6d 6d 65 6e 74 73 20 66 72 6f 6d 20 22   comments from "
1750: 2d 2d 22 20 74 6f 20 65 6e 64 20 6f 66 20 6c 69  --" to end of li
1760: 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ne */.        if
1770: 28 20 7a 53 71 6c 5b 31 5d 21 3d 27 2d 27 20 29  ( zSql[1]!='-' )
1780: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65  {.          toke
1790: 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20  n = tkOTHER;.   
17a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17c0: 77 68 69 6c 65 28 20 2a 7a 53 71 6c 20 26 26 20  while( *zSql && 
17d0: 2a 7a 53 71 6c 21 3d 27 5c 6e 27 20 29 7b 20 7a  *zSql!='\n' ){ z
17e0: 53 71 6c 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  Sql++; }.       
17f0: 20 69 66 28 20 2a 7a 53 71 6c 3d 3d 30 20 29 20   if( *zSql==0 ) 
1800: 72 65 74 75 72 6e 20 73 74 61 74 65 3d 3d 31 3b  return state==1;
1810: 0a 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d  .        token =
1820: 20 74 6b 57 53 3b 0a 20 20 20 20 20 20 20 20 62   tkWS;.        b
1830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1840: 20 20 20 20 63 61 73 65 20 27 5b 27 3a 20 7b 20      case '[': { 
1850: 20 20 2f 2a 20 4d 69 63 72 6f 73 6f 66 74 2d 73    /* Microsoft-s
1860: 74 79 6c 65 20 69 64 65 6e 74 69 66 69 65 72 73  tyle identifiers
1870: 20 69 6e 20 5b 2e 2e 2e 5d 20 2a 2f 0a 20 20 20   in [...] */.   
1880: 20 20 20 20 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20       zSql++;.   
1890: 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 71       while( *zSq
18a0: 6c 20 26 26 20 2a 7a 53 71 6c 21 3d 27 5d 27 20  l && *zSql!=']' 
18b0: 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 20  ){ zSql++; }.   
18c0: 20 20 20 20 20 69 66 28 20 2a 7a 53 71 6c 3d 3d       if( *zSql==
18d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18e0: 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b        token = tk
18f0: 4f 54 48 45 52 3b 0a 20 20 20 20 20 20 20 20 62  OTHER;.        b
1900: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1910: 20 20 20 20 63 61 73 65 20 27 60 27 3a 20 20 20      case '`':   
1920: 20 20 2f 2a 20 47 72 61 76 65 2d 61 63 63 65 6e    /* Grave-accen
1930: 74 20 71 75 6f 74 65 64 20 73 79 6d 62 6f 6c 73  t quoted symbols
1940: 20 75 73 65 64 20 62 79 20 4d 79 53 51 4c 20 2a   used by MySQL *
1950: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 27 22 27  /.      case '"'
1960: 3a 20 20 20 20 20 2f 2a 20 73 69 6e 67 6c 65 2d  :     /* single-
1970: 20 61 6e 64 20 64 6f 75 62 6c 65 2d 71 75 6f 74   and double-quot
1980: 65 64 20 73 74 72 69 6e 67 73 20 2a 2f 0a 20 20  ed strings */.  
1990: 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 20 7b      case '\'': {
19a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 20 3d  .        int c =
19b0: 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20   *zSql;.        
19c0: 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zSql++;.        
19d0: 77 68 69 6c 65 28 20 2a 7a 53 71 6c 20 26 26 20  while( *zSql && 
19e0: 2a 7a 53 71 6c 21 3d 63 20 29 7b 20 7a 53 71 6c  *zSql!=c ){ zSql
19f0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ++; }.        if
1a00: 28 20 2a 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  ( *zSql==0 ) ret
1a10: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 74  urn 0;.        t
1a20: 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a  oken = tkOTHER;.
1a30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
1a50: 61 75 6c 74 3a 20 7b 0a 23 69 66 64 65 66 20 53  ault: {.#ifdef S
1a60: 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 20  QLITE_EBCDIC.   
1a70: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
1a80: 61 72 20 63 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ar c;.#endif.   
1a90: 20 20 20 20 20 69 66 28 20 49 64 43 68 61 72 28       if( IdChar(
1aa0: 28 75 38 29 2a 7a 53 71 6c 29 20 29 7b 0a 20 20  (u8)*zSql) ){.  
1ab0: 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77 6f          /* Keywo
1ac0: 72 64 73 20 61 6e 64 20 75 6e 71 75 6f 74 65 64  rds and unquoted
1ad0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a   identifiers */.
1ae0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 49            int nI
1af0: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  d;.          for
1b00: 28 6e 49 64 3d 31 3b 20 49 64 43 68 61 72 28 7a  (nId=1; IdChar(z
1b10: 53 71 6c 5b 6e 49 64 5d 29 3b 20 6e 49 64 2b 2b  Sql[nId]); nId++
1b20: 29 7b 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ){}.#ifdef SQLIT
1b30: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
1b40: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d           token =
1b50: 20 74 6b 4f 54 48 45 52 3b 0a 23 65 6c 73 65 0a   tkOTHER;.#else.
1b60: 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
1b70: 28 20 2a 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  ( *zSql ){.     
1b80: 20 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a         case 'c':
1b90: 20 63 61 73 65 20 27 43 27 3a 20 7b 0a 20 20 20   case 'C': {.   
1ba0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
1bb0: 49 64 3d 3d 36 20 26 26 20 73 71 6c 69 74 65 33  Id==6 && sqlite3
1bc0: 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20 22  StrNICmp(zSql, "
1bd0: 63 72 65 61 74 65 22 2c 20 36 29 3d 3d 30 20 29  create", 6)==0 )
1be0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1bf0: 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 43 52 45 41    token = tkCREA
1c00: 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE;.            
1c10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c20: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d           token =
1c30: 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20 20   tkOTHER;.      
1c40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1c70: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 27 74           case 't
1c80: 27 3a 20 63 61 73 65 20 27 54 27 3a 20 7b 0a 20  ': case 'T': {. 
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1ca0: 20 6e 49 64 3d 3d 37 20 26 26 20 73 71 6c 69 74   nId==7 && sqlit
1cb0: 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c  e3StrNICmp(zSql,
1cc0: 20 22 74 72 69 67 67 65 72 22 2c 20 37 29 3d 3d   "trigger", 7)==
1cd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1ce0: 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 54       token = tkT
1cf0: 52 49 47 47 45 52 3b 0a 20 20 20 20 20 20 20 20  RIGGER;.        
1d00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d10: 6e 49 64 3d 3d 34 20 26 26 20 73 71 6c 69 74 65  nId==4 && sqlite
1d20: 33 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20  3StrNICmp(zSql, 
1d30: 22 74 65 6d 70 22 2c 20 34 29 3d 3d 30 20 29 7b  "temp", 4)==0 ){
1d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d50: 20 74 6f 6b 65 6e 20 3d 20 74 6b 54 45 4d 50 3b   token = tkTEMP;
1d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1d70: 65 6c 73 65 20 69 66 28 20 6e 49 64 3d 3d 39 20  else if( nId==9 
1d80: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
1d90: 6d 70 28 7a 53 71 6c 2c 20 22 74 65 6d 70 6f 72  mp(zSql, "tempor
1da0: 61 72 79 22 2c 20 39 29 3d 3d 30 20 29 7b 0a 20  ary", 9)==0 ){. 
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1dc0: 6f 6b 65 6e 20 3d 20 74 6b 54 45 4d 50 3b 0a 20  oken = tkTEMP;. 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
1de0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1df0: 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54      token = tkOT
1e00: 48 45 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  HER;.           
1e10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e40: 20 20 20 20 63 61 73 65 20 27 65 27 3a 20 20 63      case 'e':  c
1e50: 61 73 65 20 27 45 27 3a 20 7b 0a 20 20 20 20 20  ase 'E': {.     
1e60: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 64           if( nId
1e70: 3d 3d 33 20 26 26 20 73 71 6c 69 74 65 33 53 74  ==3 && sqlite3St
1e80: 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20 22 65 6e  rNICmp(zSql, "en
1e90: 64 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  d", 3)==0 ){.   
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b               tok
1eb0: 65 6e 20 3d 20 74 6b 45 4e 44 3b 0a 20 20 20 20  en = tkEND;.    
1ec0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a            }else.
1ed0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ee0: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20  MIT_EXPLAIN.    
1ef0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 49            if( nI
1f00: 64 3d 3d 37 20 26 26 20 73 71 6c 69 74 65 33 53  d==7 && sqlite3S
1f10: 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20 22 65  trNICmp(zSql, "e
1f20: 78 70 6c 61 69 6e 22 2c 20 37 29 3d 3d 30 20 29  xplain", 7)==0 )
1f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f40: 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 45 58 50 4c    token = tkEXPL
1f50: 41 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  AIN;.           
1f60: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a                {.
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b  token = tkOTHER;
1fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
1fc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1fd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1fe0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1ff0: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d           token =
2000: 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20 20   tkOTHER;.      
2010: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2020: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2030: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
2040: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
2050: 52 49 47 47 45 52 20 2a 2f 0a 20 20 20 20 20 20  RIGGER */.      
2060: 20 20 20 20 7a 53 71 6c 20 2b 3d 20 6e 49 64 2d      zSql += nId-
2070: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2080: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  {.          /* O
2090: 70 65 72 61 74 6f 72 73 20 61 6e 64 20 73 70 65  perators and spe
20a0: 63 69 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  cial symbols */.
20b0: 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20            token 
20c0: 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20  = tkOTHER;.     
20d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
20e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20f0: 7d 0a 20 20 20 20 73 74 61 74 65 20 3d 20 74 72  }.    state = tr
2100: 61 6e 73 5b 73 74 61 74 65 5d 5b 74 6f 6b 65 6e  ans[state][token
2110: 5d 3b 0a 20 20 20 20 7a 53 71 6c 2b 2b 3b 0a 20  ];.    zSql++;. 
2120: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 61 74   }.  return stat
2130: 65 3d 3d 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  e==1;.}..#ifndef
2140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
2150: 31 36 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  16./*.** This ro
2160: 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d  utine is the sam
2170: 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33  e as the sqlite3
2180: 5f 63 6f 6d 70 6c 65 74 65 28 29 20 72 6f 75 74  _complete() rout
2190: 69 6e 65 20 64 65 73 63 72 69 62 65 64 0a 2a 2a  ine described.**
21a0: 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
21b0: 68 61 74 20 74 68 65 20 70 61 72 61 6d 65 74 65  hat the paramete
21c0: 72 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  r is required to
21d0: 20 62 65 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   be UTF-16 encod
21e0: 65 64 2c 20 6e 6f 74 0a 2a 2a 20 55 54 46 2d 38  ed, not.** UTF-8
21f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2200: 5f 63 6f 6d 70 6c 65 74 65 31 36 28 63 6f 6e 73  _complete16(cons
2210: 74 20 76 6f 69 64 20 2a 7a 53 71 6c 29 7b 0a 20  t void *zSql){. 
2220: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2230: 70 56 61 6c 3b 0a 20 20 63 68 61 72 20 63 6f 6e  pVal;.  char con
2240: 73 74 20 2a 7a 53 71 6c 38 3b 0a 20 20 69 6e 74  st *zSql8;.  int
2250: 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
2260: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
2270: 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
2280: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
2290: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
22a0: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70  n rc;.#endif.  p
22b0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
22c0: 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
22d0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
22e0: 56 61 6c 2c 20 2d 31 2c 20 7a 53 71 6c 2c 20 53  Val, -1, zSql, S
22f0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
2300: 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
2310: 29 3b 0a 20 20 7a 53 71 6c 38 20 3d 20 73 71 6c  );.  zSql8 = sql
2320: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
2330: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  al, SQLITE_UTF8)
2340: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 38 20 29 7b  ;.  if( zSql8 ){
2350: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2360: 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 38  3_complete(zSql8
2370: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2380: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2390: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  M_BKPT;.  }.  sq
23a0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
23b0: 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Val);.  return r
23c0: 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64  c & 0xff;.}.#end
23d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
23e0: 54 5f 55 54 46 31 36 20 2a 2f 0a 23 65 6e 64 69  T_UTF16 */.#endi
23f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2400: 5f 43 4f 4d 50 4c 45 54 45 20 2a 2f 0a           _COMPLETE */.