15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An tokenizer for SQL
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains C code that implements the sqlite3_complete() API.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This code used to be part of the tokenizer.c source file.  But by
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** separating it out, the code will be automatically omitted from
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** static links that do not use it.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPLETE
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is defined in tokenize.c.  We just have to import the definition.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_AMALGAMATION
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ASCII
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IdChar(C)  ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_EBCDIC
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char sqlite3IsEbcdicIdChar[];
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IdChar(C)  (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40]))
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_AMALGAMATION */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Token types used by the sqlite3_complete() routine.  See the header
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** comments on that procedure for additional information.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define tkSEMI    0
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define tkWS      1
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define tkOTHER   2
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRIGGER
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define tkEXPLAIN 3
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define tkCREATE  4
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define tkTEMP    5
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define tkTRIGGER 6
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define tkEND     7
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if the given SQL string ends in a semicolon.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Special handling is require for CREATE TRIGGER statements.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Whenever the CREATE TRIGGER keywords are seen, the statement
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** must end with ";END;".
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This implementation uses a state machine with 8 states:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (0) INVALID   We have not yet seen a non-whitespace character.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (1) START     At the beginning or end of an SQL statement.  This routine
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                 returns 1 if it ends in the START state and 0 if it ends
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                 in any other state.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (2) NORMAL    We are in the middle of statement which ends with a single
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                 semicolon.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (3) EXPLAIN   The keyword EXPLAIN has been seen at the beginning of
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                 a statement.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (4) CREATE    The keyword CREATE has been seen at the beginning of a
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                 statement, possibly preceeded by EXPLAIN and/or followed by
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                 TEMP or TEMPORARY
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (5) TRIGGER   We are in the middle of a trigger definition that must be
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                 ended by a semicolon, the keyword END, and another semicolon.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (6) SEMI      We've seen the first semicolon in the ";END;" that occurs at
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                 the end of a trigger definition.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (7) END       We've seen the ";END" of the ";END;" that occurs at the end
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                 of a trigger difinition.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Transitions between states above are determined by tokens extracted
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from the input.  The following tokens are significant:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (0) tkSEMI      A semicolon.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (1) tkWS        Whitespace.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (2) tkOTHER     Any other SQL token.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (3) tkEXPLAIN   The "explain" keyword.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (4) tkCREATE    The "create" keyword.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (5) tkTEMP      The "temp" or "temporary" keyword.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (6) tkTRIGGER   The "trigger" keyword.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   (7) tkEND       The "end" keyword.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Whitespace never causes a state transition and is always ignored.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This means that a SQL string of all whitespace is invalid.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If we compile with SQLITE_OMIT_TRIGGER, all of the computation needed
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to recognize the end of a trigger can be omitted.  All we have to do
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is look for a semicolon that is not part of an string or comment.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_complete(const char *zSql){
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 state = 0;   /* Current state, using numbers defined in header comment */
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 token;       /* Value of the next token */
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRIGGER
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* A complex statement machine used to detect the end of a CREATE TRIGGER
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** statement.  This is the normal case.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const u8 trans[8][8] = {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* Token:                                                */
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* State:       **  SEMI  WS  OTHER  EXPLAIN  CREATE  TEMP  TRIGGER  END */
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 0 INVALID: */ {    1,  0,     2,       3,      4,    2,       2,   2, },
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 1   START: */ {    1,  1,     2,       3,      4,    2,       2,   2, },
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 2  NORMAL: */ {    1,  2,     2,       2,      2,    2,       2,   2, },
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 3 EXPLAIN: */ {    1,  3,     3,       2,      4,    2,       2,   2, },
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 4  CREATE: */ {    1,  4,     2,       2,      2,    4,       5,   2, },
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 5 TRIGGER: */ {    6,  5,     5,       5,      5,    5,       5,   5, },
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 6    SEMI: */ {    6,  6,     5,       5,      5,    5,       5,   7, },
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 7     END: */ {    1,  7,     5,       5,      5,    5,       5,   5, },
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If triggers are not supported by this compile then the statement machine
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** used to detect the end of a statement is much simplier
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const u8 trans[3][3] = {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     /* Token:           */
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* State:       **  SEMI  WS  OTHER */
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 0 INVALID: */ {    1,  0,     2, },
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 1   START: */ {    1,  1,     2, },
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* 2  NORMAL: */ {    1,  2,     2, },
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_TRIGGER */
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( *zSql ){
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch( *zSql ){
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ';': {  /* A semicolon */
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token = tkSEMI;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ' ':
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '\r':
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '\t':
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '\n':
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '\f': {  /* White space is ignored */
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token = tkWS;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '/': {   /* C-style comments */
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( zSql[1]!='*' ){
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          token = tkOTHER;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zSql += 2;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( zSql[0]==0 ) return 0;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zSql++;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token = tkWS;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '-': {   /* SQL-style comments from "--" to end of line */
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( zSql[1]!='-' ){
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          token = tkOTHER;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while( *zSql && *zSql!='\n' ){ zSql++; }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( *zSql==0 ) return state==1;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token = tkWS;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '[': {   /* Microsoft-style identifiers in [...] */
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zSql++;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while( *zSql && *zSql!=']' ){ zSql++; }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( *zSql==0 ) return 0;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token = tkOTHER;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '`':     /* Grave-accent quoted symbols used by MySQL */
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '"':     /* single- and double-quoted strings */
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case '\'': {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int c = *zSql;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zSql++;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while( *zSql && *zSql!=c ){ zSql++; }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( *zSql==0 ) return 0;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token = tkOTHER;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default: {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_EBCDIC
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char c;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( IdChar((u8)*zSql) ){
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Keywords and unquoted identifiers */
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          int nId;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for(nId=1; IdChar(zSql[nId]); nId++){}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_TRIGGER
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          token = tkOTHER;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          switch( *zSql ){
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case 'c': case 'C': {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if( nId==6 && sqlite3StrNICmp(zSql, "create", 6)==0 ){
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                token = tkCREATE;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }else{
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                token = tkOTHER;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              break;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case 't': case 'T': {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if( nId==7 && sqlite3StrNICmp(zSql, "trigger", 7)==0 ){
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                token = tkTRIGGER;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }else if( nId==4 && sqlite3StrNICmp(zSql, "temp", 4)==0 ){
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                token = tkTEMP;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }else if( nId==9 && sqlite3StrNICmp(zSql, "temporary", 9)==0 ){
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                token = tkTEMP;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }else{
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                token = tkOTHER;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              break;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case 'e':  case 'E': {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if( nId==3 && sqlite3StrNICmp(zSql, "end", 3)==0 ){
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                token = tkEND;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }else
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if( nId==7 && sqlite3StrNICmp(zSql, "explain", 7)==0 ){
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                token = tkEXPLAIN;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }else
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                token = tkOTHER;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              break;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            default: {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              token = tkOTHER;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              break;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_TRIGGER */
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          zSql += nId-1;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Operators and special symbols */
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          token = tkOTHER;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state = trans[state][token];
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zSql++;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state==1;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is the same as the sqlite3_complete() routine described
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** above, except that the parameter is required to be UTF-16 encoded, not
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** UTF-8.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_complete16(const void *zSql){
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value *pVal;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char const *zSql8;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_NOMEM;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINIT
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3_initialize();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc ) return rc;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVal = sqlite3ValueNew(0);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zSql8 ){
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3_complete(zSql8);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_NOMEM;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ValueFree(pVal);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3ApiExit(0, rc);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_COMPLETE */
284