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