diff options
author | drh <drh@noemail.net> | 2017-03-07 14:38:52 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2017-03-07 14:38:52 +0000 |
commit | 9b38d6660f08c01afc8f6fcc86548ce3167acf21 (patch) | |
tree | 51917db11398bdf2c7cff6b3baead6e199c4325e /src/tokenize.c | |
parent | 567bd44917bd5e7553d6a38b6eb51429422f5b37 (diff) | |
download | sqlite-9b38d6660f08c01afc8f6fcc86548ce3167acf21.tar.gz sqlite-9b38d6660f08c01afc8f6fcc86548ce3167acf21.zip |
Performance optimization in the tokenizer/parser loop.
FossilOrigin-Name: 2cb71583d631cd417acbeebbb4ee950573a9deef
Diffstat (limited to 'src/tokenize.c')
-rw-r--r-- | src/tokenize.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/src/tokenize.c b/src/tokenize.c index 7bb1179e2..578ddc4f0 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -475,8 +475,8 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){ */ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ int nErr = 0; /* Number of errors encountered */ - int i; /* Loop counter */ void *pEngine; /* The LEMON-generated LALR(1) parser */ + int n = 0; /* Length of the next token token */ int tokenType; /* type of the next token */ int lastTokenParsed = -1; /* type of the previous token */ sqlite3 *db = pParse->db; /* The database connection */ @@ -492,7 +492,6 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ } pParse->rc = SQLITE_OK; pParse->zTail = zSql; - i = 0; assert( pzErrMsg!=0 ); /* sqlite3ParserTrace(stdout, "parser: "); */ #ifdef sqlite3Parser_ENGINEALWAYSONSTACK @@ -510,12 +509,10 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ assert( pParse->nVar==0 ); assert( pParse->pVList==0 ); while( 1 ){ - assert( i>=0 ); - if( zSql[i]!=0 ){ - pParse->sLastToken.z = &zSql[i]; - pParse->sLastToken.n = sqlite3GetToken((u8*)&zSql[i],&tokenType); - i += pParse->sLastToken.n; - if( i>mxSqlLen ){ + if( zSql[0]!=0 ){ + n = sqlite3GetToken((u8*)zSql, &tokenType); + mxSqlLen -= n; + if( mxSqlLen<0 ){ pParse->rc = SQLITE_TOOBIG; break; } @@ -529,6 +526,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ }else{ tokenType = TK_SEMI; } + zSql -= n; } if( tokenType>=TK_SPACE ){ assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL ); @@ -537,18 +535,21 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ break; } if( tokenType==TK_ILLEGAL ){ - sqlite3ErrorMsg(pParse, "unrecognized token: \"%T\"", - &pParse->sLastToken); + sqlite3ErrorMsg(pParse, "unrecognized token: \"%.*s\"", n, zSql); break; } + zSql += n; }else{ + pParse->sLastToken.z = zSql; + pParse->sLastToken.n = n; sqlite3Parser(pEngine, tokenType, pParse->sLastToken, pParse); lastTokenParsed = tokenType; + zSql += n; if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break; } } assert( nErr==0 ); - pParse->zTail = &zSql[i]; + pParse->zTail = zSql; #ifdef YYTRACKMAXSTACKDEPTH sqlite3_mutex_enter(sqlite3MallocMutex()); sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK, |