1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Slightly smaller and faster by allocating Parser objects on the stack.

FossilOrigin-Name: 436a89b91901851ce21bf0cb997291b48888c52788b904822083d8dfac32b84b
This commit is contained in:
drh
2017-08-01 20:59:41 +00:00
parent 86b40dfd33
commit 6903bf6d49
5 changed files with 74 additions and 86 deletions

View File

@@ -1,5 +1,5 @@
C Split\sthe\sOP_Last\sopcode\sinto\sOP_Last\sand\sOP_SeekEnd.\s\sUse\sOP_SeekEnd\sto\nposition\sa\scursor\sprior\sto\sappending.\s\sTicket\s[cb91bf4290c211d]. C Slightly\ssmaller\sand\sfaster\sby\sallocating\sParser\sobjects\son\sthe\sstack.
D 2017-08-01T19:53:43.985 D 2017-08-01T20:59:41.114
F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016
@@ -447,7 +447,7 @@ F src/pcache.h 521bb9610d38ef17a3cc9b5ddafd4546c2ea67fa3d0e464823d73c2a28d50e11
F src/pcache1.c 1195a21fe28e223e024f900b2011e80df53793f0356a24caace4188b098540dc F src/pcache1.c 1195a21fe28e223e024f900b2011e80df53793f0356a24caace4188b098540dc
F src/pragma.c cd6aeda3587be6c5c08f9b2d45eae6068666a03c9d077c8c43cdb85fb0aa70f2 F src/pragma.c cd6aeda3587be6c5c08f9b2d45eae6068666a03c9d077c8c43cdb85fb0aa70f2
F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324 F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
F src/prepare.c 1eaeccc1f9dd5b2806408e530c0f05a1972272b66d827d0a7fdc2b192b357ead F src/prepare.c 3cbb99757d7295997674972f9dd2331c5c544368854ca08954c9beb1e9b6145a
F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2 F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20 F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20
@@ -525,11 +525,11 @@ F src/vdbe.h d50cadf12bcf9fb99117ef392ce1ea283aa429270481426b6e8b0280c101fd97
F src/vdbeInt.h ff2b7db0968d20e6184aee256d2e535d565f5a172e3588a78adb166a41fc4911 F src/vdbeInt.h ff2b7db0968d20e6184aee256d2e535d565f5a172e3588a78adb166a41fc4911
F src/vdbeapi.c 0823531191f9d5588a245ed5b39306798681814e9e8099d54a3213a13a28fbe7 F src/vdbeapi.c 0823531191f9d5588a245ed5b39306798681814e9e8099d54a3213a13a28fbe7
F src/vdbeaux.c 3fe68bad02b33b09e08bdc0ad90d6b92b3d571f7864c3d047abca1bde050751c F src/vdbeaux.c 3fe68bad02b33b09e08bdc0ad90d6b92b3d571f7864c3d047abca1bde050751c
F src/vdbeblob.c 359891617358deefc85bef7bcf787fa6b77facb9 F src/vdbeblob.c db3cf91060f6f4b2f1358a4200e844697990752177784c7c95da00b7ac9f1c7b
F src/vdbemem.c 9ca2854976f35db40341977e688a08204c96427505f5b90215dc7970f6ea42c4 F src/vdbemem.c 9ca2854976f35db40341977e688a08204c96427505f5b90215dc7970f6ea42c4
F src/vdbesort.c f512c68d0bf7e0105316a5594c4329358c8ee9cae3b25138df041d97516c0372 F src/vdbesort.c f512c68d0bf7e0105316a5594c4329358c8ee9cae3b25138df041d97516c0372
F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834 F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834
F src/vtab.c 35b9bdc2b41de32a417141d12097bcc4e29a77ed7cdb8f836d1d2305d946b61b F src/vtab.c a305582d3a6c7090982ac1610b8e5724fa954d8b28899fa6c633cb4de9c2f8ee
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c 40c543f0a2195d1b0dc88ef12142bea690009344 F src/wal.c 40c543f0a2195d1b0dc88ef12142bea690009344
F src/wal.h 06b2a0b599cc0f53ea97f497cf8c6b758c999f71 F src/wal.h 06b2a0b599cc0f53ea97f497cf8c6b758c999f71
@@ -1640,7 +1640,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 24190b221f73472dafaead6de101b4debc2c91c1ca28d70b45a38df5bb61fb39 P 3e02474c7bbe16891a7cfc8771cf72f64cd2c0692779037982d7d307512a4f23
R e20c96636649f5a0133f10107f6b5f8c R 35dd6f122e0eccef84c52104465fc373
U drh U drh
Z 860ec7307cf1110562833040172ad143 Z f4141e1f5aaa0f85940bd20cb4d51443

View File

@@ -1 +1 @@
3e02474c7bbe16891a7cfc8771cf72f64cd2c0692779037982d7d307512a4f23 436a89b91901851ce21bf0cb997291b48888c52788b904822083d8dfac32b84b

View File

@@ -494,16 +494,14 @@ int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){
** Free all memory allocations in the pParse object ** Free all memory allocations in the pParse object
*/ */
void sqlite3ParserReset(Parse *pParse){ void sqlite3ParserReset(Parse *pParse){
if( pParse ){ sqlite3 *db = pParse->db;
sqlite3 *db = pParse->db; sqlite3DbFree(db, pParse->aLabel);
sqlite3DbFree(db, pParse->aLabel); sqlite3ExprListDelete(db, pParse->pConstExpr);
sqlite3ExprListDelete(db, pParse->pConstExpr); if( db ){
if( db ){ assert( db->lookaside.bDisable >= pParse->disableLookaside );
assert( db->lookaside.bDisable >= pParse->disableLookaside ); db->lookaside.bDisable -= pParse->disableLookaside;
db->lookaside.bDisable -= pParse->disableLookaside;
}
pParse->disableLookaside = 0;
} }
pParse->disableLookaside = 0;
} }
/* /*

View File

@@ -129,8 +129,8 @@ int sqlite3_blob_open(
int rc = SQLITE_OK; int rc = SQLITE_OK;
char *zErr = 0; char *zErr = 0;
Table *pTab; Table *pTab;
Parse *pParse = 0;
Incrblob *pBlob = 0; Incrblob *pBlob = 0;
Parse sParse;
#ifdef SQLITE_ENABLE_API_ARMOR #ifdef SQLITE_ENABLE_API_ARMOR
if( ppBlob==0 ){ if( ppBlob==0 ){
@@ -148,37 +148,34 @@ int sqlite3_blob_open(
sqlite3_mutex_enter(db->mutex); sqlite3_mutex_enter(db->mutex);
pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob)); pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob));
if( !pBlob ) goto blob_open_out;
pParse = sqlite3StackAllocRaw(db, sizeof(*pParse));
if( !pParse ) goto blob_open_out;
do { do {
memset(pParse, 0, sizeof(Parse)); memset(&sParse, 0, sizeof(Parse));
pParse->db = db; if( !pBlob ) goto blob_open_out;
sParse.db = db;
sqlite3DbFree(db, zErr); sqlite3DbFree(db, zErr);
zErr = 0; zErr = 0;
sqlite3BtreeEnterAll(db); sqlite3BtreeEnterAll(db);
pTab = sqlite3LocateTable(pParse, 0, zTable, zDb); pTab = sqlite3LocateTable(&sParse, 0, zTable, zDb);
if( pTab && IsVirtual(pTab) ){ if( pTab && IsVirtual(pTab) ){
pTab = 0; pTab = 0;
sqlite3ErrorMsg(pParse, "cannot open virtual table: %s", zTable); sqlite3ErrorMsg(&sParse, "cannot open virtual table: %s", zTable);
} }
if( pTab && !HasRowid(pTab) ){ if( pTab && !HasRowid(pTab) ){
pTab = 0; pTab = 0;
sqlite3ErrorMsg(pParse, "cannot open table without rowid: %s", zTable); sqlite3ErrorMsg(&sParse, "cannot open table without rowid: %s", zTable);
} }
#ifndef SQLITE_OMIT_VIEW #ifndef SQLITE_OMIT_VIEW
if( pTab && pTab->pSelect ){ if( pTab && pTab->pSelect ){
pTab = 0; pTab = 0;
sqlite3ErrorMsg(pParse, "cannot open view: %s", zTable); sqlite3ErrorMsg(&sParse, "cannot open view: %s", zTable);
} }
#endif #endif
if( !pTab ){ if( !pTab ){
if( pParse->zErrMsg ){ if( sParse.zErrMsg ){
sqlite3DbFree(db, zErr); sqlite3DbFree(db, zErr);
zErr = pParse->zErrMsg; zErr = sParse.zErrMsg;
pParse->zErrMsg = 0; sParse.zErrMsg = 0;
} }
rc = SQLITE_ERROR; rc = SQLITE_ERROR;
sqlite3BtreeLeaveAll(db); sqlite3BtreeLeaveAll(db);
@@ -242,7 +239,7 @@ int sqlite3_blob_open(
} }
} }
pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(pParse); pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(&sParse);
assert( pBlob->pStmt || db->mallocFailed ); assert( pBlob->pStmt || db->mallocFailed );
if( pBlob->pStmt ){ if( pBlob->pStmt ){
@@ -315,10 +312,10 @@ int sqlite3_blob_open(
aOp[1].p4.i = pTab->nCol+1; aOp[1].p4.i = pTab->nCol+1;
aOp[3].p2 = pTab->nCol; aOp[3].p2 = pTab->nCol;
pParse->nVar = 0; sParse.nVar = 0;
pParse->nMem = 1; sParse.nMem = 1;
pParse->nTab = 1; sParse.nTab = 1;
sqlite3VdbeMakeReady(v, pParse); sqlite3VdbeMakeReady(v, &sParse);
} }
} }
@@ -340,8 +337,7 @@ blob_open_out:
} }
sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr);
sqlite3DbFree(db, zErr); sqlite3DbFree(db, zErr);
sqlite3ParserReset(pParse); sqlite3ParserReset(&sParse);
sqlite3StackFree(db, pParse);
rc = sqlite3ApiExit(db, rc); rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex); sqlite3_mutex_leave(db->mutex);
return rc; return rc;

View File

@@ -733,10 +733,10 @@ int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){
*/ */
int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
VtabCtx *pCtx; VtabCtx *pCtx;
Parse *pParse;
int rc = SQLITE_OK; int rc = SQLITE_OK;
Table *pTab; Table *pTab;
char *zErr = 0; char *zErr = 0;
Parse sParse;
#ifdef SQLITE_ENABLE_API_ARMOR #ifdef SQLITE_ENABLE_API_ARMOR
if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){ if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){
@@ -753,55 +753,49 @@ int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
pTab = pCtx->pTab; pTab = pCtx->pTab;
assert( IsVirtual(pTab) ); assert( IsVirtual(pTab) );
pParse = sqlite3StackAllocZero(db, sizeof(*pParse)); memset(&sParse, 0, sizeof(sParse));
if( pParse==0 ){ sParse.declareVtab = 1;
rc = SQLITE_NOMEM_BKPT; sParse.db = db;
}else{ sParse.nQueryLoop = 1;
pParse->declareVtab = 1; if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr)
pParse->db = db; && sParse.pNewTable
pParse->nQueryLoop = 1; && !db->mallocFailed
&& !sParse.pNewTable->pSelect
if( SQLITE_OK==sqlite3RunParser(pParse, zCreateTable, &zErr) && !IsVirtual(sParse.pNewTable)
&& pParse->pNewTable ){
&& !db->mallocFailed if( !pTab->aCol ){
&& !pParse->pNewTable->pSelect Table *pNew = sParse.pNewTable;
&& !IsVirtual(pParse->pNewTable) Index *pIdx;
){ pTab->aCol = pNew->aCol;
if( !pTab->aCol ){ pTab->nCol = pNew->nCol;
Table *pNew = pParse->pNewTable; pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid);
Index *pIdx; pNew->nCol = 0;
pTab->aCol = pNew->aCol; pNew->aCol = 0;
pTab->nCol = pNew->nCol; assert( pTab->pIndex==0 );
pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid); if( !HasRowid(pNew) && pCtx->pVTable->pMod->pModule->xUpdate!=0 ){
pNew->nCol = 0; rc = SQLITE_ERROR;
pNew->aCol = 0; }
assert( pTab->pIndex==0 ); pIdx = pNew->pIndex;
if( !HasRowid(pNew) && pCtx->pVTable->pMod->pModule->xUpdate!=0 ){ if( pIdx ){
rc = SQLITE_ERROR; assert( pIdx->pNext==0 );
} pTab->pIndex = pIdx;
pIdx = pNew->pIndex; pNew->pIndex = 0;
if( pIdx ){ pIdx->pTable = pTab;
assert( pIdx->pNext==0 );
pTab->pIndex = pIdx;
pNew->pIndex = 0;
pIdx->pTable = pTab;
}
} }
pCtx->bDeclared = 1;
}else{
sqlite3ErrorWithMsg(db, SQLITE_ERROR, (zErr ? "%s" : 0), zErr);
sqlite3DbFree(db, zErr);
rc = SQLITE_ERROR;
} }
pParse->declareVtab = 0; pCtx->bDeclared = 1;
}else{
if( pParse->pVdbe ){ sqlite3ErrorWithMsg(db, SQLITE_ERROR, (zErr ? "%s" : 0), zErr);
sqlite3VdbeFinalize(pParse->pVdbe); sqlite3DbFree(db, zErr);
} rc = SQLITE_ERROR;
sqlite3DeleteTable(db, pParse->pNewTable);
sqlite3ParserReset(pParse);
sqlite3StackFree(db, pParse);
} }
sParse.declareVtab = 0;
if( sParse.pVdbe ){
sqlite3VdbeFinalize(sParse.pVdbe);
}
sqlite3DeleteTable(db, sParse.pNewTable);
sqlite3ParserReset(&sParse);
assert( (rc&0xff)==rc ); assert( (rc&0xff)==rc );
rc = sqlite3ApiExit(db, rc); rc = sqlite3ApiExit(db, rc);