From: drh <> Date: Wed, 17 Jun 2026 20:11:26 +0000 (+0000) Subject: Small parsing performance improvement by reducing the amount of the X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;p=thirdparty%2Fsqlite.git Small parsing performance improvement by reducing the amount of the Parse object that needs to be initialized. FossilOrigin-Name: 0901b7c2dfb87707fa159f24ada5abb0a2914043c6f0571de4ce55c80edb663b --- diff --git a/manifest b/manifest index 619979f047..e6ef627b84 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sthe\sunnecessary\sParse.szOpAlloc\sfield,\sfor\ssmall\ssize\sreduction\nand\sperformance\simprovement. -D 2026-06-17T19:28:17.082 +C Small\sparsing\sperformance\simprovement\sby\sreducing\sthe\samount\sof\sthe\nParse\sobject\sthat\sneeds\sto\sbe\sinitialized. +D 2026-06-17T20:11:26.655 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -680,7 +680,7 @@ F src/btmutex.c 30dada73a819a1ef5b7583786370dce1842e12e1ad941e4d05ac29695528daea F src/btree.c c9b13797b0b68e0c057ec796976b1ab1e8b4e766d1a7c7f919b2d8a1d2193a80 F src/btree.h e823c46d87f63d904d735a24b76146d19f51f04445ea561f71cc3382fd1307f0 F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886 -F src/build.c 866e584cdf40fbc83f530af9fd4d0991582a6fdbd8a9911b7cdbbea5f26a4a9e +F src/build.c 09946336c3011c2ae2faccdf04e33336e1cd51fd836651be0cd7eb5814f7f6a0 F src/callback.c 3605bbf02bd7ed46c79cd48346db4a32fc51d67624400539c0532f4eead804ad F src/carray.c 3efe3982d5fb323334c29328a4e189ccaef6b95612a6084ad5fa124fd5db1179 F src/complete.c f216b970ce99c5a657556cf1f17e7ddd494515d3beb63df426bf59ff43bd3d9a @@ -697,7 +697,7 @@ F src/hash.c 03c8c0f4be9e8bcb6de65aa26d34a61d48a9430747084a69f9469fbb00ea52ca F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hwtime.h 5cb15147c8583d0fc4748e1c12ea6f38c9deaeefa147a4d8d379fd9bc81fee9a F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 8dbc22f6ddcc5f0af3abf11daeb89b1978f00059cda15ebc61251fa7724fc7ee +F src/insert.c e6e9b574b4863649e2c433f2260f226183e697df1ab73fcb8da9a85d5abcd390 F src/json.c f058c449acb9fdb1d3d1bb9f7e97b225ba773f5b6fdcec4310d3f49980125ed4 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 78d5b06f18996ffa1203129b28fea043f63a87a4117539678f1d761c30b4ff65 @@ -732,7 +732,7 @@ F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 F src/pcache.h 092b758d2c5e4dabb30eae46d8dfad77c0f70b16bf3ff1943f7a232b0fe0d4ba F src/pcache1.c d7ee0f95992501a65379f620b3de1430b64e52e397769938668a9fd9dd1c8145 F src/pragma.c 789ef67117b74b5be0a2db6681f7f0c55e6913791b9da309aefd280de2c8a74d -F src/prepare.c 084a037fd3810cb7ffbfc001cd58c0ffac68ba36598a5084b55ea2a090014ebd +F src/prepare.c d055c59c23b917367ed199a52888132316aa9cb9f7653ca71f0c45bd267206fd F src/printf.c 1b3d26ed8ea9a900317832625d5e83b833c7cf14640d7d98a2c235e172b6fefc F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c d0724113da9f5c0430d2052808ce59519f51ae7c4fbb1f5ef21fe3a832956086 @@ -742,7 +742,7 @@ F src/shell.c.in a4e83895cfa336065ad7f7a7dea8fc2a19d050f7ce7466621c67208acaac9e4 F src/sqlite.h.in 740636d37edf1ed4a64378989e48ccfad169008aac250330f982e14aaf1d599b F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 F src/sqlite3ext.h 9788c301f95370fa30e808861f1d2e6f022a816ddbe2a4f67486784c1b31db2e -F src/sqliteInt.h 2020077a20fcf1a0cc00d7e5e44cb18c2478f64062749d4f99a046356822dd0c +F src/sqliteInt.h bda082da71e9e93cefadd169860b857c422182503d1e6122159258b17332636b F src/sqliteLimit.h c70656b67ab5b96741a8f1c812bdd80c81f2b1c1e443d0cc3ea8c33bb1f1a092 F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -2208,8 +2208,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P f786f3643e410e862568777ea021afa47c924348e511a83e7e9000cf14bec534 -R 4c04be80f7283503d9c998bde86c0621 +P 9a2a230464e4314033e67e602dbd9f554f50ec2eefc7b1a5f05b85249591f7b8 +R 3e384d65478445df469474d5aca56dc8 U drh -Z ca70ffa427e0a2aecfc80c727849b21e +Z 2d3fe8709be4d5f796426b45f7c01cfe # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d621b9a5b9..17769c363b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a2a230464e4314033e67e602dbd9f554f50ec2eefc7b1a5f05b85249591f7b8 +0901b7c2dfb87707fa159f24ada5abb0a2914043c6f0571de4ce55c80edb663b diff --git a/src/build.c b/src/build.c index d9ef6e6e49..7c6b818dba 100644 --- a/src/build.c +++ b/src/build.c @@ -70,6 +70,7 @@ static SQLITE_NOINLINE void lockTable( assert( pToplevel->nTableLock < 0x7fff0000 ); nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1); + if( pToplevel->nTableLock==0 ) pToplevel->aTableLock = 0; pToplevel->aTableLock = sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes); if( pToplevel->aTableLock ){ @@ -236,7 +237,7 @@ void sqlite3FinishCoding(Parse *pParse){ /* Initialize any AUTOINCREMENT data structures required. */ - if( pParse->pAinc ) sqlite3AutoincrementBegin(pParse); + if( pParse->usesAinc ) sqlite3AutoincrementBegin(pParse); /* Code constant expressions that were factored out of inner loops. */ @@ -269,7 +270,7 @@ void sqlite3FinishCoding(Parse *pParse){ if( pParse->nErr==0 ){ /* A minimum of one cursor is required if autoincrement is used * See ticket [a696379c1f08866] */ - assert( pParse->pAinc==0 || pParse->nTab>0 ); + assert( pParse->usesAinc==0 || pParse->nTab>0 ); sqlite3VdbeMakeReady(v, pParse); pParse->rc = SQLITE_DONE; }else{ diff --git a/src/insert.c b/src/insert.c index e20f646321..61aabc6617 100644 --- a/src/insert.c +++ b/src/insert.c @@ -433,6 +433,9 @@ static int autoIncBegin( return 0; } + if( pToplevel->usesAinc==0 ){ + pToplevel->pAinc = 0; + } pInfo = pToplevel->pAinc; while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; } if( pInfo==0 ){ @@ -442,6 +445,7 @@ static int autoIncBegin( if( pParse->db->mallocFailed ) return 0; pInfo->pNext = pToplevel->pAinc; pToplevel->pAinc = pInfo; + pToplevel->usesAinc = 1; pInfo->pTab = pTab; pInfo->iDb = iDb; pToplevel->nMem++; /* Register to hold name of table */ @@ -470,6 +474,7 @@ void sqlite3AutoincrementBegin(Parse *pParse){ assert( sqlite3IsToplevel(pParse) ); assert( v ); /* We failed long ago if this is not so */ + assert( pParse->usesAinc ); for(p = pParse->pAinc; p; p = p->pNext){ static const int iLn = VDBE_OFFSET_LINENO(2); static const VdbeOpList autoInc[] = { @@ -537,6 +542,7 @@ static SQLITE_NOINLINE void autoIncrementEnd(Parse *pParse){ sqlite3 *db = pParse->db; assert( v ); + assert( pParse->usesAinc ); for(p = pParse->pAinc; p; p = p->pNext){ static const int iLn = VDBE_OFFSET_LINENO(2); static const VdbeOpList autoIncEnd[] = { @@ -569,7 +575,7 @@ static SQLITE_NOINLINE void autoIncrementEnd(Parse *pParse){ } } void sqlite3AutoincrementEnd(Parse *pParse){ - if( pParse->pAinc ) autoIncrementEnd(pParse); + if( pParse->usesAinc ) autoIncrementEnd(pParse); } #else /* diff --git a/src/prepare.c b/src/prepare.c index 4d1295821d..29be827cc4 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -581,7 +581,7 @@ void sqlite3ParseObjectReset(Parse *pParse){ assert( db->pParse==pParse ); assert( pParse->nested==0 ); #ifndef SQLITE_OMIT_SHARED_CACHE - if( pParse->aTableLock ) sqlite3DbNNFreeNN(db, pParse->aTableLock); + if( pParse->nTableLock ) sqlite3DbNNFreeNN(db, pParse->aTableLock); #endif while( pParse->pCleanup ){ ParseCleanup *pCleanup = pParse->pCleanup; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 41ac01089f..2082c7ad2f 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3911,6 +3911,7 @@ struct Parse { bft bHasWith :1; /* True if statement contains WITH */ bft okConstFactor:1; /* OK to factor out constants */ bft checkSchema :1; /* Causes schema cookie check after an error */ + bft usesAinc :1; /* True if pAinc is valid */ int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ int nErr; /* Number of errors seen */ @@ -3934,9 +3935,7 @@ struct Parse { #endif #ifndef SQLITE_OMIT_SHARED_CACHE int nTableLock; /* Number of locks in aTableLock */ - TableLock *aTableLock; /* Required table locks for shared-cache mode */ #endif - AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ Parse *pToplevel; /* Parse structure for main program (or NULL) */ Table *pTriggerTab; /* Table triggers are being coded for */ TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */ @@ -3965,6 +3964,13 @@ struct Parse { Returning *pReturning; /* The RETURNING clause */ } d; } u1; + AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters. Only + ** valid if Parse.usesAinc is true */ +#ifndef SQLITE_OMIT_SHARED_CACHE + TableLock *aTableLock; /* Required table locks for shared-cache mode. Only + ** valid if Parse.nTableLock>0 */ +#endif + /************************************************************************ ** Above is constant between recursions. Below is reset before and after