| Index: third_party/sqlite/src/src/tokenize.c
|
| diff --git a/third_party/sqlite/src/src/tokenize.c b/third_party/sqlite/src/src/tokenize.c
|
| index c624efdcc7c7947ba73304c2b8c12fb333960bce..5bb91554606c1830639e352d2be453fd4b235585 100644
|
| --- a/third_party/sqlite/src/src/tokenize.c
|
| +++ b/third_party/sqlite/src/src/tokenize.c
|
| @@ -77,7 +77,7 @@ const unsigned char ebcdicToAscii[] = {
|
| ** end result.
|
| **
|
| ** Ticket #1066. the SQL standard does not allow '$' in the
|
| -** middle of identfiers. But many SQL implementations do.
|
| +** middle of identifiers. But many SQL implementations do.
|
| ** SQLite will allow '$' in identifiers for compatibility.
|
| ** But the feature is undocumented.
|
| */
|
| @@ -102,6 +102,7 @@ const char sqlite3IsEbcdicIdChar[] = {
|
| };
|
| #define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40]))
|
| #endif
|
| +int sqlite3IsIdChar(u8 c){ return IdChar(c); }
|
|
|
|
|
| /*
|
| @@ -123,7 +124,6 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){
|
| }
|
| case '-': {
|
| if( z[1]=='-' ){
|
| - /* IMP: R-15891-05542 -- syntax diagram for comments */
|
| for(i=2; (c=z[i])!=0 && c!='\n'; i++){}
|
| *tokenType = TK_SPACE; /* IMP: R-22934-25134 */
|
| return i;
|
| @@ -156,7 +156,6 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){
|
| *tokenType = TK_SLASH;
|
| return 1;
|
| }
|
| - /* IMP: R-15891-05542 -- syntax diagram for comments */
|
| for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){}
|
| if( c ) i++;
|
| *tokenType = TK_SPACE; /* IMP: R-22934-25134 */
|
| @@ -272,6 +271,12 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){
|
| testcase( z[0]=='6' ); testcase( z[0]=='7' ); testcase( z[0]=='8' );
|
| testcase( z[0]=='9' );
|
| *tokenType = TK_INTEGER;
|
| +#ifndef SQLITE_OMIT_HEX_INTEGER
|
| + if( z[0]=='0' && (z[1]=='x' || z[1]=='X') && sqlite3Isxdigit(z[2]) ){
|
| + for(i=3; sqlite3Isxdigit(z[i]); i++){}
|
| + return i;
|
| + }
|
| +#endif
|
| for(i=0; sqlite3Isdigit(z[i]); i++){}
|
| #ifndef SQLITE_OMIT_FLOATING_POINT
|
| if( z[i]=='.' ){
|
| @@ -305,24 +310,15 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){
|
| for(i=1; sqlite3Isdigit(z[i]); i++){}
|
| return i;
|
| }
|
| - case '#': {
|
| - for(i=1; sqlite3Isdigit(z[i]); i++){}
|
| - if( i>1 ){
|
| - /* Parameters of the form #NNN (where NNN is a number) are used
|
| - ** internally by sqlite3NestedParse. */
|
| - *tokenType = TK_REGISTER;
|
| - return i;
|
| - }
|
| - /* Fall through into the next case if the '#' is not followed by
|
| - ** a digit. Try to match #AAAA where AAAA is a parameter name. */
|
| - }
|
| #ifndef SQLITE_OMIT_TCL_VARIABLE
|
| case '$':
|
| #endif
|
| case '@': /* For compatibility with MS SQL Server */
|
| + case '#':
|
| case ':': {
|
| int n = 0;
|
| - testcase( z[0]=='$' ); testcase( z[0]=='@' ); testcase( z[0]==':' );
|
| + testcase( z[0]=='$' ); testcase( z[0]=='@' );
|
| + testcase( z[0]==':' ); testcase( z[0]=='#' );
|
| *tokenType = TK_VARIABLE;
|
| for(i=1; (c=z[i])!=0; i++){
|
| if( IdChar(c) ){
|
| @@ -353,13 +349,12 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){
|
| testcase( z[0]=='x' ); testcase( z[0]=='X' );
|
| if( z[1]=='\'' ){
|
| *tokenType = TK_BLOB;
|
| - for(i=2; (c=z[i])!=0 && c!='\''; i++){
|
| - if( !sqlite3Isxdigit(c) ){
|
| - *tokenType = TK_ILLEGAL;
|
| - }
|
| + for(i=2; sqlite3Isxdigit(z[i]); i++){}
|
| + if( z[i]!='\'' || i%2 ){
|
| + *tokenType = TK_ILLEGAL;
|
| + while( z[i] && z[i]!='\'' ){ i++; }
|
| }
|
| - if( i%2 || !c ) *tokenType = TK_ILLEGAL;
|
| - if( c ) i++;
|
| + if( z[i] ) i++;
|
| return i;
|
| }
|
| /* Otherwise fall through to the next case */
|
| @@ -397,14 +392,14 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
|
|
|
|
|
| mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
|
| - if( db->activeVdbeCnt==0 ){
|
| + if( db->nVdbeActive==0 ){
|
| db->u1.isInterrupted = 0;
|
| }
|
| pParse->rc = SQLITE_OK;
|
| pParse->zTail = zSql;
|
| i = 0;
|
| assert( pzErrMsg!=0 );
|
| - pEngine = sqlite3ParserAlloc((void*(*)(size_t))sqlite3Malloc);
|
| + pEngine = sqlite3ParserAlloc(sqlite3Malloc);
|
| if( pEngine==0 ){
|
| db->mallocFailed = 1;
|
| return SQLITE_NOMEM;
|
| @@ -412,9 +407,8 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
|
| assert( pParse->pNewTable==0 );
|
| assert( pParse->pNewTrigger==0 );
|
| assert( pParse->nVar==0 );
|
| - assert( pParse->nVarExpr==0 );
|
| - assert( pParse->nVarExprAlloc==0 );
|
| - assert( pParse->apVarExpr==0 );
|
| + assert( pParse->nzVar==0 );
|
| + assert( pParse->azVar==0 );
|
| enableLookaside = db->lookaside.bEnabled;
|
| if( db->lookaside.pStart ) db->lookaside.bEnabled = 1;
|
| while( !db->mallocFailed && zSql[i]!=0 ){
|
| @@ -507,9 +501,10 @@ abort_parse:
|
| sqlite3DeleteTable(db, pParse->pNewTable);
|
| }
|
|
|
| + if( pParse->bFreeWith ) sqlite3WithDelete(db, pParse->pWith);
|
| sqlite3DeleteTrigger(db, pParse->pNewTrigger);
|
| - sqlite3DbFree(db, pParse->apVarExpr);
|
| - sqlite3DbFree(db, pParse->aAlias);
|
| + for(i=pParse->nzVar-1; i>=0; i--) sqlite3DbFree(db, pParse->azVar[i]);
|
| + sqlite3DbFree(db, pParse->azVar);
|
| while( pParse->pAinc ){
|
| AutoincInfo *p = pParse->pAinc;
|
| pParse->pAinc = p->pNext;
|
|
|