175897234Sdrh /* 2b19a2bc6Sdrh ** 2001 September 15 375897234Sdrh ** 4b19a2bc6Sdrh ** The author disclaims copyright to this source code. In place of 5b19a2bc6Sdrh ** a legal notice, here is a blessing: 675897234Sdrh ** 7b19a2bc6Sdrh ** May you do good and not evil. 8b19a2bc6Sdrh ** May you find forgiveness for yourself and forgive others. 9b19a2bc6Sdrh ** May you share freely, never taking more than you give. 1075897234Sdrh ** 1175897234Sdrh ************************************************************************* 1275897234Sdrh ** An tokenizer for SQL 1375897234Sdrh ** 1475897234Sdrh ** This file contains C code that splits an SQL input string up into 1575897234Sdrh ** individual tokens and sends those tokens one-by-one over to the 1675897234Sdrh ** parser for analysis. 1775897234Sdrh ** 18*41743984Sdrh ** $Id: tokenize.c,v 1.65 2003/12/06 21:43:56 drh Exp $ 1975897234Sdrh */ 2075897234Sdrh #include "sqliteInt.h" 21ad75e987Sdrh #include "os.h" 2275897234Sdrh #include <ctype.h> 23dcc581ccSdrh #include <stdlib.h> 2475897234Sdrh 2575897234Sdrh /* 2675897234Sdrh ** All the keywords of the SQL language are stored as in a hash 2775897234Sdrh ** table composed of instances of the following structure. 2875897234Sdrh */ 2975897234Sdrh typedef struct Keyword Keyword; 3075897234Sdrh struct Keyword { 3175897234Sdrh char *zName; /* The keyword name */ 32dab35188Sdrh u16 len; /* Number of characters in the keyword */ 33dab35188Sdrh u16 tokenType; /* The token value for this keyword */ 3475897234Sdrh Keyword *pNext; /* Next keyword with the same hash */ 3575897234Sdrh }; 3675897234Sdrh 3775897234Sdrh /* 3875897234Sdrh ** These are the keywords 3975897234Sdrh */ 4075897234Sdrh static Keyword aKeywordTable[] = { 419cfcf5d4Sdrh { "ABORT", 0, TK_ABORT, 0 }, 42c3f9bad2Sdanielk1977 { "AFTER", 0, TK_AFTER, 0 }, 43fef5208cSdrh { "ALL", 0, TK_ALL, 0 }, 4475897234Sdrh { "AND", 0, TK_AND, 0 }, 4575897234Sdrh { "AS", 0, TK_AS, 0 }, 4675897234Sdrh { "ASC", 0, TK_ASC, 0 }, 47113088ecSdrh { "ATTACH", 0, TK_ATTACH, 0 }, 48c3f9bad2Sdanielk1977 { "BEFORE", 0, TK_BEFORE, 0 }, 49c4a3c779Sdrh { "BEGIN", 0, TK_BEGIN, 0 }, 50fef5208cSdrh { "BETWEEN", 0, TK_BETWEEN, 0 }, 5175897234Sdrh { "BY", 0, TK_BY, 0 }, 5204738cb9Sdrh { "CASCADE", 0, TK_CASCADE, 0 }, 5317a7f8ddSdrh { "CASE", 0, TK_CASE, 0 }, 5475897234Sdrh { "CHECK", 0, TK_CHECK, 0 }, 55f57b14a6Sdrh { "CLUSTER", 0, TK_CLUSTER, 0 }, 568e2ca029Sdrh { "COLLATE", 0, TK_COLLATE, 0 }, 57c4a3c779Sdrh { "COMMIT", 0, TK_COMMIT, 0 }, 589cfcf5d4Sdrh { "CONFLICT", 0, TK_CONFLICT, 0 }, 5975897234Sdrh { "CONSTRAINT", 0, TK_CONSTRAINT, 0 }, 60982cef7eSdrh { "COPY", 0, TK_COPY, 0 }, 6175897234Sdrh { "CREATE", 0, TK_CREATE, 0 }, 625ad1a6c8Sdrh { "CROSS", 0, TK_JOIN_KW, 0 }, 63113088ecSdrh { "DATABASE", 0, TK_DATABASE, 0 }, 6475897234Sdrh { "DEFAULT", 0, TK_DEFAULT, 0 }, 6504738cb9Sdrh { "DEFERRED", 0, TK_DEFERRED, 0 }, 6604738cb9Sdrh { "DEFERRABLE", 0, TK_DEFERRABLE, 0 }, 6775897234Sdrh { "DELETE", 0, TK_DELETE, 0 }, 68982cef7eSdrh { "DELIMITERS", 0, TK_DELIMITERS, 0 }, 6975897234Sdrh { "DESC", 0, TK_DESC, 0 }, 70113088ecSdrh { "DETACH", 0, TK_DETACH, 0 }, 71efb7251dSdrh { "DISTINCT", 0, TK_DISTINCT, 0 }, 7275897234Sdrh { "DROP", 0, TK_DROP, 0 }, 73c4a3c779Sdrh { "END", 0, TK_END, 0 }, 74c3f9bad2Sdanielk1977 { "EACH", 0, TK_EACH, 0 }, 7517a7f8ddSdrh { "ELSE", 0, TK_ELSE, 0 }, 7682c3d636Sdrh { "EXCEPT", 0, TK_EXCEPT, 0 }, 7775897234Sdrh { "EXPLAIN", 0, TK_EXPLAIN, 0 }, 781c92853dSdrh { "FAIL", 0, TK_FAIL, 0 }, 79c3f9bad2Sdanielk1977 { "FOR", 0, TK_FOR, 0 }, 8004738cb9Sdrh { "FOREIGN", 0, TK_FOREIGN, 0 }, 8175897234Sdrh { "FROM", 0, TK_FROM, 0 }, 825ad1a6c8Sdrh { "FULL", 0, TK_JOIN_KW, 0 }, 83dce2cbe6Sdrh { "GLOB", 0, TK_GLOB, 0 }, 842282792aSdrh { "GROUP", 0, TK_GROUP, 0 }, 852282792aSdrh { "HAVING", 0, TK_HAVING, 0 }, 869cfcf5d4Sdrh { "IGNORE", 0, TK_IGNORE, 0 }, 8704738cb9Sdrh { "IMMEDIATE", 0, TK_IMMEDIATE, 0 }, 88fef5208cSdrh { "IN", 0, TK_IN, 0 }, 8975897234Sdrh { "INDEX", 0, TK_INDEX, 0 }, 9004738cb9Sdrh { "INITIALLY", 0, TK_INITIALLY, 0 }, 915ad1a6c8Sdrh { "INNER", 0, TK_JOIN_KW, 0 }, 9275897234Sdrh { "INSERT", 0, TK_INSERT, 0 }, 93c3f9bad2Sdanielk1977 { "INSTEAD", 0, TK_INSTEAD, 0 }, 9482c3d636Sdrh { "INTERSECT", 0, TK_INTERSECT, 0 }, 9575897234Sdrh { "INTO", 0, TK_INTO, 0 }, 9675897234Sdrh { "IS", 0, TK_IS, 0 }, 9775897234Sdrh { "ISNULL", 0, TK_ISNULL, 0 }, 9801f3f253Sdrh { "JOIN", 0, TK_JOIN, 0 }, 9975897234Sdrh { "KEY", 0, TK_KEY, 0 }, 1005ad1a6c8Sdrh { "LEFT", 0, TK_JOIN_KW, 0 }, 101dce2cbe6Sdrh { "LIKE", 0, TK_LIKE, 0 }, 1029bbca4c1Sdrh { "LIMIT", 0, TK_LIMIT, 0 }, 10304738cb9Sdrh { "MATCH", 0, TK_MATCH, 0 }, 1045ad1a6c8Sdrh { "NATURAL", 0, TK_JOIN_KW, 0 }, 10575897234Sdrh { "NOT", 0, TK_NOT, 0 }, 10675897234Sdrh { "NOTNULL", 0, TK_NOTNULL, 0 }, 10775897234Sdrh { "NULL", 0, TK_NULL, 0 }, 108c3f9bad2Sdanielk1977 { "OF", 0, TK_OF, 0 }, 1099bbca4c1Sdrh { "OFFSET", 0, TK_OFFSET, 0 }, 11075897234Sdrh { "ON", 0, TK_ON, 0 }, 11175897234Sdrh { "OR", 0, TK_OR, 0 }, 11275897234Sdrh { "ORDER", 0, TK_ORDER, 0 }, 1135ad1a6c8Sdrh { "OUTER", 0, TK_JOIN_KW, 0 }, 114f57b14a6Sdrh { "PRAGMA", 0, TK_PRAGMA, 0 }, 11575897234Sdrh { "PRIMARY", 0, TK_PRIMARY, 0 }, 1166f34903eSdanielk1977 { "RAISE", 0, TK_RAISE, 0 }, 11704738cb9Sdrh { "REFERENCES", 0, TK_REFERENCES, 0 }, 1189cfcf5d4Sdrh { "REPLACE", 0, TK_REPLACE, 0 }, 11904738cb9Sdrh { "RESTRICT", 0, TK_RESTRICT, 0 }, 1205ad1a6c8Sdrh { "RIGHT", 0, TK_JOIN_KW, 0 }, 121c4a3c779Sdrh { "ROLLBACK", 0, TK_ROLLBACK, 0 }, 122c3f9bad2Sdanielk1977 { "ROW", 0, TK_ROW, 0 }, 12375897234Sdrh { "SELECT", 0, TK_SELECT, 0 }, 12475897234Sdrh { "SET", 0, TK_SET, 0 }, 1251873cd50Sdrh { "STATEMENT", 0, TK_STATEMENT, 0 }, 12675897234Sdrh { "TABLE", 0, TK_TABLE, 0 }, 127f57b3399Sdrh { "TEMP", 0, TK_TEMP, 0 }, 128f57b3399Sdrh { "TEMPORARY", 0, TK_TEMP, 0 }, 12917a7f8ddSdrh { "THEN", 0, TK_THEN, 0 }, 130c4a3c779Sdrh { "TRANSACTION", 0, TK_TRANSACTION, 0 }, 131c3f9bad2Sdanielk1977 { "TRIGGER", 0, TK_TRIGGER, 0 }, 13282c3d636Sdrh { "UNION", 0, TK_UNION, 0 }, 13375897234Sdrh { "UNIQUE", 0, TK_UNIQUE, 0 }, 13475897234Sdrh { "UPDATE", 0, TK_UPDATE, 0 }, 135982cef7eSdrh { "USING", 0, TK_USING, 0 }, 136dce2cbe6Sdrh { "VACUUM", 0, TK_VACUUM, 0 }, 13775897234Sdrh { "VALUES", 0, TK_VALUES, 0 }, 138a76b5dfcSdrh { "VIEW", 0, TK_VIEW, 0 }, 13917a7f8ddSdrh { "WHEN", 0, TK_WHEN, 0 }, 14075897234Sdrh { "WHERE", 0, TK_WHERE, 0 }, 14175897234Sdrh }; 14275897234Sdrh 14375897234Sdrh /* 14475897234Sdrh ** This is the hash table 14575897234Sdrh */ 146daffd0e5Sdrh #define KEY_HASH_SIZE 71 14775897234Sdrh static Keyword *apHashTable[KEY_HASH_SIZE]; 14875897234Sdrh 14975897234Sdrh 15075897234Sdrh /* 15175897234Sdrh ** This function looks up an identifier to determine if it is a 15275897234Sdrh ** keyword. If it is a keyword, the token code of that keyword is 15375897234Sdrh ** returned. If the input is not a keyword, TK_ID is returned. 15475897234Sdrh */ 15517f71934Sdrh int sqliteKeywordCode(const char *z, int n){ 15675897234Sdrh int h; 15775897234Sdrh Keyword *p; 15875897234Sdrh if( aKeywordTable[0].len==0 ){ 15975897234Sdrh /* Initialize the keyword hash table */ 160ad75e987Sdrh sqliteOsEnterMutex(); 161ad75e987Sdrh if( aKeywordTable[0].len==0 ){ 16275897234Sdrh int i; 16375897234Sdrh int n; 16475897234Sdrh n = sizeof(aKeywordTable)/sizeof(aKeywordTable[0]); 16575897234Sdrh for(i=0; i<n; i++){ 16675897234Sdrh aKeywordTable[i].len = strlen(aKeywordTable[i].zName); 16775897234Sdrh h = sqliteHashNoCase(aKeywordTable[i].zName, aKeywordTable[i].len); 16875897234Sdrh h %= KEY_HASH_SIZE; 16975897234Sdrh aKeywordTable[i].pNext = apHashTable[h]; 17075897234Sdrh apHashTable[h] = &aKeywordTable[i]; 17175897234Sdrh } 17275897234Sdrh } 173ad75e987Sdrh sqliteOsLeaveMutex(); 174ad75e987Sdrh } 17575897234Sdrh h = sqliteHashNoCase(z, n) % KEY_HASH_SIZE; 17675897234Sdrh for(p=apHashTable[h]; p; p=p->pNext){ 17775897234Sdrh if( p->len==n && sqliteStrNICmp(p->zName, z, n)==0 ){ 17875897234Sdrh return p->tokenType; 17975897234Sdrh } 18075897234Sdrh } 18175897234Sdrh return TK_ID; 18275897234Sdrh } 18375897234Sdrh 18498808babSdrh 18598808babSdrh /* 18698808babSdrh ** If X is a character that can be used in an identifier then 18798808babSdrh ** isIdChar[X] will be 1. Otherwise isIdChar[X] will be 0. 18898808babSdrh ** 18998808babSdrh ** In this implementation, an identifier can be a string of 19098808babSdrh ** alphabetic characters, digits, and "_" plus any character 19198808babSdrh ** with the high-order bit set. The latter rule means that 19298808babSdrh ** any sequence of UTF-8 characters or characters taken from 19398808babSdrh ** an extended ISO8859 character set can form an identifier. 19498808babSdrh */ 19598808babSdrh static const char isIdChar[] = { 19698808babSdrh /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ 19798808babSdrh 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ 19898808babSdrh 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ 19998808babSdrh 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ 20098808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ 20198808babSdrh 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ 20298808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ 20398808babSdrh 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ 20498808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ 20598808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 8x */ 20698808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 9x */ 20798808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Ax */ 20898808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Bx */ 20998808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Cx */ 21098808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Dx */ 21198808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Ex */ 21298808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Fx */ 21398808babSdrh }; 21498808babSdrh 21598808babSdrh 21675897234Sdrh /* 21761b487d0Sdrh ** Return the length of the token that begins at z[0]. 21861b487d0Sdrh ** Store the token type in *tokenType before returning. 21975897234Sdrh */ 22098808babSdrh static int sqliteGetToken(const unsigned char *z, int *tokenType){ 22175897234Sdrh int i; 22275897234Sdrh switch( *z ){ 22330cab809Sdrh case ' ': case '\t': case '\n': case '\f': case '\r': { 22432eb7b47Sdrh for(i=1; isspace(z[i]); i++){} 22575897234Sdrh *tokenType = TK_SPACE; 22675897234Sdrh return i; 22775897234Sdrh } 22875897234Sdrh case '-': { 22975897234Sdrh if( z[1]=='-' ){ 23075897234Sdrh for(i=2; z[i] && z[i]!='\n'; i++){} 23175897234Sdrh *tokenType = TK_COMMENT; 23275897234Sdrh return i; 23375897234Sdrh } 23475897234Sdrh *tokenType = TK_MINUS; 23575897234Sdrh return 1; 23675897234Sdrh } 23775897234Sdrh case '(': { 23875897234Sdrh *tokenType = TK_LP; 23975897234Sdrh return 1; 24075897234Sdrh } 24175897234Sdrh case ')': { 24275897234Sdrh *tokenType = TK_RP; 24375897234Sdrh return 1; 24475897234Sdrh } 24575897234Sdrh case ';': { 24675897234Sdrh *tokenType = TK_SEMI; 24775897234Sdrh return 1; 24875897234Sdrh } 24975897234Sdrh case '+': { 25075897234Sdrh *tokenType = TK_PLUS; 25175897234Sdrh return 1; 25275897234Sdrh } 25375897234Sdrh case '*': { 25475897234Sdrh *tokenType = TK_STAR; 25575897234Sdrh return 1; 25675897234Sdrh } 25775897234Sdrh case '/': { 25866105a8eSdrh if( z[1]!='*' || z[2]==0 ){ 25975897234Sdrh *tokenType = TK_SLASH; 26075897234Sdrh return 1; 26175897234Sdrh } 26266105a8eSdrh for(i=3; z[i] && (z[i]!='/' || z[i-1]!='*'); i++){} 26366105a8eSdrh if( z[i] ) i++; 26466105a8eSdrh *tokenType = TK_COMMENT; 26566105a8eSdrh return i; 26666105a8eSdrh } 267bf4133cbSdrh case '%': { 268bf4133cbSdrh *tokenType = TK_REM; 269bf4133cbSdrh return 1; 270bf4133cbSdrh } 27175897234Sdrh case '=': { 27275897234Sdrh *tokenType = TK_EQ; 27375897234Sdrh return 1 + (z[1]=='='); 27475897234Sdrh } 27575897234Sdrh case '<': { 27675897234Sdrh if( z[1]=='=' ){ 27775897234Sdrh *tokenType = TK_LE; 27875897234Sdrh return 2; 27975897234Sdrh }else if( z[1]=='>' ){ 28075897234Sdrh *tokenType = TK_NE; 28175897234Sdrh return 2; 282bf4133cbSdrh }else if( z[1]=='<' ){ 283bf4133cbSdrh *tokenType = TK_LSHIFT; 284bf4133cbSdrh return 2; 28575897234Sdrh }else{ 28675897234Sdrh *tokenType = TK_LT; 28775897234Sdrh return 1; 28875897234Sdrh } 28975897234Sdrh } 29075897234Sdrh case '>': { 29175897234Sdrh if( z[1]=='=' ){ 29275897234Sdrh *tokenType = TK_GE; 29375897234Sdrh return 2; 294bf4133cbSdrh }else if( z[1]=='>' ){ 295bf4133cbSdrh *tokenType = TK_RSHIFT; 296bf4133cbSdrh return 2; 29775897234Sdrh }else{ 29875897234Sdrh *tokenType = TK_GT; 29975897234Sdrh return 1; 30075897234Sdrh } 30175897234Sdrh } 30275897234Sdrh case '!': { 30375897234Sdrh if( z[1]!='=' ){ 30475897234Sdrh *tokenType = TK_ILLEGAL; 305c837e709Sdrh return 2; 30675897234Sdrh }else{ 30775897234Sdrh *tokenType = TK_NE; 30875897234Sdrh return 2; 30975897234Sdrh } 31075897234Sdrh } 3110040077dSdrh case '|': { 3120040077dSdrh if( z[1]!='|' ){ 313bf4133cbSdrh *tokenType = TK_BITOR; 3140040077dSdrh return 1; 3150040077dSdrh }else{ 3160040077dSdrh *tokenType = TK_CONCAT; 3170040077dSdrh return 2; 3180040077dSdrh } 3190040077dSdrh } 32075897234Sdrh case ',': { 32175897234Sdrh *tokenType = TK_COMMA; 32275897234Sdrh return 1; 32375897234Sdrh } 324bf4133cbSdrh case '&': { 325bf4133cbSdrh *tokenType = TK_BITAND; 326bf4133cbSdrh return 1; 327bf4133cbSdrh } 328bf4133cbSdrh case '~': { 329bf4133cbSdrh *tokenType = TK_BITNOT; 330bf4133cbSdrh return 1; 331bf4133cbSdrh } 33275897234Sdrh case '\'': case '"': { 33375897234Sdrh int delim = z[0]; 33475897234Sdrh for(i=1; z[i]; i++){ 33575897234Sdrh if( z[i]==delim ){ 33675897234Sdrh if( z[i+1]==delim ){ 33775897234Sdrh i++; 33875897234Sdrh }else{ 33975897234Sdrh break; 34075897234Sdrh } 34175897234Sdrh } 34275897234Sdrh } 34375897234Sdrh if( z[i] ) i++; 34475897234Sdrh *tokenType = TK_STRING; 34575897234Sdrh return i; 34675897234Sdrh } 34775897234Sdrh case '.': { 34875897234Sdrh *tokenType = TK_DOT; 34975897234Sdrh return 1; 35075897234Sdrh } 35175897234Sdrh case '0': case '1': case '2': case '3': case '4': 35275897234Sdrh case '5': case '6': case '7': case '8': case '9': { 353c837e709Sdrh *tokenType = TK_INTEGER; 35432eb7b47Sdrh for(i=1; isdigit(z[i]); i++){} 355bb07e9a3Sdrh if( z[i]=='.' && isdigit(z[i+1]) ){ 356bb07e9a3Sdrh i += 2; 35732eb7b47Sdrh while( isdigit(z[i]) ){ i++; } 358c837e709Sdrh *tokenType = TK_FLOAT; 359c837e709Sdrh } 36075897234Sdrh if( (z[i]=='e' || z[i]=='E') && 36175897234Sdrh ( isdigit(z[i+1]) 36275897234Sdrh || ((z[i+1]=='+' || z[i+1]=='-') && isdigit(z[i+2])) 36375897234Sdrh ) 36475897234Sdrh ){ 36575897234Sdrh i += 2; 36632eb7b47Sdrh while( isdigit(z[i]) ){ i++; } 36775897234Sdrh *tokenType = TK_FLOAT; 36875897234Sdrh } 36975897234Sdrh return i; 37075897234Sdrh } 3712f4392ffSdrh case '[': { 3722f4392ffSdrh for(i=1; z[i] && z[i-1]!=']'; i++){} 3732f4392ffSdrh *tokenType = TK_ID; 3742f4392ffSdrh return i; 3752f4392ffSdrh } 3767c972decSdrh case '?': { 37750457896Sdrh *tokenType = TK_VARIABLE; 3787c972decSdrh return 1; 37950457896Sdrh } 38098808babSdrh default: { 38198808babSdrh if( !isIdChar[*z] ){ 38298808babSdrh break; 38398808babSdrh } 38498808babSdrh for(i=1; isIdChar[z[i]]; i++){} 3856a535340Sdrh *tokenType = sqliteKeywordCode((char*)z, i); 38675897234Sdrh return i; 38775897234Sdrh } 38875897234Sdrh } 38975897234Sdrh *tokenType = TK_ILLEGAL; 39075897234Sdrh return 1; 39175897234Sdrh } 39275897234Sdrh 39375897234Sdrh /* 39475897234Sdrh ** Run the parser on the given SQL string. The parser structure is 395b19a2bc6Sdrh ** passed in. An SQLITE_ status code is returned. If an error occurs 396b19a2bc6Sdrh ** and pzErrMsg!=NULL then an error message might be written into 397b19a2bc6Sdrh ** memory obtained from malloc() and *pzErrMsg made to point to that 398b19a2bc6Sdrh ** error message. Or maybe not. 39975897234Sdrh */ 40080ff32f5Sdrh int sqliteRunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ 40175897234Sdrh int nErr = 0; 40275897234Sdrh int i; 40375897234Sdrh void *pEngine; 404b86ccfb2Sdrh int tokenType; 405b86ccfb2Sdrh int lastTokenParsed = -1; 4066d4abfbeSdrh sqlite *db = pParse->db; 40775897234Sdrh extern void *sqliteParserAlloc(void*(*)(int)); 40875897234Sdrh extern void sqliteParserFree(void*, void(*)(void*)); 409338ea13cSdrh extern int sqliteParser(void*, int, Token, Parse*); 41075897234Sdrh 4116d4abfbeSdrh db->flags &= ~SQLITE_Interrupt; 4124c504391Sdrh pParse->rc = SQLITE_OK; 41375897234Sdrh i = 0; 414982cef7eSdrh pEngine = sqliteParserAlloc((void*(*)(int))malloc); 41575897234Sdrh if( pEngine==0 ){ 416*41743984Sdrh sqliteSetString(pzErrMsg, "out of memory", (char*)0); 41775897234Sdrh return 1; 41875897234Sdrh } 41932eb7b47Sdrh pParse->sLastToken.dyn = 0; 420326dce74Sdrh pParse->zTail = zSql; 42132eb7b47Sdrh while( sqlite_malloc_failed==0 && zSql[i]!=0 ){ 42232eb7b47Sdrh assert( i>=0 ); 42375897234Sdrh pParse->sLastToken.z = &zSql[i]; 42432eb7b47Sdrh assert( pParse->sLastToken.dyn==0 ); 42598808babSdrh pParse->sLastToken.n = sqliteGetToken((unsigned char*)&zSql[i], &tokenType); 42675897234Sdrh i += pParse->sLastToken.n; 42775897234Sdrh switch( tokenType ){ 42875897234Sdrh case TK_SPACE: 42975897234Sdrh case TK_COMMENT: { 43032eb7b47Sdrh if( (db->flags & SQLITE_Interrupt)!=0 ){ 43132eb7b47Sdrh pParse->rc = SQLITE_INTERRUPT; 432*41743984Sdrh sqliteSetString(pzErrMsg, "interrupt", (char*)0); 43332eb7b47Sdrh goto abort_parse; 43432eb7b47Sdrh } 43575897234Sdrh break; 43675897234Sdrh } 43732eb7b47Sdrh case TK_ILLEGAL: { 438c837e709Sdrh sqliteSetNString(pzErrMsg, "unrecognized token: \"", -1, 439c837e709Sdrh pParse->sLastToken.z, pParse->sLastToken.n, "\"", 1, 0); 44075897234Sdrh nErr++; 441caec2f12Sdrh goto abort_parse; 44232eb7b47Sdrh } 443326dce74Sdrh case TK_SEMI: { 444326dce74Sdrh pParse->zTail = &zSql[i]; 445326dce74Sdrh /* Fall thru into the default case */ 446326dce74Sdrh } 44732eb7b47Sdrh default: { 44875897234Sdrh sqliteParser(pEngine, tokenType, pParse->sLastToken, pParse); 449b86ccfb2Sdrh lastTokenParsed = tokenType; 450b86ccfb2Sdrh if( pParse->rc!=SQLITE_OK ){ 45132eb7b47Sdrh goto abort_parse; 45275897234Sdrh } 45375897234Sdrh break; 45475897234Sdrh } 45575897234Sdrh } 45632eb7b47Sdrh } 45732eb7b47Sdrh abort_parse: 458b86ccfb2Sdrh if( zSql[i]==0 && nErr==0 && pParse->rc==SQLITE_OK ){ 459b86ccfb2Sdrh if( lastTokenParsed!=TK_SEMI ){ 460094b2bbfSdrh sqliteParser(pEngine, TK_SEMI, pParse->sLastToken, pParse); 461326dce74Sdrh pParse->zTail = &zSql[i]; 46275897234Sdrh } 463b86ccfb2Sdrh sqliteParser(pEngine, 0, pParse->sLastToken, pParse); 46475897234Sdrh } 465dcc581ccSdrh sqliteParserFree(pEngine, free); 466b86ccfb2Sdrh if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){ 467*41743984Sdrh sqliteSetString(&pParse->zErrMsg, sqlite_error_string(pParse->rc), 468*41743984Sdrh (char*)0); 469b86ccfb2Sdrh } 47075897234Sdrh if( pParse->zErrMsg ){ 471b86ccfb2Sdrh if( pzErrMsg && *pzErrMsg==0 ){ 47275897234Sdrh *pzErrMsg = pParse->zErrMsg; 47375897234Sdrh }else{ 47475897234Sdrh sqliteFree(pParse->zErrMsg); 47575897234Sdrh } 476b86ccfb2Sdrh pParse->zErrMsg = 0; 47775897234Sdrh if( !nErr ) nErr++; 47875897234Sdrh } 479b86ccfb2Sdrh if( pParse->pVdbe && (pParse->useCallback || pParse->nErr>0) ){ 48075897234Sdrh sqliteVdbeDelete(pParse->pVdbe); 48175897234Sdrh pParse->pVdbe = 0; 48275897234Sdrh } 48375897234Sdrh if( pParse->pNewTable ){ 48475897234Sdrh sqliteDeleteTable(pParse->db, pParse->pNewTable); 48575897234Sdrh pParse->pNewTable = 0; 48675897234Sdrh } 487f0f258b1Sdrh if( pParse->pNewTrigger ){ 488f0f258b1Sdrh sqliteDeleteTrigger(pParse->pNewTrigger); 489f0f258b1Sdrh pParse->pNewTrigger = 0; 490f0f258b1Sdrh } 491b86ccfb2Sdrh if( nErr>0 && (pParse->rc==SQLITE_OK || pParse->rc==SQLITE_DONE) ){ 4924c504391Sdrh pParse->rc = SQLITE_ERROR; 4934c504391Sdrh } 49475897234Sdrh return nErr; 49575897234Sdrh } 4967ad4334aSdrh 4977ad4334aSdrh /* 4987ad4334aSdrh ** Token types used by the sqlite_complete() routine. See the header 4997ad4334aSdrh ** comments on that procedure for additional information. 5007ad4334aSdrh */ 5017ad4334aSdrh #define tkEXPLAIN 0 5027ad4334aSdrh #define tkCREATE 1 5037ad4334aSdrh #define tkTEMP 2 5047ad4334aSdrh #define tkTRIGGER 3 5057ad4334aSdrh #define tkEND 4 5067ad4334aSdrh #define tkSEMI 5 5077ad4334aSdrh #define tkWS 6 5087ad4334aSdrh #define tkOTHER 7 5097ad4334aSdrh 5107ad4334aSdrh /* 5117ad4334aSdrh ** Return TRUE if the given SQL string ends in a semicolon. 5127ad4334aSdrh ** 5137ad4334aSdrh ** Special handling is require for CREATE TRIGGER statements. 5147ad4334aSdrh ** Whenever the CREATE TRIGGER keywords are seen, the statement 5157ad4334aSdrh ** must end with ";END;". 5167ad4334aSdrh ** 5177ad4334aSdrh ** This implementation uses a state machine with 7 states: 5187ad4334aSdrh ** 5197ad4334aSdrh ** (0) START At the beginning or end of an SQL statement. This routine 5207ad4334aSdrh ** returns 1 if it ends in the START state and 0 if it ends 5217ad4334aSdrh ** in any other state. 5227ad4334aSdrh ** 5237ad4334aSdrh ** (1) EXPLAIN The keyword EXPLAIN has been seen at the beginning of 5247ad4334aSdrh ** a statement. 5257ad4334aSdrh ** 5267ad4334aSdrh ** (2) CREATE The keyword CREATE has been seen at the beginning of a 5277ad4334aSdrh ** statement, possibly preceeded by EXPLAIN and/or followed by 5287ad4334aSdrh ** TEMP or TEMPORARY 5297ad4334aSdrh ** 5307ad4334aSdrh ** (3) NORMAL We are in the middle of statement which ends with a single 5317ad4334aSdrh ** semicolon. 5327ad4334aSdrh ** 5337ad4334aSdrh ** (4) TRIGGER We are in the middle of a trigger definition that must be 5347ad4334aSdrh ** ended by a semicolon, the keyword END, and another semicolon. 5357ad4334aSdrh ** 5367ad4334aSdrh ** (5) SEMI We've seen the first semicolon in the ";END;" that occurs at 5377ad4334aSdrh ** the end of a trigger definition. 5387ad4334aSdrh ** 5397ad4334aSdrh ** (6) END We've seen the ";END" of the ";END;" that occurs at the end 5407ad4334aSdrh ** of a trigger difinition. 5417ad4334aSdrh ** 5427ad4334aSdrh ** Transitions between states above are determined by tokens extracted 5437ad4334aSdrh ** from the input. The following tokens are significant: 5447ad4334aSdrh ** 5457ad4334aSdrh ** (0) tkEXPLAIN The "explain" keyword. 5467ad4334aSdrh ** (1) tkCREATE The "create" keyword. 5477ad4334aSdrh ** (2) tkTEMP The "temp" or "temporary" keyword. 5487ad4334aSdrh ** (3) tkTRIGGER The "trigger" keyword. 5497ad4334aSdrh ** (4) tkEND The "end" keyword. 5507ad4334aSdrh ** (5) tkSEMI A semicolon. 5517ad4334aSdrh ** (6) tkWS Whitespace 5527ad4334aSdrh ** (7) tkOTHER Any other SQL token. 5537ad4334aSdrh ** 5547ad4334aSdrh ** Whitespace never causes a state transition and is always ignored. 5557ad4334aSdrh */ 5567ad4334aSdrh int sqlite_complete(const char *zSql){ 5577ad4334aSdrh u8 state = 0; /* Current state, using numbers defined in header comment */ 5587ad4334aSdrh u8 token; /* Value of the next token */ 5597ad4334aSdrh 5607ad4334aSdrh /* The following matrix defines the transition from one state to another 5617ad4334aSdrh ** according to what token is seen. trans[state][token] returns the 5627ad4334aSdrh ** next state. 5637ad4334aSdrh */ 5647ad4334aSdrh static const u8 trans[7][8] = { 565e1e38c4dSdrh /* Token: */ 5667ad4334aSdrh /* State: ** EXPLAIN CREATE TEMP TRIGGER END SEMI WS OTHER */ 5677ad4334aSdrh /* 0 START: */ { 1, 2, 3, 3, 3, 0, 0, 3, }, 5687ad4334aSdrh /* 1 EXPLAIN: */ { 3, 2, 3, 3, 3, 0, 1, 3, }, 5697ad4334aSdrh /* 2 CREATE: */ { 3, 3, 2, 4, 3, 0, 2, 3, }, 5707ad4334aSdrh /* 3 NORMAL: */ { 3, 3, 3, 3, 3, 0, 3, 3, }, 5717ad4334aSdrh /* 4 TRIGGER: */ { 4, 4, 4, 4, 4, 5, 4, 4, }, 5727ad4334aSdrh /* 5 SEMI: */ { 4, 4, 4, 4, 6, 5, 5, 4, }, 5737ad4334aSdrh /* 6 END: */ { 4, 4, 4, 4, 4, 0, 6, 4, }, 5747ad4334aSdrh }; 5757ad4334aSdrh 5767ad4334aSdrh while( *zSql ){ 5777ad4334aSdrh switch( *zSql ){ 5787ad4334aSdrh case ';': { /* A semicolon */ 5797ad4334aSdrh token = tkSEMI; 5807ad4334aSdrh break; 5817ad4334aSdrh } 5827ad4334aSdrh case ' ': 5837ad4334aSdrh case '\r': 5847ad4334aSdrh case '\t': 5857ad4334aSdrh case '\n': 5867ad4334aSdrh case '\f': { /* White space is ignored */ 5877ad4334aSdrh token = tkWS; 5887ad4334aSdrh break; 5897ad4334aSdrh } 5907ad4334aSdrh case '/': { /* C-style comments */ 5917ad4334aSdrh if( zSql[1]!='*' ){ 5927ad4334aSdrh token = tkOTHER; 5937ad4334aSdrh break; 5947ad4334aSdrh } 5957ad4334aSdrh zSql += 2; 5967ad4334aSdrh while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; } 5977ad4334aSdrh if( zSql[0]==0 ) return 0; 5987ad4334aSdrh zSql++; 5997ad4334aSdrh token = tkWS; 6007ad4334aSdrh break; 6017ad4334aSdrh } 6027ad4334aSdrh case '-': { /* SQL-style comments from "--" to end of line */ 6037ad4334aSdrh if( zSql[1]!='-' ){ 6047ad4334aSdrh token = tkOTHER; 6057ad4334aSdrh break; 6067ad4334aSdrh } 6077ad4334aSdrh while( *zSql && *zSql!='\n' ){ zSql++; } 6087ad4334aSdrh if( *zSql==0 ) return state==0; 6097ad4334aSdrh token = tkWS; 6107ad4334aSdrh break; 6117ad4334aSdrh } 6127ad4334aSdrh case '[': { /* Microsoft-style identifiers in [...] */ 6137ad4334aSdrh zSql++; 6147ad4334aSdrh while( *zSql && *zSql!=']' ){ zSql++; } 6157ad4334aSdrh if( *zSql==0 ) return 0; 6167ad4334aSdrh token = tkOTHER; 6177ad4334aSdrh break; 6187ad4334aSdrh } 6197ad4334aSdrh case '"': /* single- and double-quoted strings */ 6207ad4334aSdrh case '\'': { 6217ad4334aSdrh int c = *zSql; 6227ad4334aSdrh zSql++; 6237ad4334aSdrh while( *zSql && *zSql!=c ){ zSql++; } 6247ad4334aSdrh if( *zSql==0 ) return 0; 6257ad4334aSdrh token = tkOTHER; 6267ad4334aSdrh break; 6277ad4334aSdrh } 6287ad4334aSdrh default: { 629e1e38c4dSdrh if( isIdChar[(u8)*zSql] ){ 6307ad4334aSdrh /* Keywords and unquoted identifiers */ 6317ad4334aSdrh int nId; 632e1e38c4dSdrh for(nId=1; isIdChar[(u8)zSql[nId]]; nId++){} 6337ad4334aSdrh switch( *zSql ){ 6347ad4334aSdrh case 'c': case 'C': { 6357ad4334aSdrh if( nId==6 && sqliteStrNICmp(zSql, "create", 6)==0 ){ 6367ad4334aSdrh token = tkCREATE; 6377ad4334aSdrh }else{ 6387ad4334aSdrh token = tkOTHER; 6397ad4334aSdrh } 6407ad4334aSdrh break; 6417ad4334aSdrh } 6427ad4334aSdrh case 't': case 'T': { 6437ad4334aSdrh if( nId==7 && sqliteStrNICmp(zSql, "trigger", 7)==0 ){ 6447ad4334aSdrh token = tkTRIGGER; 6457ad4334aSdrh }else if( nId==4 && sqliteStrNICmp(zSql, "temp", 4)==0 ){ 6467ad4334aSdrh token = tkTEMP; 6477ad4334aSdrh }else if( nId==9 && sqliteStrNICmp(zSql, "temporary", 9)==0 ){ 6487ad4334aSdrh token = tkTEMP; 6497ad4334aSdrh }else{ 6507ad4334aSdrh token = tkOTHER; 6517ad4334aSdrh } 6527ad4334aSdrh break; 6537ad4334aSdrh } 6547ad4334aSdrh case 'e': case 'E': { 6557ad4334aSdrh if( nId==3 && sqliteStrNICmp(zSql, "end", 3)==0 ){ 6567ad4334aSdrh token = tkEND; 6577ad4334aSdrh }else if( nId==7 && sqliteStrNICmp(zSql, "explain", 7)==0 ){ 6587ad4334aSdrh token = tkEXPLAIN; 6597ad4334aSdrh }else{ 6607ad4334aSdrh token = tkOTHER; 6617ad4334aSdrh } 6627ad4334aSdrh break; 6637ad4334aSdrh } 6647ad4334aSdrh default: { 6657ad4334aSdrh token = tkOTHER; 6667ad4334aSdrh break; 6677ad4334aSdrh } 6687ad4334aSdrh } 6697ad4334aSdrh zSql += nId-1; 6707ad4334aSdrh }else{ 6717ad4334aSdrh /* Operators and special symbols */ 6727ad4334aSdrh token = tkOTHER; 6737ad4334aSdrh } 6747ad4334aSdrh break; 6757ad4334aSdrh } 6767ad4334aSdrh } 6777ad4334aSdrh state = trans[state][token]; 6787ad4334aSdrh zSql++; 6797ad4334aSdrh } 6807ad4334aSdrh return state==0; 6817ad4334aSdrh } 682