/ Hex Artifact Content
Login

Artifact 4cf68fd75d60257524cbe74f87351b9848399131:


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: 36 20 32 30 30 37 2f 30 38 2f 32 37 20 32 33 3a  6 2007/08/27 23:
02b0: 32 36 3a 35 39 20 64 72 68 20 45 78 70 20 24 0a  26:59 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 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
0350: 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54  SQLITE_AMALGAMAT
0360: 49 4f 4e 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ION.#ifdef SQLIT
0370: 45 5f 41 53 43 49 49 0a 65 78 74 65 72 6e 20 63  E_ASCII.extern c
0380: 6f 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65  onst char sqlite
0390: 33 49 73 41 73 63 69 69 49 64 43 68 61 72 5b 5d  3IsAsciiIdChar[]
03a0: 3b 0a 23 64 65 66 69 6e 65 20 49 64 43 68 61 72  ;.#define IdChar
03b0: 28 43 29 20 20 28 28 28 63 3d 43 29 26 30 78 38  (C)  (((c=C)&0x8
03c0: 30 29 21 3d 30 20 7c 7c 20 28 63 3e 30 78 31 66  0)!=0 || (c>0x1f
03d0: 20 26 26 20 73 71 6c 69 74 65 33 49 73 41 73 63   && sqlite3IsAsc
03e0: 69 69 49 64 43 68 61 72 5b 63 2d 30 78 32 30 5d  iiIdChar[c-0x20]
03f0: 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  )).#endif.#ifdef
0400: 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 65   SQLITE_EBCDIC.e
0410: 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68 61 72  xtern const char
0420: 20 73 71 6c 69 74 65 33 49 73 45 62 63 64 69 63   sqlite3IsEbcdic
0430: 49 64 43 68 61 72 5b 5d 3b 0a 23 64 65 66 69 6e  IdChar[];.#defin
0440: 65 20 49 64 43 68 61 72 28 43 29 20 20 28 28 28  e IdChar(C)  (((
0450: 63 3d 43 29 3e 3d 30 78 34 32 20 26 26 20 73 71  c=C)>=0x42 && sq
0460: 6c 69 74 65 33 49 73 45 62 63 64 69 63 49 64 43  lite3IsEbcdicIdC
0470: 68 61 72 5b 63 2d 30 78 34 30 5d 29 29 0a 23 65  har[c-0x40])).#e
0480: 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ndif.#endif /* S
0490: 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49  QLITE_AMALGAMATI
04a0: 4f 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 6f  ON */.../*.** To
04b0: 6b 65 6e 20 74 79 70 65 73 20 75 73 65 64 20 62  ken types used b
04c0: 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f  y the sqlite3_co
04d0: 6d 70 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  mplete() routine
04e0: 2e 20 20 53 65 65 20 74 68 65 20 68 65 61 64 65  .  See the heade
04f0: 72 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  r.** comments on
0500: 20 74 68 61 74 20 70 72 6f 63 65 64 75 72 65 20   that procedure 
0510: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
0520: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23  nformation..*/.#
0530: 64 65 66 69 6e 65 20 74 6b 53 45 4d 49 20 20 20  define tkSEMI   
0540: 20 30 0a 23 64 65 66 69 6e 65 20 74 6b 57 53 20   0.#define tkWS 
0550: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 74       1.#define t
0560: 6b 4f 54 48 45 52 20 20 20 32 0a 23 64 65 66 69  kOTHER   2.#defi
0570: 6e 65 20 74 6b 45 58 50 4c 41 49 4e 20 33 0a 23  ne tkEXPLAIN 3.#
0580: 64 65 66 69 6e 65 20 74 6b 43 52 45 41 54 45 20  define tkCREATE 
0590: 20 34 0a 23 64 65 66 69 6e 65 20 74 6b 54 45 4d   4.#define tkTEM
05a0: 50 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 74  P    5.#define t
05b0: 6b 54 52 49 47 47 45 52 20 36 0a 23 64 65 66 69  kTRIGGER 6.#defi
05c0: 6e 65 20 74 6b 45 4e 44 20 20 20 20 20 37 0a 0a  ne tkEND     7..
05d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
05e0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 53  E if the given S
05f0: 51 4c 20 73 74 72 69 6e 67 20 65 6e 64 73 20 69  QL string ends i
0600: 6e 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a  n a semicolon..*
0610: 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 68 61 6e  *.** Special han
0620: 64 6c 69 6e 67 20 69 73 20 72 65 71 75 69 72 65  dling is require
0630: 20 66 6f 72 20 43 52 45 41 54 45 20 54 52 49 47   for CREATE TRIG
0640: 47 45 52 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  GER statements..
0650: 2a 2a 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  ** Whenever the 
0660: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 6b  CREATE TRIGGER k
0670: 65 79 77 6f 72 64 73 20 61 72 65 20 73 65 65 6e  eywords are seen
0680: 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  , the statement.
0690: 2a 2a 20 6d 75 73 74 20 65 6e 64 20 77 69 74 68  ** must end with
06a0: 20 22 3b 45 4e 44 3b 22 2e 0a 2a 2a 0a 2a 2a 20   ";END;"..**.** 
06b0: 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  This implementat
06c0: 69 6f 6e 20 75 73 65 73 20 61 20 73 74 61 74 65  ion uses a state
06d0: 20 6d 61 63 68 69 6e 65 20 77 69 74 68 20 37 20   machine with 7 
06e0: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
06f0: 28 30 29 20 53 54 41 52 54 20 20 20 20 20 41 74  (0) START     At
0700: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
0710: 72 20 65 6e 64 20 6f 66 20 61 6e 20 53 51 4c 20  r end of an SQL 
0720: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
0730: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 20 20 20 20   routine.**     
0740: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0750: 72 6e 73 20 31 20 69 66 20 69 74 20 65 6e 64 73  rns 1 if it ends
0760: 20 69 6e 20 74 68 65 20 53 54 41 52 54 20 73 74   in the START st
0770: 61 74 65 20 61 6e 64 20 30 20 69 66 20 69 74 20  ate and 0 if it 
0780: 65 6e 64 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ends.**         
0790: 20 20 20 20 20 20 20 20 69 6e 20 61 6e 79 20 6f          in any o
07a0: 74 68 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ther state..**.*
07b0: 2a 20 20 20 28 31 29 20 4e 4f 52 4d 41 4c 20 20  *   (1) NORMAL  
07c0: 20 20 57 65 20 61 72 65 20 69 6e 20 74 68 65 20    We are in the 
07d0: 6d 69 64 64 6c 65 20 6f 66 20 73 74 61 74 65 6d  middle of statem
07e0: 65 6e 74 20 77 68 69 63 68 20 65 6e 64 73 20 77  ent which ends w
07f0: 69 74 68 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  ith a single.** 
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a 0a 2a 2a  semicolon..**.**
0820: 20 20 20 28 32 29 20 45 58 50 4c 41 49 4e 20 20     (2) EXPLAIN  
0830: 20 54 68 65 20 6b 65 79 77 6f 72 64 20 45 58 50   The keyword EXP
0840: 4c 41 49 4e 20 68 61 73 20 62 65 65 6e 20 73 65  LAIN has been se
0850: 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
0860: 69 6e 67 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20  ing of .**      
0870: 20 20 20 20 20 20 20 20 20 20 20 61 20 73 74 61             a sta
0880: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
0890: 28 33 29 20 43 52 45 41 54 45 20 20 20 20 54 68  (3) CREATE    Th
08a0: 65 20 6b 65 79 77 6f 72 64 20 43 52 45 41 54 45  e keyword CREATE
08b0: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 61   has been seen a
08c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
08d0: 6f 66 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  of a.**         
08e0: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
08f0: 74 2c 20 70 6f 73 73 69 62 6c 79 20 70 72 65 63  t, possibly prec
0900: 65 65 64 65 64 20 62 79 20 45 58 50 4c 41 49 4e  eeded by EXPLAIN
0910: 20 61 6e 64 2f 6f 72 20 66 6f 6c 6c 6f 77 65 64   and/or followed
0920: 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   by.**          
0930: 20 20 20 20 20 20 20 54 45 4d 50 20 6f 72 20 54         TEMP or T
0940: 45 4d 50 4f 52 41 52 59 0a 2a 2a 0a 2a 2a 20 20  EMPORARY.**.**  
0950: 20 28 34 29 20 54 52 49 47 47 45 52 20 20 20 57   (4) TRIGGER   W
0960: 65 20 61 72 65 20 69 6e 20 74 68 65 20 6d 69 64  e are in the mid
0970: 64 6c 65 20 6f 66 20 61 20 74 72 69 67 67 65 72  dle of a trigger
0980: 20 64 65 66 69 6e 69 74 69 6f 6e 20 74 68 61 74   definition that
0990: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20   must be.**     
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 64 65              ende
09b0: 64 20 62 79 20 61 20 73 65 6d 69 63 6f 6c 6f 6e  d by a semicolon
09c0: 2c 20 74 68 65 20 6b 65 79 77 6f 72 64 20 45 4e  , the keyword EN
09d0: 44 2c 20 61 6e 64 20 61 6e 6f 74 68 65 72 20 73  D, and another s
09e0: 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  emicolon..**.** 
09f0: 20 20 28 35 29 20 53 45 4d 49 20 20 20 20 20 20    (5) SEMI      
0a00: 57 65 27 76 65 20 73 65 65 6e 20 74 68 65 20 66  We've seen the f
0a10: 69 72 73 74 20 73 65 6d 69 63 6f 6c 6f 6e 20 69  irst semicolon i
0a20: 6e 20 74 68 65 20 22 3b 45 4e 44 3b 22 20 74 68  n the ";END;" th
0a30: 61 74 20 6f 63 63 75 72 73 20 61 74 0a 2a 2a 20  at occurs at.** 
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 74 72 69  the end of a tri
0a60: 67 67 65 72 20 64 65 66 69 6e 69 74 69 6f 6e 2e  gger definition.
0a70: 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 45 4e 44  .**.**   (6) END
0a80: 20 20 20 20 20 20 20 57 65 27 76 65 20 73 65 65         We've see
0a90: 6e 20 74 68 65 20 22 3b 45 4e 44 22 20 6f 66 20  n the ";END" of 
0aa0: 74 68 65 20 22 3b 45 4e 44 3b 22 20 74 68 61 74  the ";END;" that
0ab0: 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 65   occurs at the e
0ac0: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
0ad0: 20 20 20 20 20 20 6f 66 20 61 20 74 72 69 67 67        of a trigg
0ae0: 65 72 20 64 69 66 69 6e 69 74 69 6f 6e 2e 0a 2a  er difinition..*
0af0: 2a 0a 2a 2a 20 54 72 61 6e 73 69 74 69 6f 6e 73  *.** Transitions
0b00: 20 62 65 74 77 65 65 6e 20 73 74 61 74 65 73 20   between states 
0b10: 61 62 6f 76 65 20 61 72 65 20 64 65 74 65 72 6d  above are determ
0b20: 69 6e 65 64 20 62 79 20 74 6f 6b 65 6e 73 20 65  ined by tokens e
0b30: 78 74 72 61 63 74 65 64 0a 2a 2a 20 66 72 6f 6d  xtracted.** from
0b40: 20 74 68 65 20 69 6e 70 75 74 2e 20 20 54 68 65   the input.  The
0b50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 6b 65 6e   following token
0b60: 73 20 61 72 65 20 73 69 67 6e 69 66 69 63 61 6e  s are significan
0b70: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 30 29 20 74  t:.**.**   (0) t
0b80: 6b 53 45 4d 49 20 20 20 20 20 20 41 20 73 65 6d  kSEMI      A sem
0b90: 69 63 6f 6c 6f 6e 2e 0a 2a 2a 20 20 20 28 31 29  icolon..**   (1)
0ba0: 20 74 6b 57 53 20 20 20 20 20 20 20 20 57 68 69   tkWS        Whi
0bb0: 74 65 73 70 61 63 65 0a 2a 2a 20 20 20 28 32 29  tespace.**   (2)
0bc0: 20 74 6b 4f 54 48 45 52 20 20 20 20 20 41 6e 79   tkOTHER     Any
0bd0: 20 6f 74 68 65 72 20 53 51 4c 20 74 6f 6b 65 6e   other SQL token
0be0: 2e 0a 2a 2a 20 20 20 28 33 29 20 74 6b 45 58 50  ..**   (3) tkEXP
0bf0: 4c 41 49 4e 20 20 20 54 68 65 20 22 65 78 70 6c  LAIN   The "expl
0c00: 61 69 6e 22 20 6b 65 79 77 6f 72 64 2e 0a 2a 2a  ain" keyword..**
0c10: 20 20 20 28 34 29 20 74 6b 43 52 45 41 54 45 20     (4) tkCREATE 
0c20: 20 20 20 54 68 65 20 22 63 72 65 61 74 65 22 20     The "create" 
0c30: 6b 65 79 77 6f 72 64 2e 0a 2a 2a 20 20 20 28 35  keyword..**   (5
0c40: 29 20 74 6b 54 45 4d 50 20 20 20 20 20 20 54 68  ) tkTEMP      Th
0c50: 65 20 22 74 65 6d 70 22 20 6f 72 20 22 74 65 6d  e "temp" or "tem
0c60: 70 6f 72 61 72 79 22 20 6b 65 79 77 6f 72 64 2e  porary" keyword.
0c70: 0a 2a 2a 20 20 20 28 36 29 20 74 6b 54 52 49 47  .**   (6) tkTRIG
0c80: 47 45 52 20 20 20 54 68 65 20 22 74 72 69 67 67  GER   The "trigg
0c90: 65 72 22 20 6b 65 79 77 6f 72 64 2e 0a 2a 2a 20  er" keyword..** 
0ca0: 20 20 28 37 29 20 74 6b 45 4e 44 20 20 20 20 20    (7) tkEND     
0cb0: 20 20 54 68 65 20 22 65 6e 64 22 20 6b 65 79 77    The "end" keyw
0cc0: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 69 74 65  ord..**.** White
0cd0: 73 70 61 63 65 20 6e 65 76 65 72 20 63 61 75 73  space never caus
0ce0: 65 73 20 61 20 73 74 61 74 65 20 74 72 61 6e 73  es a state trans
0cf0: 69 74 69 6f 6e 20 61 6e 64 20 69 73 20 61 6c 77  ition and is alw
0d00: 61 79 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a  ays ignored..**.
0d10: 2a 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  ** If we compile
0d20: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
0d30: 54 5f 54 52 49 47 47 45 52 2c 20 61 6c 6c 20 6f  T_TRIGGER, all o
0d40: 66 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  f the computatio
0d50: 6e 20 6e 65 65 64 65 64 0a 2a 2a 20 74 6f 20 72  n needed.** to r
0d60: 65 63 6f 67 6e 69 7a 65 20 74 68 65 20 65 6e 64  ecognize the end
0d70: 20 6f 66 20 61 20 74 72 69 67 67 65 72 20 63 61   of a trigger ca
0d80: 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 41  n be omitted.  A
0d90: 6c 6c 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ll we have to do
0da0: 0a 2a 2a 20 69 73 20 6c 6f 6f 6b 20 66 6f 72 20  .** is look for 
0db0: 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 68 61 74  a semicolon that
0dc0: 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
0dd0: 61 6e 20 73 74 72 69 6e 67 20 6f 72 20 63 6f 6d  an string or com
0de0: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
0df0: 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 63 6f  ite3_complete(co
0e00: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
0e10: 0a 20 20 75 38 20 73 74 61 74 65 20 3d 20 30 3b  .  u8 state = 0;
0e20: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74     /* Current st
0e30: 61 74 65 2c 20 75 73 69 6e 67 20 6e 75 6d 62 65  ate, using numbe
0e40: 72 73 20 64 65 66 69 6e 65 64 20 69 6e 20 68 65  rs defined in he
0e50: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 2a 2f 0a  ader comment */.
0e60: 20 20 75 38 20 74 6f 6b 65 6e 3b 20 20 20 20 20    u8 token;     
0e70: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68    /* Value of th
0e80: 65 20 6e 65 78 74 20 74 6f 6b 65 6e 20 2a 2f 0a  e next token */.
0e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0ea0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 2f  OMIT_TRIGGER.  /
0eb0: 2a 20 41 20 63 6f 6d 70 6c 65 78 20 73 74 61 74  * A complex stat
0ec0: 65 6d 65 6e 74 20 6d 61 63 68 69 6e 65 20 75 73  ement machine us
0ed0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 74 68 65  ed to detect the
0ee0: 20 65 6e 64 20 6f 66 20 61 20 43 52 45 41 54 45   end of a CREATE
0ef0: 20 54 52 49 47 47 45 52 0a 20 20 2a 2a 20 73 74   TRIGGER.  ** st
0f00: 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  atement.  This i
0f10: 73 20 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73  s the normal cas
0f20: 65 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  e..  */.  static
0f30: 20 63 6f 6e 73 74 20 75 38 20 74 72 61 6e 73 5b   const u8 trans[
0f40: 37 5d 5b 38 5d 20 3d 20 7b 0a 20 20 20 20 20 20  7][8] = {.      
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0f60: 2a 20 54 6f 6b 65 6e 3a 20 20 20 20 20 20 20 20  * Token:        
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
0fa0: 2f 2a 20 53 74 61 74 65 3a 20 20 20 20 20 20 20  /* State:       
0fb0: 2a 2a 20 20 53 45 4d 49 20 20 57 53 20 20 4f 54  **  SEMI  WS  OT
0fc0: 48 45 52 20 45 58 50 4c 41 49 4e 20 20 43 52 45  HER EXPLAIN  CRE
0fd0: 41 54 45 20 20 54 45 4d 50 20 20 54 52 49 47 47  ATE  TEMP  TRIGG
0fe0: 45 52 20 20 45 4e 44 20 20 2a 2f 0a 20 20 20 20  ER  END  */.    
0ff0: 20 2f 2a 20 30 20 20 20 53 54 41 52 54 3a 20 2a   /* 0   START: *
1000: 2f 20 7b 20 20 20 20 30 2c 20 20 30 2c 20 20 20  / {    0,  0,   
1010: 20 20 31 2c 20 20 20 20 20 20 32 2c 20 20 20 20    1,      2,    
1020: 20 20 33 2c 20 20 20 20 31 2c 20 20 20 20 20 20    3,    1,      
1030: 20 31 2c 20 20 20 31 2c 20 20 7d 2c 0a 20 20 20   1,   1,  },.   
1040: 20 20 2f 2a 20 31 20 20 4e 4f 52 4d 41 4c 3a 20    /* 1  NORMAL: 
1050: 2a 2f 20 7b 20 20 20 20 30 2c 20 20 31 2c 20 20  */ {    0,  1,  
1060: 20 20 20 31 2c 20 20 20 20 20 20 31 2c 20 20 20     1,      1,   
1070: 20 20 20 31 2c 20 20 20 20 31 2c 20 20 20 20 20     1,    1,     
1080: 20 20 31 2c 20 20 20 31 2c 20 20 7d 2c 0a 20 20    1,   1,  },.  
1090: 20 20 20 2f 2a 20 32 20 45 58 50 4c 41 49 4e 3a     /* 2 EXPLAIN:
10a0: 20 2a 2f 20 7b 20 20 20 20 30 2c 20 20 32 2c 20   */ {    0,  2, 
10b0: 20 20 20 20 31 2c 20 20 20 20 20 20 31 2c 20 20      1,      1,  
10c0: 20 20 20 20 33 2c 20 20 20 20 31 2c 20 20 20 20      3,    1,    
10d0: 20 20 20 31 2c 20 20 20 31 2c 20 20 7d 2c 0a 20     1,   1,  },. 
10e0: 20 20 20 20 2f 2a 20 33 20 20 43 52 45 41 54 45      /* 3  CREATE
10f0: 3a 20 2a 2f 20 7b 20 20 20 20 30 2c 20 20 33 2c  : */ {    0,  3,
1100: 20 20 20 20 20 31 2c 20 20 20 20 20 20 31 2c 20       1,      1, 
1110: 20 20 20 20 20 31 2c 20 20 20 20 33 2c 20 20 20       1,    3,   
1120: 20 20 20 20 34 2c 20 20 20 31 2c 20 20 7d 2c 0a      4,   1,  },.
1130: 20 20 20 20 20 2f 2a 20 34 20 54 52 49 47 47 45       /* 4 TRIGGE
1140: 52 3a 20 2a 2f 20 7b 20 20 20 20 35 2c 20 20 34  R: */ {    5,  4
1150: 2c 20 20 20 20 20 34 2c 20 20 20 20 20 20 34 2c  ,     4,      4,
1160: 20 20 20 20 20 20 34 2c 20 20 20 20 34 2c 20 20        4,    4,  
1170: 20 20 20 20 20 34 2c 20 20 20 34 2c 20 20 7d 2c       4,   4,  },
1180: 0a 20 20 20 20 20 2f 2a 20 35 20 20 20 20 53 45  .     /* 5    SE
1190: 4d 49 3a 20 2a 2f 20 7b 20 20 20 20 35 2c 20 20  MI: */ {    5,  
11a0: 35 2c 20 20 20 20 20 34 2c 20 20 20 20 20 20 34  5,     4,      4
11b0: 2c 20 20 20 20 20 20 34 2c 20 20 20 20 34 2c 20  ,      4,    4, 
11c0: 20 20 20 20 20 20 34 2c 20 20 20 36 2c 20 20 7d        4,   6,  }
11d0: 2c 0a 20 20 20 20 20 2f 2a 20 36 20 20 20 20 20  ,.     /* 6     
11e0: 45 4e 44 3a 20 2a 2f 20 7b 20 20 20 20 30 2c 20  END: */ {    0, 
11f0: 20 36 2c 20 20 20 20 20 34 2c 20 20 20 20 20 20   6,     4,      
1200: 34 2c 20 20 20 20 20 20 34 2c 20 20 20 20 34 2c  4,      4,    4,
1210: 20 20 20 20 20 20 20 34 2c 20 20 20 34 2c 20 20         4,   4,  
1220: 7d 2c 0a 20 20 7d 3b 0a 23 65 6c 73 65 0a 20 20  },.  };.#else.  
1230: 2f 2a 20 49 66 20 74 72 69 67 67 65 72 73 20 61  /* If triggers a
1240: 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 65 64 20  re not suppored 
1250: 62 79 20 74 68 69 73 20 63 6f 6d 70 69 6c 65 20  by this compile 
1260: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
1270: 6e 74 20 6d 61 63 68 69 6e 65 0a 20 20 2a 2a 20  nt machine.  ** 
1280: 75 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 74  used to detect t
1290: 68 65 20 65 6e 64 20 6f 66 20 61 20 73 74 61 74  he end of a stat
12a0: 65 6d 65 6e 74 20 69 73 20 6d 75 63 68 20 73 69  ement is much si
12b0: 6d 70 6c 69 65 72 0a 20 20 2a 2f 0a 20 20 73 74  mplier.  */.  st
12c0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 72  atic const u8 tr
12d0: 61 6e 73 5b 32 5d 5b 33 5d 20 3d 20 7b 0a 20 20  ans[2][3] = {.  
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 2f 2a 20 54 6f 6b 65 6e 3a 20 20 20 20     /* Token:    
1300: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 2f         */.     /
1310: 2a 20 53 74 61 74 65 3a 20 20 20 20 20 20 20 2a  * State:       *
1320: 2a 20 20 53 45 4d 49 20 20 57 53 20 20 4f 54 48  *  SEMI  WS  OTH
1330: 45 52 20 2a 2f 0a 20 20 20 20 20 2f 2a 20 30 20  ER */.     /* 0 
1340: 20 20 53 54 41 52 54 3a 20 2a 2f 20 7b 20 20 20    START: */ {   
1350: 20 30 2c 20 20 30 2c 20 20 20 20 20 31 2c 20 7d   0,  0,     1, }
1360: 2c 0a 20 20 20 20 20 2f 2a 20 31 20 20 4e 4f 52  ,.     /* 1  NOR
1370: 4d 41 4c 3a 20 2a 2f 20 7b 20 20 20 20 30 2c 20  MAL: */ {    0, 
1380: 20 31 2c 20 20 20 20 20 31 2c 20 7d 2c 0a 20 20   1,     1, },.  
1390: 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  };.#endif /* SQL
13a0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
13b0: 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 2a 7a   */..  while( *z
13c0: 53 71 6c 20 29 7b 0a 20 20 20 20 73 77 69 74 63  Sql ){.    switc
13d0: 68 28 20 2a 7a 53 71 6c 20 29 7b 0a 20 20 20 20  h( *zSql ){.    
13e0: 20 20 63 61 73 65 20 27 3b 27 3a 20 7b 20 20 2f    case ';': {  /
13f0: 2a 20 41 20 73 65 6d 69 63 6f 6c 6f 6e 20 2a 2f  * A semicolon */
1400: 0a 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d  .        token =
1410: 20 74 6b 53 45 4d 49 3b 0a 20 20 20 20 20 20 20   tkSEMI;.       
1420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1430: 20 20 20 20 20 20 63 61 73 65 20 27 20 27 3a 0a        case ' ':.
1440: 20 20 20 20 20 20 63 61 73 65 20 27 5c 72 27 3a        case '\r':
1450: 0a 20 20 20 20 20 20 63 61 73 65 20 27 5c 74 27  .      case '\t'
1460: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 5c 6e  :.      case '\n
1470: 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 5c  ':.      case '\
1480: 66 27 3a 20 7b 20 20 2f 2a 20 57 68 69 74 65 20  f': {  /* White 
1490: 73 70 61 63 65 20 69 73 20 69 67 6e 6f 72 65 64  space is ignored
14a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 6f 6b 65   */.        toke
14b0: 6e 20 3d 20 74 6b 57 53 3b 0a 20 20 20 20 20 20  n = tkWS;.      
14c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14d0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 2f 27 3a  .      case '/':
14e0: 20 7b 20 20 20 2f 2a 20 43 2d 73 74 79 6c 65 20   {   /* C-style 
14f0: 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
1500: 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 31 5d 21      if( zSql[1]!
1510: 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='*' ){.        
1520: 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45    token = tkOTHE
1530: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  R;.          bre
1540: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1550: 20 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20 32 3b        zSql += 2;
1560: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1570: 7a 53 71 6c 5b 30 5d 20 26 26 20 28 7a 53 71 6c  zSql[0] && (zSql
1580: 5b 30 5d 21 3d 27 2a 27 20 7c 7c 20 7a 53 71 6c  [0]!='*' || zSql
1590: 5b 31 5d 21 3d 27 2f 27 29 20 29 7b 20 7a 53 71  [1]!='/') ){ zSq
15a0: 6c 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  l++; }.        i
15b0: 66 28 20 7a 53 71 6c 5b 30 5d 3d 3d 30 20 29 20  f( zSql[0]==0 ) 
15c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
15d0: 20 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20    zSql++;.      
15e0: 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 57 53 3b 0a    token = tkWS;.
15f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
1610: 65 20 27 2d 27 3a 20 7b 20 20 20 2f 2a 20 53 51  e '-': {   /* SQ
1620: 4c 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  L-style comments
1630: 20 66 72 6f 6d 20 22 2d 2d 22 20 74 6f 20 65 6e   from "--" to en
1640: 64 20 6f 66 20 6c 69 6e 65 20 2a 2f 0a 20 20 20  d of line */.   
1650: 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 31 5d       if( zSql[1]
1660: 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  !='-' ){.       
1670: 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48     token = tkOTH
1680: 45 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ER;.          br
1690: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
16a0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a         while( *z
16b0: 53 71 6c 20 26 26 20 2a 7a 53 71 6c 21 3d 27 5c  Sql && *zSql!='\
16c0: 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a  n' ){ zSql++; }.
16d0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 71          if( *zSq
16e0: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 73 74  l==0 ) return st
16f0: 61 74 65 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  ate==0;.        
1700: 74 6f 6b 65 6e 20 3d 20 74 6b 57 53 3b 0a 20 20  token = tkWS;.  
1710: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1720: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1730: 27 5b 27 3a 20 7b 20 20 20 2f 2a 20 4d 69 63 72  '[': {   /* Micr
1740: 6f 73 6f 66 74 2d 73 74 79 6c 65 20 69 64 65 6e  osoft-style iden
1750: 74 69 66 69 65 72 73 20 69 6e 20 5b 2e 2e 2e 5d  tifiers in [...]
1760: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   */.        zSql
1770: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ++;.        whil
1780: 65 28 20 2a 7a 53 71 6c 20 26 26 20 2a 7a 53 71  e( *zSql && *zSq
1790: 6c 21 3d 27 5d 27 20 29 7b 20 7a 53 71 6c 2b 2b  l!=']' ){ zSql++
17a0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
17b0: 2a 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72  *zSql==0 ) retur
17c0: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 74 6f 6b  n 0;.        tok
17d0: 65 6e 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20  en = tkOTHER;.  
17e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17f0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1800: 27 60 27 3a 20 20 20 20 20 2f 2a 20 47 72 61 76  '`':     /* Grav
1810: 65 2d 61 63 63 65 6e 74 20 71 75 6f 74 65 64 20  e-accent quoted 
1820: 73 79 6d 62 6f 6c 73 20 75 73 65 64 20 62 79 20  symbols used by 
1830: 4d 79 53 51 4c 20 2a 2f 0a 20 20 20 20 20 20 63  MySQL */.      c
1840: 61 73 65 20 27 22 27 3a 20 20 20 20 20 2f 2a 20  ase '"':     /* 
1850: 73 69 6e 67 6c 65 2d 20 61 6e 64 20 64 6f 75 62  single- and doub
1860: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
1870: 73 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20  s */.      case 
1880: 27 5c 27 27 3a 20 7b 0a 20 20 20 20 20 20 20 20  '\'': {.        
1890: 69 6e 74 20 63 20 3d 20 2a 7a 53 71 6c 3b 0a 20  int c = *zSql;. 
18a0: 20 20 20 20 20 20 20 7a 53 71 6c 2b 2b 3b 0a 20         zSql++;. 
18b0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a         while( *z
18c0: 53 71 6c 20 26 26 20 2a 7a 53 71 6c 21 3d 63 20  Sql && *zSql!=c 
18d0: 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 20  ){ zSql++; }.   
18e0: 20 20 20 20 20 69 66 28 20 2a 7a 53 71 6c 3d 3d       if( *zSql==
18f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1900: 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b        token = tk
1910: 4f 54 48 45 52 3b 0a 20 20 20 20 20 20 20 20 62  OTHER;.        b
1920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1930: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1940: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20         int c;.  
1950: 20 20 20 20 20 20 69 66 28 20 49 64 43 68 61 72        if( IdChar
1960: 28 28 75 38 29 2a 7a 53 71 6c 29 20 29 7b 0a 20  ((u8)*zSql) ){. 
1970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77           /* Keyw
1980: 6f 72 64 73 20 61 6e 64 20 75 6e 71 75 6f 74 65  ords and unquote
1990: 64 20 69 64 65 6e 74 69 66 69 65 72 73 20 2a 2f  d identifiers */
19a0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
19b0: 49 64 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Id;.          fo
19c0: 72 28 6e 49 64 3d 31 3b 20 49 64 43 68 61 72 28  r(nId=1; IdChar(
19d0: 7a 53 71 6c 5b 6e 49 64 5d 29 3b 20 6e 49 64 2b  zSql[nId]); nId+
19e0: 2b 29 7b 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  +){}.#ifdef SQLI
19f0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
1a00: 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20            token 
1a10: 3d 20 74 6b 4f 54 48 45 52 3b 0a 23 65 6c 73 65  = tkOTHER;.#else
1a20: 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
1a30: 68 28 20 2a 7a 53 71 6c 20 29 7b 0a 20 20 20 20  h( *zSql ){.    
1a40: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 63 27          case 'c'
1a50: 3a 20 63 61 73 65 20 27 43 27 3a 20 7b 0a 20 20  : case 'C': {.  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1a70: 6e 49 64 3d 3d 36 20 26 26 20 73 71 6c 69 74 65  nId==6 && sqlite
1a80: 33 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20  3StrNICmp(zSql, 
1a90: 22 63 72 65 61 74 65 22 2c 20 36 29 3d 3d 30 20  "create", 6)==0 
1aa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ab0: 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 43 52 45     token = tkCRE
1ac0: 41 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ATE;.           
1ad0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ae0: 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20            token 
1af0: 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20  = tkOTHER;.     
1b00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b30: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 27            case '
1b40: 74 27 3a 20 63 61 73 65 20 27 54 27 3a 20 7b 0a  t': case 'T': {.
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1b60: 28 20 6e 49 64 3d 3d 37 20 26 26 20 73 71 6c 69  ( nId==7 && sqli
1b70: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c  te3StrNICmp(zSql
1b80: 2c 20 22 74 72 69 67 67 65 72 22 2c 20 37 29 3d  , "trigger", 7)=
1b90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1ba0: 20 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b        token = tk
1bb0: 54 52 49 47 47 45 52 3b 0a 20 20 20 20 20 20 20  TRIGGER;.       
1bc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1bd0: 20 6e 49 64 3d 3d 34 20 26 26 20 73 71 6c 69 74   nId==4 && sqlit
1be0: 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c  e3StrNICmp(zSql,
1bf0: 20 22 74 65 6d 70 22 2c 20 34 29 3d 3d 30 20 29   "temp", 4)==0 )
1c00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c10: 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 54 45 4d 50    token = tkTEMP
1c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c30: 7d 65 6c 73 65 20 69 66 28 20 6e 49 64 3d 3d 39  }else if( nId==9
1c40: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1c50: 43 6d 70 28 7a 53 71 6c 2c 20 22 74 65 6d 70 6f  Cmp(zSql, "tempo
1c60: 72 61 72 79 22 2c 20 39 29 3d 3d 30 20 29 7b 0a  rary", 9)==0 ){.
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 74 6f 6b 65 6e 20 3d 20 74 6b 54 45 4d 50 3b 0a  token = tkTEMP;.
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
1ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1cb0: 20 20 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f       token = tkO
1cc0: 54 48 45 52 3b 0a 20 20 20 20 20 20 20 20 20 20  THER;.          
1cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ce0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1cf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d00: 20 20 20 20 20 63 61 73 65 20 27 65 27 3a 20 20       case 'e':  
1d10: 63 61 73 65 20 27 45 27 3a 20 7b 0a 20 20 20 20  case 'E': {.    
1d20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 49            if( nI
1d30: 64 3d 3d 33 20 26 26 20 73 71 6c 69 74 65 33 53  d==3 && sqlite3S
1d40: 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20 22 65  trNICmp(zSql, "e
1d50: 6e 64 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  nd", 3)==0 ){.  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f                to
1d70: 6b 65 6e 20 3d 20 74 6b 45 4e 44 3b 0a 20 20 20  ken = tkEND;.   
1d80: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1d90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1da0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
1db0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
1dc0: 49 64 3d 3d 37 20 26 26 20 73 71 6c 69 74 65 33  Id==7 && sqlite3
1dd0: 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20 22  StrNICmp(zSql, "
1de0: 65 78 70 6c 61 69 6e 22 2c 20 37 29 3d 3d 30 20  explain", 7)==0 
1df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e00: 20 20 20 74 6f 6b 65 6e 20 3d 20 74 6b 45 58 50     token = tkEXP
1e10: 4c 41 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LAIN;.          
1e20: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
1e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e50: 20 74 6f 6b 65 6e 20 3d 20 74 6b 4f 54 48 45 52   token = tkOTHER
1e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e70: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1e80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1e90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1ea0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1eb0: 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20            token 
1ec0: 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20 20  = tkOTHER;.     
1ed0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1ef0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
1f00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1f10: 54 52 49 47 47 45 52 20 2a 2f 0a 20 20 20 20 20  TRIGGER */.     
1f20: 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20 6e 49 64       zSql += nId
1f30: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1f40: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1f50: 4f 70 65 72 61 74 6f 72 73 20 61 6e 64 20 73 70  Operators and sp
1f60: 65 63 69 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f  ecial symbols */
1f70: 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e  .          token
1f80: 20 3d 20 74 6b 4f 54 48 45 52 3b 0a 20 20 20 20   = tkOTHER;.    
1f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
1fa0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1fb0: 20 7d 0a 20 20 20 20 73 74 61 74 65 20 3d 20 74   }.    state = t
1fc0: 72 61 6e 73 5b 73 74 61 74 65 5d 5b 74 6f 6b 65  rans[state][toke
1fd0: 6e 5d 3b 0a 20 20 20 20 7a 53 71 6c 2b 2b 3b 0a  n];.    zSql++;.
1fe0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 61    }.  return sta
1ff0: 74 65 3d 3d 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  te==0;.}..#ifnde
2000: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
2010: 46 31 36 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  F16./*.** This r
2020: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61  outine is the sa
2030: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
2040: 33 5f 63 6f 6d 70 6c 65 74 65 28 29 20 72 6f 75  3_complete() rou
2050: 74 69 6e 65 20 64 65 73 63 72 69 62 65 64 0a 2a  tine described.*
2060: 2a 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  * above, except 
2070: 74 68 61 74 20 74 68 65 20 70 61 72 61 6d 65 74  that the paramet
2080: 65 72 20 69 73 20 72 65 71 75 69 72 65 64 20 74  er is required t
2090: 6f 20 62 65 20 55 54 46 2d 31 36 20 65 6e 63 6f  o be UTF-16 enco
20a0: 64 65 64 2c 20 6e 6f 74 0a 2a 2a 20 55 54 46 2d  ded, not.** UTF-
20b0: 38 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  8..*/.int sqlite
20c0: 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 63 6f 6e  3_complete16(con
20d0: 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 29 7b 0a  st void *zSql){.
20e0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
20f0: 2a 70 56 61 6c 3b 0a 20 20 63 68 61 72 20 63 6f  *pVal;.  char co
2100: 6e 73 74 20 2a 7a 53 71 6c 38 3b 0a 20 20 69 6e  nst *zSql8;.  in
2110: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
2120: 4d 45 4d 3b 0a 0a 20 20 70 56 61 6c 20 3d 20 73  MEM;..  pVal = s
2130: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
2140: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
2150: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
2160: 2c 20 7a 53 71 6c 2c 20 53 51 4c 49 54 45 5f 55  , zSql, SQLITE_U
2170: 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
2180: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 53  TE_STATIC);.  zS
2190: 71 6c 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  ql8 = sqlite3Val
21a0: 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
21b0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
21c0: 20 7a 53 71 6c 38 20 29 7b 0a 20 20 20 20 72 63   zSql8 ){.    rc
21d0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c   = sqlite3_compl
21e0: 65 74 65 28 7a 53 71 6c 38 29 3b 0a 20 20 7d 0a  ete(zSql8);.  }.
21f0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
2200: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
2210: 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
2220: 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64  t(0, rc);.}.#end
2230: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2240: 54 5f 55 54 46 31 36 20 2a 2f 0a 23 65 6e 64 69  T_UTF16 */.#endi
2250: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2260: 5f 43 4f 4d 50 4c 45 54 45 20 2a 2f 0a           _COMPLETE */.