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*caec2f12Sdrh ** $Id: tokenize.c,v 1.53 2003/01/07 02:47:48 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 */ 3275897234Sdrh int len; /* Number of characters in the keyword */ 3375897234Sdrh int 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 }, 47c3f9bad2Sdanielk1977 { "BEFORE", 0, TK_BEFORE, 0 }, 48c4a3c779Sdrh { "BEGIN", 0, TK_BEGIN, 0 }, 49fef5208cSdrh { "BETWEEN", 0, TK_BETWEEN, 0 }, 5075897234Sdrh { "BY", 0, TK_BY, 0 }, 5104738cb9Sdrh { "CASCADE", 0, TK_CASCADE, 0 }, 5217a7f8ddSdrh { "CASE", 0, TK_CASE, 0 }, 5375897234Sdrh { "CHECK", 0, TK_CHECK, 0 }, 54f57b14a6Sdrh { "CLUSTER", 0, TK_CLUSTER, 0 }, 558e2ca029Sdrh { "COLLATE", 0, TK_COLLATE, 0 }, 56c4a3c779Sdrh { "COMMIT", 0, TK_COMMIT, 0 }, 579cfcf5d4Sdrh { "CONFLICT", 0, TK_CONFLICT, 0 }, 5875897234Sdrh { "CONSTRAINT", 0, TK_CONSTRAINT, 0 }, 59982cef7eSdrh { "COPY", 0, TK_COPY, 0 }, 6075897234Sdrh { "CREATE", 0, TK_CREATE, 0 }, 615ad1a6c8Sdrh { "CROSS", 0, TK_JOIN_KW, 0 }, 6275897234Sdrh { "DEFAULT", 0, TK_DEFAULT, 0 }, 6304738cb9Sdrh { "DEFERRED", 0, TK_DEFERRED, 0 }, 6404738cb9Sdrh { "DEFERRABLE", 0, TK_DEFERRABLE, 0 }, 6575897234Sdrh { "DELETE", 0, TK_DELETE, 0 }, 66982cef7eSdrh { "DELIMITERS", 0, TK_DELIMITERS, 0 }, 6775897234Sdrh { "DESC", 0, TK_DESC, 0 }, 68efb7251dSdrh { "DISTINCT", 0, TK_DISTINCT, 0 }, 6975897234Sdrh { "DROP", 0, TK_DROP, 0 }, 70c4a3c779Sdrh { "END", 0, TK_END, 0 }, 71c3f9bad2Sdanielk1977 { "EACH", 0, TK_EACH, 0 }, 7217a7f8ddSdrh { "ELSE", 0, TK_ELSE, 0 }, 7382c3d636Sdrh { "EXCEPT", 0, TK_EXCEPT, 0 }, 7475897234Sdrh { "EXPLAIN", 0, TK_EXPLAIN, 0 }, 751c92853dSdrh { "FAIL", 0, TK_FAIL, 0 }, 76c3f9bad2Sdanielk1977 { "FOR", 0, TK_FOR, 0 }, 7704738cb9Sdrh { "FOREIGN", 0, TK_FOREIGN, 0 }, 7875897234Sdrh { "FROM", 0, TK_FROM, 0 }, 795ad1a6c8Sdrh { "FULL", 0, TK_JOIN_KW, 0 }, 80dce2cbe6Sdrh { "GLOB", 0, TK_GLOB, 0 }, 812282792aSdrh { "GROUP", 0, TK_GROUP, 0 }, 822282792aSdrh { "HAVING", 0, TK_HAVING, 0 }, 839cfcf5d4Sdrh { "IGNORE", 0, TK_IGNORE, 0 }, 8404738cb9Sdrh { "IMMEDIATE", 0, TK_IMMEDIATE, 0 }, 85fef5208cSdrh { "IN", 0, TK_IN, 0 }, 8675897234Sdrh { "INDEX", 0, TK_INDEX, 0 }, 8704738cb9Sdrh { "INITIALLY", 0, TK_INITIALLY, 0 }, 885ad1a6c8Sdrh { "INNER", 0, TK_JOIN_KW, 0 }, 8975897234Sdrh { "INSERT", 0, TK_INSERT, 0 }, 90c3f9bad2Sdanielk1977 { "INSTEAD", 0, TK_INSTEAD, 0 }, 9182c3d636Sdrh { "INTERSECT", 0, TK_INTERSECT, 0 }, 9275897234Sdrh { "INTO", 0, TK_INTO, 0 }, 9375897234Sdrh { "IS", 0, TK_IS, 0 }, 9475897234Sdrh { "ISNULL", 0, TK_ISNULL, 0 }, 9501f3f253Sdrh { "JOIN", 0, TK_JOIN, 0 }, 9675897234Sdrh { "KEY", 0, TK_KEY, 0 }, 975ad1a6c8Sdrh { "LEFT", 0, TK_JOIN_KW, 0 }, 98dce2cbe6Sdrh { "LIKE", 0, TK_LIKE, 0 }, 999bbca4c1Sdrh { "LIMIT", 0, TK_LIMIT, 0 }, 10004738cb9Sdrh { "MATCH", 0, TK_MATCH, 0 }, 1015ad1a6c8Sdrh { "NATURAL", 0, TK_JOIN_KW, 0 }, 10275897234Sdrh { "NOT", 0, TK_NOT, 0 }, 10375897234Sdrh { "NOTNULL", 0, TK_NOTNULL, 0 }, 10475897234Sdrh { "NULL", 0, TK_NULL, 0 }, 105c3f9bad2Sdanielk1977 { "OF", 0, TK_OF, 0 }, 1069bbca4c1Sdrh { "OFFSET", 0, TK_OFFSET, 0 }, 10775897234Sdrh { "ON", 0, TK_ON, 0 }, 10875897234Sdrh { "OR", 0, TK_OR, 0 }, 10975897234Sdrh { "ORDER", 0, TK_ORDER, 0 }, 1105ad1a6c8Sdrh { "OUTER", 0, TK_JOIN_KW, 0 }, 111f57b14a6Sdrh { "PRAGMA", 0, TK_PRAGMA, 0 }, 11275897234Sdrh { "PRIMARY", 0, TK_PRIMARY, 0 }, 1136f34903eSdanielk1977 { "RAISE", 0, TK_RAISE, 0 }, 11404738cb9Sdrh { "REFERENCES", 0, TK_REFERENCES, 0 }, 1159cfcf5d4Sdrh { "REPLACE", 0, TK_REPLACE, 0 }, 11604738cb9Sdrh { "RESTRICT", 0, TK_RESTRICT, 0 }, 1175ad1a6c8Sdrh { "RIGHT", 0, TK_JOIN_KW, 0 }, 118c4a3c779Sdrh { "ROLLBACK", 0, TK_ROLLBACK, 0 }, 119c3f9bad2Sdanielk1977 { "ROW", 0, TK_ROW, 0 }, 12075897234Sdrh { "SELECT", 0, TK_SELECT, 0 }, 12175897234Sdrh { "SET", 0, TK_SET, 0 }, 1221873cd50Sdrh { "STATEMENT", 0, TK_STATEMENT, 0 }, 12375897234Sdrh { "TABLE", 0, TK_TABLE, 0 }, 124f57b3399Sdrh { "TEMP", 0, TK_TEMP, 0 }, 125f57b3399Sdrh { "TEMPORARY", 0, TK_TEMP, 0 }, 12617a7f8ddSdrh { "THEN", 0, TK_THEN, 0 }, 127c4a3c779Sdrh { "TRANSACTION", 0, TK_TRANSACTION, 0 }, 128c3f9bad2Sdanielk1977 { "TRIGGER", 0, TK_TRIGGER, 0 }, 12982c3d636Sdrh { "UNION", 0, TK_UNION, 0 }, 13075897234Sdrh { "UNIQUE", 0, TK_UNIQUE, 0 }, 13175897234Sdrh { "UPDATE", 0, TK_UPDATE, 0 }, 132982cef7eSdrh { "USING", 0, TK_USING, 0 }, 133dce2cbe6Sdrh { "VACUUM", 0, TK_VACUUM, 0 }, 13475897234Sdrh { "VALUES", 0, TK_VALUES, 0 }, 135a76b5dfcSdrh { "VIEW", 0, TK_VIEW, 0 }, 13617a7f8ddSdrh { "WHEN", 0, TK_WHEN, 0 }, 13775897234Sdrh { "WHERE", 0, TK_WHERE, 0 }, 13875897234Sdrh }; 13975897234Sdrh 14075897234Sdrh /* 14175897234Sdrh ** This is the hash table 14275897234Sdrh */ 143daffd0e5Sdrh #define KEY_HASH_SIZE 71 14475897234Sdrh static Keyword *apHashTable[KEY_HASH_SIZE]; 14575897234Sdrh 14675897234Sdrh 14775897234Sdrh /* 14875897234Sdrh ** This function looks up an identifier to determine if it is a 14975897234Sdrh ** keyword. If it is a keyword, the token code of that keyword is 15075897234Sdrh ** returned. If the input is not a keyword, TK_ID is returned. 15175897234Sdrh */ 15217f71934Sdrh int sqliteKeywordCode(const char *z, int n){ 15375897234Sdrh int h; 15475897234Sdrh Keyword *p; 15575897234Sdrh if( aKeywordTable[0].len==0 ){ 15675897234Sdrh /* Initialize the keyword hash table */ 157ad75e987Sdrh sqliteOsEnterMutex(); 158ad75e987Sdrh if( aKeywordTable[0].len==0 ){ 15975897234Sdrh int i; 16075897234Sdrh int n; 16175897234Sdrh n = sizeof(aKeywordTable)/sizeof(aKeywordTable[0]); 16275897234Sdrh for(i=0; i<n; i++){ 16375897234Sdrh aKeywordTable[i].len = strlen(aKeywordTable[i].zName); 16475897234Sdrh h = sqliteHashNoCase(aKeywordTable[i].zName, aKeywordTable[i].len); 16575897234Sdrh h %= KEY_HASH_SIZE; 16675897234Sdrh aKeywordTable[i].pNext = apHashTable[h]; 16775897234Sdrh apHashTable[h] = &aKeywordTable[i]; 16875897234Sdrh } 16975897234Sdrh } 170ad75e987Sdrh sqliteOsLeaveMutex(); 171ad75e987Sdrh } 17275897234Sdrh h = sqliteHashNoCase(z, n) % KEY_HASH_SIZE; 17375897234Sdrh for(p=apHashTable[h]; p; p=p->pNext){ 17475897234Sdrh if( p->len==n && sqliteStrNICmp(p->zName, z, n)==0 ){ 17575897234Sdrh return p->tokenType; 17675897234Sdrh } 17775897234Sdrh } 17875897234Sdrh return TK_ID; 17975897234Sdrh } 18075897234Sdrh 18198808babSdrh 18298808babSdrh /* 18398808babSdrh ** If X is a character that can be used in an identifier then 18498808babSdrh ** isIdChar[X] will be 1. Otherwise isIdChar[X] will be 0. 18598808babSdrh ** 18698808babSdrh ** In this implementation, an identifier can be a string of 18798808babSdrh ** alphabetic characters, digits, and "_" plus any character 18898808babSdrh ** with the high-order bit set. The latter rule means that 18998808babSdrh ** any sequence of UTF-8 characters or characters taken from 19098808babSdrh ** an extended ISO8859 character set can form an identifier. 19198808babSdrh */ 19298808babSdrh static const char isIdChar[] = { 19398808babSdrh /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ 19498808babSdrh 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ 19598808babSdrh 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ 19698808babSdrh 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ 19798808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ 19898808babSdrh 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ 19998808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ 20098808babSdrh 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ 20198808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ 20298808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 8x */ 20398808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 9x */ 20498808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Ax */ 20598808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Bx */ 20698808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Cx */ 20798808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Dx */ 20898808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Ex */ 20998808babSdrh 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Fx */ 21098808babSdrh }; 21198808babSdrh 21298808babSdrh 21375897234Sdrh /* 21475897234Sdrh ** Return the length of the token that begins at z[0]. Return 21575897234Sdrh ** -1 if the token is (or might be) incomplete. Store the token 21675897234Sdrh ** type in *tokenType before returning. 21775897234Sdrh */ 21898808babSdrh static int sqliteGetToken(const unsigned char *z, int *tokenType){ 21975897234Sdrh int i; 22075897234Sdrh switch( *z ){ 22130cab809Sdrh case ' ': case '\t': case '\n': case '\f': case '\r': { 22232eb7b47Sdrh for(i=1; isspace(z[i]); i++){} 22375897234Sdrh *tokenType = TK_SPACE; 22475897234Sdrh return i; 22575897234Sdrh } 22675897234Sdrh case '-': { 22775897234Sdrh if( z[1]==0 ) return -1; 22875897234Sdrh if( z[1]=='-' ){ 22975897234Sdrh for(i=2; z[i] && z[i]!='\n'; i++){} 23075897234Sdrh *tokenType = TK_COMMENT; 23175897234Sdrh return i; 23275897234Sdrh } 23375897234Sdrh *tokenType = TK_MINUS; 23475897234Sdrh return 1; 23575897234Sdrh } 23675897234Sdrh case '(': { 2371f16230bSdrh if( z[1]=='+' && z[2]==')' ){ 2381f16230bSdrh *tokenType = TK_ORACLE_OUTER_JOIN; 2391f16230bSdrh return 3; 2401f16230bSdrh }else{ 24175897234Sdrh *tokenType = TK_LP; 24275897234Sdrh return 1; 24375897234Sdrh } 2441f16230bSdrh } 24575897234Sdrh case ')': { 24675897234Sdrh *tokenType = TK_RP; 24775897234Sdrh return 1; 24875897234Sdrh } 24975897234Sdrh case ';': { 25075897234Sdrh *tokenType = TK_SEMI; 25175897234Sdrh return 1; 25275897234Sdrh } 25375897234Sdrh case '+': { 25475897234Sdrh *tokenType = TK_PLUS; 25575897234Sdrh return 1; 25675897234Sdrh } 25775897234Sdrh case '*': { 25875897234Sdrh *tokenType = TK_STAR; 25975897234Sdrh return 1; 26075897234Sdrh } 26175897234Sdrh case '/': { 26266105a8eSdrh if( z[1]!='*' || z[2]==0 ){ 26375897234Sdrh *tokenType = TK_SLASH; 26475897234Sdrh return 1; 26575897234Sdrh } 26666105a8eSdrh for(i=3; z[i] && (z[i]!='/' || z[i-1]!='*'); i++){} 26766105a8eSdrh if( z[i] ) i++; 26866105a8eSdrh *tokenType = TK_COMMENT; 26966105a8eSdrh return i; 27066105a8eSdrh } 271bf4133cbSdrh case '%': { 272bf4133cbSdrh *tokenType = TK_REM; 273bf4133cbSdrh return 1; 274bf4133cbSdrh } 27575897234Sdrh case '=': { 27675897234Sdrh *tokenType = TK_EQ; 27775897234Sdrh return 1 + (z[1]=='='); 27875897234Sdrh } 27975897234Sdrh case '<': { 28075897234Sdrh if( z[1]=='=' ){ 28175897234Sdrh *tokenType = TK_LE; 28275897234Sdrh return 2; 28375897234Sdrh }else if( z[1]=='>' ){ 28475897234Sdrh *tokenType = TK_NE; 28575897234Sdrh return 2; 286bf4133cbSdrh }else if( z[1]=='<' ){ 287bf4133cbSdrh *tokenType = TK_LSHIFT; 288bf4133cbSdrh return 2; 28975897234Sdrh }else{ 29075897234Sdrh *tokenType = TK_LT; 29175897234Sdrh return 1; 29275897234Sdrh } 29375897234Sdrh } 29475897234Sdrh case '>': { 29575897234Sdrh if( z[1]=='=' ){ 29675897234Sdrh *tokenType = TK_GE; 29775897234Sdrh return 2; 298bf4133cbSdrh }else if( z[1]=='>' ){ 299bf4133cbSdrh *tokenType = TK_RSHIFT; 300bf4133cbSdrh return 2; 30175897234Sdrh }else{ 30275897234Sdrh *tokenType = TK_GT; 30375897234Sdrh return 1; 30475897234Sdrh } 30575897234Sdrh } 30675897234Sdrh case '!': { 30775897234Sdrh if( z[1]!='=' ){ 30875897234Sdrh *tokenType = TK_ILLEGAL; 309c837e709Sdrh return 2; 31075897234Sdrh }else{ 31175897234Sdrh *tokenType = TK_NE; 31275897234Sdrh return 2; 31375897234Sdrh } 31475897234Sdrh } 3150040077dSdrh case '|': { 3160040077dSdrh if( z[1]!='|' ){ 317bf4133cbSdrh *tokenType = TK_BITOR; 3180040077dSdrh return 1; 3190040077dSdrh }else{ 3200040077dSdrh *tokenType = TK_CONCAT; 3210040077dSdrh return 2; 3220040077dSdrh } 3230040077dSdrh } 32475897234Sdrh case ',': { 32575897234Sdrh *tokenType = TK_COMMA; 32675897234Sdrh return 1; 32775897234Sdrh } 328bf4133cbSdrh case '&': { 329bf4133cbSdrh *tokenType = TK_BITAND; 330bf4133cbSdrh return 1; 331bf4133cbSdrh } 332bf4133cbSdrh case '~': { 333bf4133cbSdrh *tokenType = TK_BITNOT; 334bf4133cbSdrh return 1; 335bf4133cbSdrh } 33675897234Sdrh case '\'': case '"': { 33775897234Sdrh int delim = z[0]; 33875897234Sdrh for(i=1; z[i]; i++){ 33975897234Sdrh if( z[i]==delim ){ 34075897234Sdrh if( z[i+1]==delim ){ 34175897234Sdrh i++; 34275897234Sdrh }else{ 34375897234Sdrh break; 34475897234Sdrh } 34575897234Sdrh } 34675897234Sdrh } 34775897234Sdrh if( z[i] ) i++; 34875897234Sdrh *tokenType = TK_STRING; 34975897234Sdrh return i; 35075897234Sdrh } 35175897234Sdrh case '.': { 35275897234Sdrh if( !isdigit(z[1]) ){ 35375897234Sdrh *tokenType = TK_DOT; 35475897234Sdrh return 1; 35575897234Sdrh } 35675897234Sdrh /* Fall thru into the next case */ 35775897234Sdrh } 35875897234Sdrh case '0': case '1': case '2': case '3': case '4': 35975897234Sdrh case '5': case '6': case '7': case '8': case '9': { 360c837e709Sdrh *tokenType = TK_INTEGER; 36132eb7b47Sdrh for(i=1; isdigit(z[i]); i++){} 36275897234Sdrh if( z[i]=='.' ){ 36375897234Sdrh i++; 36432eb7b47Sdrh while( isdigit(z[i]) ){ i++; } 365c837e709Sdrh *tokenType = TK_FLOAT; 366c837e709Sdrh } 36775897234Sdrh if( (z[i]=='e' || z[i]=='E') && 36875897234Sdrh ( isdigit(z[i+1]) 36975897234Sdrh || ((z[i+1]=='+' || z[i+1]=='-') && isdigit(z[i+2])) 37075897234Sdrh ) 37175897234Sdrh ){ 37275897234Sdrh i += 2; 37332eb7b47Sdrh while( isdigit(z[i]) ){ i++; } 37475897234Sdrh *tokenType = TK_FLOAT; 37575897234Sdrh }else if( z[0]=='.' ){ 37675897234Sdrh *tokenType = TK_FLOAT; 37775897234Sdrh } 37875897234Sdrh return i; 37975897234Sdrh } 3802f4392ffSdrh case '[': { 3812f4392ffSdrh for(i=1; z[i] && z[i-1]!=']'; i++){} 3822f4392ffSdrh *tokenType = TK_ID; 3832f4392ffSdrh return i; 3842f4392ffSdrh } 38598808babSdrh default: { 38698808babSdrh if( !isIdChar[*z] ){ 38798808babSdrh break; 38898808babSdrh } 38998808babSdrh for(i=1; isIdChar[z[i]]; i++){} 3906a535340Sdrh *tokenType = sqliteKeywordCode((char*)z, i); 39175897234Sdrh return i; 39275897234Sdrh } 39375897234Sdrh } 39475897234Sdrh *tokenType = TK_ILLEGAL; 39575897234Sdrh return 1; 39675897234Sdrh } 39775897234Sdrh 39875897234Sdrh /* 39975897234Sdrh ** Run the parser on the given SQL string. The parser structure is 400b19a2bc6Sdrh ** passed in. An SQLITE_ status code is returned. If an error occurs 401b19a2bc6Sdrh ** and pzErrMsg!=NULL then an error message might be written into 402b19a2bc6Sdrh ** memory obtained from malloc() and *pzErrMsg made to point to that 403b19a2bc6Sdrh ** error message. Or maybe not. 40475897234Sdrh */ 40580ff32f5Sdrh int sqliteRunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ 40675897234Sdrh int nErr = 0; 40775897234Sdrh int i; 40875897234Sdrh void *pEngine; 4096d4abfbeSdrh sqlite *db = pParse->db; 41075897234Sdrh extern void *sqliteParserAlloc(void*(*)(int)); 41175897234Sdrh extern void sqliteParserFree(void*, void(*)(void*)); 412338ea13cSdrh extern int sqliteParser(void*, int, Token, Parse*); 41375897234Sdrh 4146d4abfbeSdrh db->flags &= ~SQLITE_Interrupt; 4154c504391Sdrh pParse->rc = SQLITE_OK; 41675897234Sdrh i = 0; 417982cef7eSdrh pEngine = sqliteParserAlloc((void*(*)(int))malloc); 41875897234Sdrh if( pEngine==0 ){ 41975897234Sdrh sqliteSetString(pzErrMsg, "out of memory", 0); 42075897234Sdrh return 1; 42175897234Sdrh } 42232eb7b47Sdrh pParse->sLastToken.dyn = 0; 42332eb7b47Sdrh while( sqlite_malloc_failed==0 && zSql[i]!=0 ){ 42475897234Sdrh int tokenType; 42575897234Sdrh 42632eb7b47Sdrh assert( i>=0 ); 42775897234Sdrh pParse->sLastToken.z = &zSql[i]; 42832eb7b47Sdrh assert( pParse->sLastToken.dyn==0 ); 42998808babSdrh pParse->sLastToken.n = sqliteGetToken((unsigned char*)&zSql[i], &tokenType); 43075897234Sdrh i += pParse->sLastToken.n; 43175897234Sdrh switch( tokenType ){ 43275897234Sdrh case TK_SPACE: 43375897234Sdrh case TK_COMMENT: { 43432eb7b47Sdrh if( (db->flags & SQLITE_Interrupt)!=0 ){ 43532eb7b47Sdrh pParse->rc = SQLITE_INTERRUPT; 43632eb7b47Sdrh sqliteSetString(pzErrMsg, "interrupt", 0); 43732eb7b47Sdrh goto abort_parse; 43832eb7b47Sdrh } 43975897234Sdrh break; 44075897234Sdrh } 44132eb7b47Sdrh case TK_ILLEGAL: { 442c837e709Sdrh sqliteSetNString(pzErrMsg, "unrecognized token: \"", -1, 443c837e709Sdrh pParse->sLastToken.z, pParse->sLastToken.n, "\"", 1, 0); 44475897234Sdrh nErr++; 445*caec2f12Sdrh goto abort_parse; 44632eb7b47Sdrh } 44732eb7b47Sdrh default: { 44875897234Sdrh sqliteParser(pEngine, tokenType, pParse->sLastToken, pParse); 4496e142f54Sdrh if( pParse->zErrMsg && pParse->sErrToken.z ){ 45075897234Sdrh sqliteSetNString(pzErrMsg, "near \"", -1, 45175897234Sdrh pParse->sErrToken.z, pParse->sErrToken.n, 45275897234Sdrh "\": ", -1, 45375897234Sdrh pParse->zErrMsg, -1, 45475897234Sdrh 0); 45575897234Sdrh nErr++; 4566e142f54Sdrh sqliteFree(pParse->zErrMsg); 4576e142f54Sdrh pParse->zErrMsg = 0; 45832eb7b47Sdrh goto abort_parse; 459ecdc7530Sdrh }else if( pParse->rc!=SQLITE_OK ){ 4606d4abfbeSdrh sqliteSetString(pzErrMsg, sqlite_error_string(pParse->rc), 0); 461ecdc7530Sdrh nErr++; 46232eb7b47Sdrh goto abort_parse; 46375897234Sdrh } 46475897234Sdrh break; 46575897234Sdrh } 46675897234Sdrh } 46732eb7b47Sdrh } 46832eb7b47Sdrh abort_parse: 46932eb7b47Sdrh if( zSql[i]==0 && nErr==0 ){ 470094b2bbfSdrh sqliteParser(pEngine, TK_SEMI, pParse->sLastToken, pParse); 47175897234Sdrh sqliteParser(pEngine, 0, pParse->sLastToken, pParse); 4726e142f54Sdrh if( pParse->zErrMsg && pParse->sErrToken.z ){ 47375897234Sdrh sqliteSetNString(pzErrMsg, "near \"", -1, 47475897234Sdrh pParse->sErrToken.z, pParse->sErrToken.n, 47575897234Sdrh "\": ", -1, 47675897234Sdrh pParse->zErrMsg, -1, 47775897234Sdrh 0); 47875897234Sdrh nErr++; 4796e142f54Sdrh sqliteFree(pParse->zErrMsg); 4806e142f54Sdrh pParse->zErrMsg = 0; 48175897234Sdrh } 48275897234Sdrh } 483dcc581ccSdrh sqliteParserFree(pEngine, free); 48475897234Sdrh if( pParse->zErrMsg ){ 48575897234Sdrh if( pzErrMsg ){ 4866e142f54Sdrh sqliteFree(*pzErrMsg); 48775897234Sdrh *pzErrMsg = pParse->zErrMsg; 48875897234Sdrh }else{ 48975897234Sdrh sqliteFree(pParse->zErrMsg); 49075897234Sdrh } 49175897234Sdrh if( !nErr ) nErr++; 49275897234Sdrh } 49375897234Sdrh if( pParse->pVdbe ){ 49475897234Sdrh sqliteVdbeDelete(pParse->pVdbe); 49575897234Sdrh pParse->pVdbe = 0; 49675897234Sdrh } 49775897234Sdrh if( pParse->pNewTable ){ 49875897234Sdrh sqliteDeleteTable(pParse->db, pParse->pNewTable); 49975897234Sdrh pParse->pNewTable = 0; 50075897234Sdrh } 5014c504391Sdrh if( nErr>0 && pParse->rc==SQLITE_OK ){ 5024c504391Sdrh pParse->rc = SQLITE_ERROR; 5034c504391Sdrh } 50475897234Sdrh return nErr; 50575897234Sdrh } 506