mirror of
https://github.com/sqlite/sqlite.git
synced 2025-12-03 08:01:19 +03:00
In the amalgamation, allocate the parser engine object from stack rather than
from heap, for improved performance. This only happens in the amalgamation, since otherwise the sqlite3RunParser() routine does not know the object size. FossilOrigin-Name: 4fe879d4b5da6ae0688a7a99004683a234966597
This commit is contained in:
20
manifest
20
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\sa\scouple\scomment\stypos.\s\sNo\schanges\sto\scode.
|
C In\sthe\samalgamation,\sallocate\sthe\sparser\sengine\sobject\sfrom\sstack\srather\sthan\nfrom\sheap,\sfor\simproved\sperformance.\s\sThis\sonly\shappens\sin\sthe\samalgamation,\nsince\sotherwise\sthe\ssqlite3RunParser()\sroutine\sdoes\snot\sknow\sthe\sobject\ssize.
|
||||||
D 2017-01-28T19:53:51.613
|
D 2017-01-28T20:46:37.958
|
||||||
F Makefile.in 5f415e7867296d678fed2e6779aea10c1318b4bc
|
F Makefile.in 5f415e7867296d678fed2e6779aea10c1318b4bc
|
||||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||||
F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da
|
F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da
|
||||||
@@ -380,7 +380,7 @@ F src/os_win.c cf90abd4e50d9f56d2c20ce8e005aff55d7bd8e9
|
|||||||
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
||||||
F src/pager.c ff1232b3088a39806035ecfac4fffeb22717d80b
|
F src/pager.c ff1232b3088a39806035ecfac4fffeb22717d80b
|
||||||
F src/pager.h f2a99646c5533ffe11afa43e9e0bea74054e4efa
|
F src/pager.h f2a99646c5533ffe11afa43e9e0bea74054e4efa
|
||||||
F src/parse.y 29153738a7322054359320eb00b5a4cd44389f20
|
F src/parse.y 591704fce84f814d9a3642774c1f011d38f4149c
|
||||||
F src/pcache.c 51070ec9b8251bbf9c6ea3d35fd96a458752929e
|
F src/pcache.c 51070ec9b8251bbf9c6ea3d35fd96a458752929e
|
||||||
F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490
|
F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490
|
||||||
F src/pcache1.c e3967219b2a92b9edcb9324a4ba75009090d3953
|
F src/pcache1.c e3967219b2a92b9edcb9324a4ba75009090d3953
|
||||||
@@ -396,7 +396,7 @@ F src/shell.c a84e453c213f3e0d6935a582024da4e242f85a19
|
|||||||
F src/sqlite.h.in 8fd2b1a4e4aac023d4533313442528b81105fab3
|
F src/sqlite.h.in 8fd2b1a4e4aac023d4533313442528b81105fab3
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h 8648034aa702469afb553231677306cc6492a1ae
|
F src/sqlite3ext.h 8648034aa702469afb553231677306cc6492a1ae
|
||||||
F src/sqliteInt.h c246370f9d8de3af36052d7860cd35c0e2daea6a
|
F src/sqliteInt.h fd6815792077b7dc69f5167117cc5727fe95ed5a
|
||||||
F src/sqliteLimit.h c0373387c287c8d0932510b5547ecde31b5da247
|
F src/sqliteLimit.h c0373387c287c8d0932510b5547ecde31b5da247
|
||||||
F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
|
F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
|
||||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||||
@@ -451,7 +451,7 @@ F src/test_windirent.c 17f91f5f2aa1bb7328abb49414c363b5d2a9d3ff
|
|||||||
F src/test_windirent.h 5d67483a55442e31e1bde0f4a230e6e932ad5906
|
F src/test_windirent.h 5d67483a55442e31e1bde0f4a230e6e932ad5906
|
||||||
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||||
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
||||||
F src/tokenize.c 5c2f516876fc27fbd7753913f032f49eb89e83b5
|
F src/tokenize.c 25ccc63ae2c4163933221f3181c9982b47cd08d2
|
||||||
F src/treeview.c 4e44ade3bfe59d82005039f72e09333ce2b4162c
|
F src/treeview.c 4e44ade3bfe59d82005039f72e09333ce2b4162c
|
||||||
F src/trigger.c c9f0810043b265724fdb1bdd466894f984dfc182
|
F src/trigger.c c9f0810043b265724fdb1bdd466894f984dfc182
|
||||||
F src/update.c 456d4a4656f8a03c2abc88a51b19172197400e58
|
F src/update.c 456d4a4656f8a03c2abc88a51b19172197400e58
|
||||||
@@ -1476,7 +1476,7 @@ F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4
|
|||||||
F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5
|
F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5
|
||||||
F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce
|
F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce
|
||||||
F tool/lemon.c 5ccba178a8e8a4b21e1c9232944d23973da38ad7
|
F tool/lemon.c 5ccba178a8e8a4b21e1c9232944d23973da38ad7
|
||||||
F tool/lempar.c 320d630b44da693407684c64d9fa91a163419dac
|
F tool/lempar.c db1bdb4821f2d8fbd76e577cf3ab18642c8d08d1
|
||||||
F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9
|
F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9
|
||||||
F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862
|
F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862
|
||||||
F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca
|
F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca
|
||||||
@@ -1548,7 +1548,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P dc555b1039c6930f6d15355c698ff917a85e8056
|
P 2a2e7d86b275c970726f642a37a098950a3b906e
|
||||||
R 85ad9229fc7d18817a896fd231c69045
|
R 9e84d1f95c544016e0312212ee6f639c
|
||||||
U mistachkin
|
U drh
|
||||||
Z 8ca9913e082eb1ea0368f4a7e44ff324
|
Z 9df531d71c0beb5e9e8a394dca7276a3
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2a2e7d86b275c970726f642a37a098950a3b906e
|
4fe879d4b5da6ae0688a7a99004683a234966597
|
||||||
13
src/parse.y
13
src/parse.y
@@ -65,6 +65,19 @@
|
|||||||
*/
|
*/
|
||||||
#define YYPARSEFREENEVERNULL 1
|
#define YYPARSEFREENEVERNULL 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
** In the amalgamation, the parse.c file generated by lemon and the
|
||||||
|
** tokenize.c file are concatenated. In that case, sqlite3RunParser()
|
||||||
|
** has access to the the size of the yyParser object and so the parser
|
||||||
|
** engine can be allocated from stack. In that case, only the
|
||||||
|
** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked
|
||||||
|
** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be
|
||||||
|
** omitted.
|
||||||
|
*/
|
||||||
|
#ifdef SQLITE_AMALGAMATION
|
||||||
|
# define sqlite3Parser_ENGINEALWAYSONSTACK 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Alternative datatype for the argument to the malloc() routine passed
|
** Alternative datatype for the argument to the malloc() routine passed
|
||||||
** into sqlite3ParserAlloc(). The default is size_t.
|
** into sqlite3ParserAlloc(). The default is size_t.
|
||||||
|
|||||||
@@ -4073,8 +4073,10 @@ char sqlite3IndexColumnAffinity(sqlite3*, Index*, int);
|
|||||||
/*
|
/*
|
||||||
** The interface to the LEMON-generated parser
|
** The interface to the LEMON-generated parser
|
||||||
*/
|
*/
|
||||||
void *sqlite3ParserAlloc(void*(*)(u64));
|
#ifndef SQLITE_AMALGAMATION
|
||||||
void sqlite3ParserFree(void*, void(*)(void*));
|
void *sqlite3ParserAlloc(void*(*)(u64));
|
||||||
|
void sqlite3ParserFree(void*, void(*)(void*));
|
||||||
|
#endif
|
||||||
void sqlite3Parser(void*, int, Token, Parse*);
|
void sqlite3Parser(void*, int, Token, Parse*);
|
||||||
#ifdef YYTRACKMAXSTACKDEPTH
|
#ifdef YYTRACKMAXSTACKDEPTH
|
||||||
int sqlite3ParserStackPeak(void*);
|
int sqlite3ParserStackPeak(void*);
|
||||||
|
|||||||
@@ -481,6 +481,9 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
|
|||||||
int lastTokenParsed = -1; /* type of the previous token */
|
int lastTokenParsed = -1; /* type of the previous token */
|
||||||
sqlite3 *db = pParse->db; /* The database connection */
|
sqlite3 *db = pParse->db; /* The database connection */
|
||||||
int mxSqlLen; /* Max length of an SQL string */
|
int mxSqlLen; /* Max length of an SQL string */
|
||||||
|
#ifdef sqlite3Parser_ENGINEALWAYSONSTACK
|
||||||
|
unsigned char zSpace[sizeof(yyParser)]; /* Space for parser engine object */
|
||||||
|
#endif
|
||||||
|
|
||||||
assert( zSql!=0 );
|
assert( zSql!=0 );
|
||||||
mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
|
mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
|
||||||
@@ -492,11 +495,16 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
|
|||||||
i = 0;
|
i = 0;
|
||||||
assert( pzErrMsg!=0 );
|
assert( pzErrMsg!=0 );
|
||||||
/* sqlite3ParserTrace(stdout, "parser: "); */
|
/* sqlite3ParserTrace(stdout, "parser: "); */
|
||||||
|
#ifdef sqlite3Parser_ENGINEALWAYSONSTACK
|
||||||
|
pEngine = zSpace;
|
||||||
|
sqlite3ParserInit(pEngine);
|
||||||
|
#else
|
||||||
pEngine = sqlite3ParserAlloc(sqlite3Malloc);
|
pEngine = sqlite3ParserAlloc(sqlite3Malloc);
|
||||||
if( pEngine==0 ){
|
if( pEngine==0 ){
|
||||||
sqlite3OomFault(db);
|
sqlite3OomFault(db);
|
||||||
return SQLITE_NOMEM_BKPT;
|
return SQLITE_NOMEM_BKPT;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
assert( pParse->pNewTable==0 );
|
assert( pParse->pNewTable==0 );
|
||||||
assert( pParse->pNewTrigger==0 );
|
assert( pParse->pNewTrigger==0 );
|
||||||
assert( pParse->nVar==0 );
|
assert( pParse->nVar==0 );
|
||||||
@@ -548,7 +556,11 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
|
|||||||
);
|
);
|
||||||
sqlite3_mutex_leave(sqlite3MallocMutex());
|
sqlite3_mutex_leave(sqlite3MallocMutex());
|
||||||
#endif /* YYDEBUG */
|
#endif /* YYDEBUG */
|
||||||
|
#ifdef sqlite3Parser_ENGINEALWAYSONSTACK
|
||||||
|
sqlite3ParserFinalize(pEngine);
|
||||||
|
#else
|
||||||
sqlite3ParserFree(pEngine, sqlite3_free);
|
sqlite3ParserFree(pEngine, sqlite3_free);
|
||||||
|
#endif
|
||||||
if( db->mallocFailed ){
|
if( db->mallocFailed ){
|
||||||
pParse->rc = SQLITE_NOMEM_BKPT;
|
pParse->rc = SQLITE_NOMEM_BKPT;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -316,22 +316,10 @@ static int yyGrowStack(yyParser *p){
|
|||||||
# define YYMALLOCARGTYPE size_t
|
# define YYMALLOCARGTYPE size_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/* Initialize a new parser that has already been allocated.
|
||||||
** This function allocates a new parser.
|
|
||||||
** The only argument is a pointer to a function which works like
|
|
||||||
** malloc.
|
|
||||||
**
|
|
||||||
** Inputs:
|
|
||||||
** A pointer to the function used to allocate memory.
|
|
||||||
**
|
|
||||||
** Outputs:
|
|
||||||
** A pointer to a parser. This pointer is used in subsequent calls
|
|
||||||
** to Parse and ParseFree.
|
|
||||||
*/
|
*/
|
||||||
void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){
|
void ParseInit(void *yypParser){
|
||||||
yyParser *pParser;
|
yyParser *pParser = (yyParser*)yypParser;
|
||||||
pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
|
|
||||||
if( pParser ){
|
|
||||||
#ifdef YYTRACKMAXSTACKDEPTH
|
#ifdef YYTRACKMAXSTACKDEPTH
|
||||||
pParser->yyhwm = 0;
|
pParser->yyhwm = 0;
|
||||||
#endif
|
#endif
|
||||||
@@ -350,9 +338,29 @@ void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){
|
|||||||
pParser->yytos = pParser->yystack;
|
pParser->yytos = pParser->yystack;
|
||||||
pParser->yystack[0].stateno = 0;
|
pParser->yystack[0].stateno = 0;
|
||||||
pParser->yystack[0].major = 0;
|
pParser->yystack[0].major = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef Parse_ENGINEALWAYSONSTACK
|
||||||
|
/*
|
||||||
|
** This function allocates a new parser.
|
||||||
|
** The only argument is a pointer to a function which works like
|
||||||
|
** malloc.
|
||||||
|
**
|
||||||
|
** Inputs:
|
||||||
|
** A pointer to the function used to allocate memory.
|
||||||
|
**
|
||||||
|
** Outputs:
|
||||||
|
** A pointer to a parser. This pointer is used in subsequent calls
|
||||||
|
** to Parse and ParseFree.
|
||||||
|
*/
|
||||||
|
void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){
|
||||||
|
yyParser *pParser;
|
||||||
|
pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
|
||||||
|
if( pParser ) ParseInit(pParser);
|
||||||
return pParser;
|
return pParser;
|
||||||
}
|
}
|
||||||
|
#endif /* Parse_ENGINEALWAYSONSTACK */
|
||||||
|
|
||||||
|
|
||||||
/* The following function deletes the "minor type" or semantic value
|
/* The following function deletes the "minor type" or semantic value
|
||||||
** associated with a symbol. The symbol can be either a terminal
|
** associated with a symbol. The symbol can be either a terminal
|
||||||
@@ -406,6 +414,18 @@ static void yy_pop_parser_stack(yyParser *pParser){
|
|||||||
yy_destructor(pParser, yytos->major, &yytos->minor);
|
yy_destructor(pParser, yytos->major, &yytos->minor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Clear all secondary memory allocations from the parser
|
||||||
|
*/
|
||||||
|
void ParseFinalize(void *p){
|
||||||
|
yyParser *pParser = (yyParser*)p;
|
||||||
|
while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser);
|
||||||
|
#if YYSTACKDEPTH<=0
|
||||||
|
if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef Parse_ENGINEALWAYSONSTACK
|
||||||
/*
|
/*
|
||||||
** Deallocate and destroy a parser. Destructors are called for
|
** Deallocate and destroy a parser. Destructors are called for
|
||||||
** all stack elements before shutting the parser down.
|
** all stack elements before shutting the parser down.
|
||||||
@@ -418,16 +438,13 @@ void ParseFree(
|
|||||||
void *p, /* The parser to be deleted */
|
void *p, /* The parser to be deleted */
|
||||||
void (*freeProc)(void*) /* Function used to reclaim memory */
|
void (*freeProc)(void*) /* Function used to reclaim memory */
|
||||||
){
|
){
|
||||||
yyParser *pParser = (yyParser*)p;
|
|
||||||
#ifndef YYPARSEFREENEVERNULL
|
#ifndef YYPARSEFREENEVERNULL
|
||||||
if( pParser==0 ) return;
|
if( p==0 ) return;
|
||||||
#endif
|
#endif
|
||||||
while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser);
|
ParseFinalize(p);
|
||||||
#if YYSTACKDEPTH<=0
|
(*freeProc)(p);
|
||||||
if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack);
|
|
||||||
#endif
|
|
||||||
(*freeProc)((void*)pParser);
|
|
||||||
}
|
}
|
||||||
|
#endif /* Parse_ENGINEALWAYSONSTACK */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Return the peak depth of the stack for a parser.
|
** Return the peak depth of the stack for a parser.
|
||||||
|
|||||||
Reference in New Issue
Block a user