| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #include "sqliteInt.h" |
| | #ifndef SQLITE_OMIT_COMPLETE |
| |
|
| | |
| | |
| | |
| | #ifndef SQLITE_AMALGAMATION |
| | #ifdef SQLITE_ASCII |
| | #define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) |
| | #endif |
| | #ifdef SQLITE_EBCDIC |
| | extern const char sqlite3IsEbcdicIdChar[]; |
| | #define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) |
| | #endif |
| | #endif |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | #define tkSEMI 0 |
| | #define tkWS 1 |
| | #define tkOTHER 2 |
| | #ifndef SQLITE_OMIT_TRIGGER |
| | #define tkEXPLAIN 3 |
| | #define tkCREATE 4 |
| | #define tkTEMP 5 |
| | #define tkTRIGGER 6 |
| | #define tkEND 7 |
| | #endif |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | int sqlite3_complete(const char *zSql){ |
| | u8 state = 0; |
| | u8 token; |
| |
|
| | #ifndef SQLITE_OMIT_TRIGGER |
| | |
| | |
| | |
| | static const u8 trans[8][8] = { |
| | |
| | |
| | { 1, 0, 2, 3, 4, 2, 2, 2, }, |
| | { 1, 1, 2, 3, 4, 2, 2, 2, }, |
| | { 1, 2, 2, 2, 2, 2, 2, 2, }, |
| | { 1, 3, 3, 2, 4, 2, 2, 2, }, |
| | { 1, 4, 2, 2, 2, 4, 5, 2, }, |
| | { 6, 5, 5, 5, 5, 5, 5, 5, }, |
| | { 6, 6, 5, 5, 5, 5, 5, 7, }, |
| | { 1, 7, 5, 5, 5, 5, 5, 5, }, |
| | }; |
| | #else |
| | |
| | |
| | |
| | static const u8 trans[3][3] = { |
| | |
| | |
| | { 1, 0, 2, }, |
| | { 1, 1, 2, }, |
| | { 1, 2, 2, }, |
| | }; |
| | #endif |
| |
|
| | #ifdef SQLITE_ENABLE_API_ARMOR |
| | if( zSql==0 ){ |
| | (void)SQLITE_MISUSE_BKPT; |
| | return 0; |
| | } |
| | #endif |
| |
|
| | while( *zSql ){ |
| | switch( *zSql ){ |
| | case ';': { |
| | token = tkSEMI; |
| | break; |
| | } |
| | case ' ': |
| | case '\r': |
| | case '\t': |
| | case '\n': |
| | case '\f': { |
| | token = tkWS; |
| | break; |
| | } |
| | case '/': { |
| | if( zSql[1]!='*' ){ |
| | token = tkOTHER; |
| | break; |
| | } |
| | zSql += 2; |
| | while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; } |
| | if( zSql[0]==0 ) return 0; |
| | zSql++; |
| | token = tkWS; |
| | break; |
| | } |
| | case '-': { |
| | if( zSql[1]!='-' ){ |
| | token = tkOTHER; |
| | break; |
| | } |
| | while( *zSql && *zSql!='\n' ){ zSql++; } |
| | if( *zSql==0 ) return state==1; |
| | token = tkWS; |
| | break; |
| | } |
| | case '[': { |
| | zSql++; |
| | while( *zSql && *zSql!=']' ){ zSql++; } |
| | if( *zSql==0 ) return 0; |
| | token = tkOTHER; |
| | break; |
| | } |
| | case '`': |
| | case '"': |
| | case '\'': { |
| | int c = *zSql; |
| | zSql++; |
| | while( *zSql && *zSql!=c ){ zSql++; } |
| | if( *zSql==0 ) return 0; |
| | token = tkOTHER; |
| | break; |
| | } |
| | default: { |
| | #ifdef SQLITE_EBCDIC |
| | unsigned char c; |
| | #endif |
| | if( IdChar((u8)*zSql) ){ |
| | |
| | int nId; |
| | for(nId=1; IdChar(zSql[nId]); nId++){} |
| | #ifdef SQLITE_OMIT_TRIGGER |
| | token = tkOTHER; |
| | #else |
| | switch( *zSql ){ |
| | case 'c': case 'C': { |
| | if( nId==6 && sqlite3StrNICmp(zSql, "create", 6)==0 ){ |
| | token = tkCREATE; |
| | }else{ |
| | token = tkOTHER; |
| | } |
| | break; |
| | } |
| | case 't': case 'T': { |
| | if( nId==7 && sqlite3StrNICmp(zSql, "trigger", 7)==0 ){ |
| | token = tkTRIGGER; |
| | }else if( nId==4 && sqlite3StrNICmp(zSql, "temp", 4)==0 ){ |
| | token = tkTEMP; |
| | }else if( nId==9 && sqlite3StrNICmp(zSql, "temporary", 9)==0 ){ |
| | token = tkTEMP; |
| | }else{ |
| | token = tkOTHER; |
| | } |
| | break; |
| | } |
| | case 'e': case 'E': { |
| | if( nId==3 && sqlite3StrNICmp(zSql, "end", 3)==0 ){ |
| | token = tkEND; |
| | }else |
| | #ifndef SQLITE_OMIT_EXPLAIN |
| | if( nId==7 && sqlite3StrNICmp(zSql, "explain", 7)==0 ){ |
| | token = tkEXPLAIN; |
| | }else |
| | #endif |
| | { |
| | token = tkOTHER; |
| | } |
| | break; |
| | } |
| | default: { |
| | token = tkOTHER; |
| | break; |
| | } |
| | } |
| | #endif |
| | zSql += nId-1; |
| | }else{ |
| | |
| | token = tkOTHER; |
| | } |
| | break; |
| | } |
| | } |
| | state = trans[state][token]; |
| | zSql++; |
| | } |
| | return state==1; |
| | } |
| |
|
| | #ifndef SQLITE_OMIT_UTF16 |
| | |
| | |
| | |
| | |
| | |
| | int sqlite3_complete16(const void *zSql){ |
| | sqlite3_value *pVal; |
| | char const *zSql8; |
| | int rc; |
| |
|
| | #ifndef SQLITE_OMIT_AUTOINIT |
| | rc = sqlite3_initialize(); |
| | if( rc ) return rc; |
| | #endif |
| | pVal = sqlite3ValueNew(0); |
| | sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC); |
| | zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8); |
| | if( zSql8 ){ |
| | rc = sqlite3_complete(zSql8); |
| | }else{ |
| | rc = SQLITE_NOMEM_BKPT; |
| | } |
| | sqlite3ValueFree(pVal); |
| | return rc & 0xff; |
| | } |
| | #endif |
| | #endif |
| |
|