Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8ed265c9e6 | |||
| 76190ef856 |
@@ -234,6 +234,8 @@ SRC = \
|
||||
$(TOP)/src/insert.c \
|
||||
$(TOP)/src/legacy.c \
|
||||
$(TOP)/src/loadext.c \
|
||||
$(TOP)/src/lookaside.c \
|
||||
$(TOP)/src/lookaside.h \
|
||||
$(TOP)/src/main.c \
|
||||
$(TOP)/src/malloc.c \
|
||||
$(TOP)/src/mem0.c \
|
||||
@@ -525,6 +527,7 @@ HDR = \
|
||||
$(TOP)/src/hash.h \
|
||||
$(TOP)/src/hwtime.h \
|
||||
keywordhash.h \
|
||||
$(TOP)/src/lookaside.h \
|
||||
$(TOP)/src/msvc.h \
|
||||
$(TOP)/src/mutex.h \
|
||||
opcodes.h \
|
||||
@@ -869,6 +872,9 @@ legacy.lo: $(TOP)/src/legacy.c $(HDR)
|
||||
loadext.lo: $(TOP)/src/loadext.c $(HDR)
|
||||
$(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/loadext.c
|
||||
|
||||
lookaside.lo: $(TOP)/src/lookaside.c $(HDR)
|
||||
$(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/lookaside.c
|
||||
|
||||
main.lo: $(TOP)/src/main.c $(HDR)
|
||||
$(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/main.c
|
||||
|
||||
|
||||
@@ -1290,6 +1290,7 @@ SRC00 = \
|
||||
$(TOP)\src\insert.c \
|
||||
$(TOP)\src\legacy.c \
|
||||
$(TOP)\src\loadext.c \
|
||||
$(TOP)\src\lookaside.c \
|
||||
$(TOP)\src\main.c \
|
||||
$(TOP)\src\malloc.c \
|
||||
$(TOP)\src\mem0.c \
|
||||
@@ -1360,6 +1361,7 @@ SRC04 = \
|
||||
$(TOP)\src\btreeInt.h \
|
||||
$(TOP)\src\hash.h \
|
||||
$(TOP)\src\hwtime.h \
|
||||
$(TOP)\src\lookaside.h \
|
||||
$(TOP)\src\msvc.h \
|
||||
$(TOP)\src\mutex.h \
|
||||
$(TOP)\src\os.h \
|
||||
@@ -1580,6 +1582,7 @@ HDR = \
|
||||
$(TOP)\src\btreeInt.h \
|
||||
$(TOP)\src\hash.h \
|
||||
$(TOP)\src\hwtime.h \
|
||||
$(TOP)\src\lookaside.h \
|
||||
keywordhash.h \
|
||||
$(TOP)\src\msvc.h \
|
||||
$(TOP)\src\mutex.h \
|
||||
@@ -1961,6 +1964,9 @@ legacy.lo: $(TOP)\src\legacy.c $(HDR)
|
||||
loadext.lo: $(TOP)\src\loadext.c $(HDR)
|
||||
$(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\loadext.c
|
||||
|
||||
lookaside.lo: $(TOP)\src\lookaside.c $(HDR)
|
||||
$(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\lookaside.c
|
||||
|
||||
main.lo: $(TOP)\src\main.c $(HDR)
|
||||
$(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\main.c
|
||||
|
||||
|
||||
@@ -111,6 +111,8 @@ SRC = \
|
||||
$(TOP)/src/insert.c \
|
||||
$(TOP)/src/legacy.c \
|
||||
$(TOP)/src/loadext.c \
|
||||
$(TOP)/src/lookaside.c \
|
||||
$(TOP)/src/lookaside.h \
|
||||
$(TOP)/src/main.c \
|
||||
$(TOP)/src/malloc.c \
|
||||
$(TOP)/src/mem0.c \
|
||||
@@ -443,6 +445,7 @@ HDR = \
|
||||
$(TOP)/src/hash.h \
|
||||
$(TOP)/src/hwtime.h \
|
||||
keywordhash.h \
|
||||
$(TOP)/src/lookaside.h \
|
||||
$(TOP)/src/msvc.h \
|
||||
$(TOP)/src/mutex.h \
|
||||
opcodes.h \
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
C An\simproved\sfix\sfor\sthe\sdbsqlfuzz-discovered\sALWAYS()\sfailure\sfollowing\sOOM\sin\nsqlite3ExprCollSeq().\s\sThis\stime\swith\sa\stest\scase\s(engineered\sby\sDan).
|
||||
D 2019-10-09T15:37:58.973
|
||||
C Merge\srecent\sfixes\sand\senhancements\sfrom\strunk.
|
||||
D 2019-10-09T17:38:56.137
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
F Makefile.in bf24a9abbb277afa2fbe6bac80a181f22be6c48de771cd260c9851ecf6165dc1
|
||||
F Makefile.in d7f9d10aac33fd23e156e27301baca94656ca3f509111cadcd3cfef1486f2dca
|
||||
F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241
|
||||
F Makefile.msc c7e3548d5c9dc12bedf47366ca3f1438196f635d81f08fda44c6c1f290c4bcf8
|
||||
F Makefile.msc 9224f40ade70b77a55fb386a2dae8d04a4395432c3b9ba7884a8acd933c46b71
|
||||
F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a
|
||||
F VERSION 4c516d84c2a5f26c477ed34c09ac4136630f71c68139631f2eb591b22eea7cf1
|
||||
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
|
||||
@@ -447,7 +447,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6
|
||||
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
|
||||
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
|
||||
F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
|
||||
F main.mk 7ce055f3df31a4f7d21e38f493f907c21db1f673863a573e231f55e2ab005023
|
||||
F main.mk 57097ab23e6b0cccb7fcd35ffbbdbda037316887881507c58a0f115af6ec37cb
|
||||
F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
|
||||
F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
|
||||
F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
|
||||
@@ -460,7 +460,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
|
||||
F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
|
||||
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
|
||||
F src/alter.c 5773b28684a001dcab45adcefa3cbf5e846335c0c8fee0da8a3770cb0123bba8
|
||||
F src/analyze.c 481d9cf34a3c70631ef5c416be70033e8d4cd85eb5ad1b37286aed8b0e29e889
|
||||
F src/analyze.c 777b22900cfcbb1e87f73b09ac45986c91ed76beea0442cf55fce7eb2bba4228
|
||||
F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed
|
||||
F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06
|
||||
F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab
|
||||
@@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
|
||||
F src/btree.c fdc4389b271bca30138db27dc2dfb9f52c2a7baaa44845aaf31a3c54663d837f
|
||||
F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89
|
||||
F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f
|
||||
F src/build.c 13de2fdabbabcf2e2aaf6443a049fb851d9d3170136c08345468e158ceea3dc6
|
||||
F src/build.c 804fd944dde39ae429a913541091785eede543ad6fdbef3eafbb3224c9c329d7
|
||||
F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73
|
||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||
F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251
|
||||
@@ -479,7 +479,7 @@ F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319
|
||||
F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf
|
||||
F src/expr.c 3f4dcbe7cb6644652c2d12b7fa5c9087965229c515e65070cbe99f100c2f2e5f
|
||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||
F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50
|
||||
F src/fkey.c 48921db21c10b7857efe8a9f4dd9dbe7fe931df3eaea0913629e8512924fc8ef
|
||||
F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12
|
||||
F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798
|
||||
F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19
|
||||
@@ -489,8 +489,10 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
|
||||
F src/insert.c 40557ebd69f4115e7a273f9304a8ab637a47ce44f3c6923396928f023967b5e8
|
||||
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
|
||||
F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d
|
||||
F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66
|
||||
F src/malloc.c b7640bcf8992cf2e98447da0d27e372abdc4621a6760418bad6d1470f041ada9
|
||||
F src/lookaside.c 3d569191e4f177153524eb376ac18ada6ab49430c15c392291aed033bd7a3203
|
||||
F src/lookaside.h 088106f3dc9933f7e9f3570eff86ef29e762ba351027cac733c866a4a5b6244c
|
||||
F src/main.c 5771725469dcb97667c647ebd8192073c925d13efdd46f94a84738187fa0a0bb
|
||||
F src/malloc.c 7b36b39aae0da3a9253ae5c7396831e45b2afb342a9f22a4afa314fe7e492c9d
|
||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||
F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
|
||||
F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3
|
||||
@@ -514,25 +516,25 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7
|
||||
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
||||
F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b
|
||||
F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3
|
||||
F src/parse.y 19c8b65c87a5bec5efcb7eaf44e3178d860bc77baab4b03d7b53b08369ac83bf
|
||||
F src/parse.y 916f6f75b929b13fe26b18023a80b9085893ef3f6483611489b5185d7df2d3bf
|
||||
F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177
|
||||
F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
|
||||
F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848
|
||||
F src/pragma.c b47bc7db02ab13d04c680aee424466b4e34f4ef5aa7b2e464876ec005806f98f
|
||||
F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75
|
||||
F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057
|
||||
F src/prepare.c 4d267e595a317a9a8564800f086700a5b0d82ed3bbf75ed703453e6ae43e8606
|
||||
F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
|
||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||
F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00
|
||||
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
|
||||
F src/select.c f509982c96bb24ccf57a0155fbe1e6184e0b8fb8866a04397dc41baa400e5240
|
||||
F src/select.c fd56dee1f38362ba6a1c2b8f07ca4a73e2a195d5b16d562d4264a7cfa061ceeb
|
||||
F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e274
|
||||
F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31
|
||||
F src/sqliteInt.h b70ac8e3e7e74838bc45dca1a3b2c3ef4b4e04a49036448bf462cfd657cc663f
|
||||
F src/sqliteInt.h 2ce2d769c4accccc58df69de32f935585086e205bb17730ea6f72c11f43dd938
|
||||
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
||||
F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
|
||||
F src/status.c 364babdad7295c0219b398468e0a24374f6e1bf27906837be347ea0538148ce2
|
||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||
F src/tclsqlite.c 50c93be3e1c03b4e6cf6756e5197afcfe7f5cd0497d83a7ac317cde09e19b290
|
||||
F src/test1.c 17e1395cbddeb9226b756d723a7566b45b43b99a5f9f55afb4ff70888de6ad6f
|
||||
@@ -1783,10 +1785,10 @@ F tool/mkpragmatab.tcl f115d63ada8171f9da28dc8e34e043a1a159692d46b89f66b6e681140
|
||||
F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712
|
||||
F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b
|
||||
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
|
||||
F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f
|
||||
F tool/mksqlite3c.tcl 5fed3d75069d8f66f202d3b5200b0cea4aa7108481acd06732a06fdd42eb83a2
|
||||
F tool/mksqlite3c-noext.tcl ed9eee26b0a54d38b15e56a8dba7936369306b8b3b359fb13269cfd3bb8df764
|
||||
F tool/mksqlite3c.tcl bba4605f267e5884fc8213f1d0b49b4670c6a0852c8e5186bd0b39f8005c9c67
|
||||
F tool/mksqlite3h.tcl 080873e3856eceb9d289a08a00c4b30f875ea3feadcbece796bd509b1532792c
|
||||
F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b
|
||||
F tool/mksqlite3internalh.tcl dd425d58d29dedabe24246ed61dd6c0bfd7d9458ca05bb3b9acb46453a043947
|
||||
F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5
|
||||
F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091
|
||||
F tool/omittest.tcl 27f9413c3343bac200a28d81e8234adb0f5e141c4771893cb19b40235a91f1e0
|
||||
@@ -1846,8 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 75775c5ab44e497cb19be10397229637f1374f05c3244e8f92d6c54fcea94f5f
|
||||
Q -01ba4641ab436c6065c8725908fc0913f2abded4ea62e004b7534e0116b9451a
|
||||
R 46052c64c579bf3fda5dd04a558500b4
|
||||
P 5ba8cee8f710eb2a6844d5de0d975c207e5645754e30211a4cb5a4869248b693 907f7965b335d8d5441f2e386bb190d1f93ffcd45ca98d2d1c621dede491fc5e
|
||||
R a61ffa3a3938c973c9604e15b466ae5c
|
||||
U drh
|
||||
Z cca2984ae5fcf8dec44abaa439367b12
|
||||
Z 5fdd027d7167a6e0b3c7253d67bed640
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
907f7965b335d8d5441f2e386bb190d1f93ffcd45ca98d2d1c621dede491fc5e
|
||||
553258c2ed85cb3a539d7562bf6fcf58bb601a7c459e408a2188794ea4bb2f2c
|
||||
+5
-4
@@ -141,6 +141,7 @@
|
||||
*/
|
||||
#ifndef SQLITE_OMIT_ANALYZE
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
|
||||
#if defined(SQLITE_ENABLE_STAT4)
|
||||
# define IsStat4 1
|
||||
@@ -1662,7 +1663,7 @@ static int loadStatTbl(
|
||||
Index *pPrevIdx = 0; /* Previous index in the loop */
|
||||
IndexSample *pSample; /* A slot in pIdx->aSample[] */
|
||||
|
||||
assert( db->lookaside.bDisable );
|
||||
assert( sqlite3LookasideDisabled(&db->lookaside) );
|
||||
zSql = sqlite3MPrintf(db, zSql1, zDb);
|
||||
if( !zSql ){
|
||||
return SQLITE_NOMEM_BKPT;
|
||||
@@ -1773,7 +1774,7 @@ static int loadStatTbl(
|
||||
static int loadStat4(sqlite3 *db, const char *zDb){
|
||||
int rc = SQLITE_OK; /* Result codes from subroutines */
|
||||
|
||||
assert( db->lookaside.bDisable );
|
||||
assert( sqlite3LookasideDisabled(&db->lookaside) );
|
||||
if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){
|
||||
rc = loadStatTbl(db,
|
||||
"SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx",
|
||||
@@ -1854,9 +1855,9 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
|
||||
/* Load the statistics from the sqlite_stat4 table. */
|
||||
#ifdef SQLITE_ENABLE_STAT4
|
||||
if( rc==SQLITE_OK ){
|
||||
DisableLookaside;
|
||||
sqlite3LookasideDisable(&db->lookaside);
|
||||
rc = loadStat4(db, sInfo.zDatabase);
|
||||
EnableLookaside;
|
||||
sqlite3LookasideEnable(&db->lookaside);
|
||||
}
|
||||
for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){
|
||||
Index *pIdx = sqliteHashData(i);
|
||||
|
||||
+3
-2
@@ -23,6 +23,7 @@
|
||||
** ROLLBACK
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
|
||||
#ifndef SQLITE_OMIT_SHARED_CACHE
|
||||
/*
|
||||
@@ -626,7 +627,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
|
||||
** that no lookaside memory is used in this case either. */
|
||||
int nLookaside = 0;
|
||||
if( db && !db->mallocFailed && (pTable->tabFlags & TF_Ephemeral)==0 ){
|
||||
nLookaside = sqlite3LookasideUsed(db, 0);
|
||||
nLookaside = sqlite3LookasideUsed(&db->lookaside, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -662,7 +663,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
|
||||
sqlite3DbFree(db, pTable);
|
||||
|
||||
/* Verify that no lookaside memory was used by schema tables */
|
||||
assert( nLookaside==0 || nLookaside==sqlite3LookasideUsed(db,0) );
|
||||
assert( nLookaside==0 || nLookaside==sqlite3LookasideUsed(&db->lookaside,0) );
|
||||
}
|
||||
void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
|
||||
/* Do not delete the table until the reference count reaches zero. */
|
||||
|
||||
+3
-2
@@ -12,6 +12,7 @@
|
||||
** support to compiled SQL statements.
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
|
||||
#ifndef SQLITE_OMIT_FOREIGN_KEY
|
||||
#ifndef SQLITE_OMIT_TRIGGER
|
||||
@@ -1299,7 +1300,7 @@ static Trigger *fkActionTrigger(
|
||||
}
|
||||
|
||||
/* Disable lookaside memory allocation */
|
||||
DisableLookaside;
|
||||
sqlite3LookasideDisable(&db->lookaside);
|
||||
|
||||
pTrigger = (Trigger *)sqlite3DbMallocZero(db,
|
||||
sizeof(Trigger) + /* struct Trigger */
|
||||
@@ -1321,7 +1322,7 @@ static Trigger *fkActionTrigger(
|
||||
}
|
||||
|
||||
/* Re-enable the lookaside buffer, if it was disabled earlier. */
|
||||
EnableLookaside;
|
||||
sqlite3LookasideEnable(&db->lookaside);
|
||||
|
||||
sqlite3ExprDelete(db, pWhere);
|
||||
sqlite3ExprDelete(db, pWhen);
|
||||
|
||||
+303
@@ -0,0 +1,303 @@
|
||||
/*
|
||||
** 2019-10-02
|
||||
**
|
||||
** The author disclaims copyright to this source code. In place of
|
||||
** a legal notice, here is a blessing:
|
||||
**
|
||||
** May you do good and not evil.
|
||||
** May you find forgiveness for yourself and forgive others.
|
||||
** May you share freely, never taking more than you give.
|
||||
**
|
||||
*************************************************************************
|
||||
**
|
||||
** Lookaside memory allocation functions used throughout sqlite.
|
||||
*/
|
||||
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
|
||||
/*
|
||||
** Return the number of LookasideSlot elements on the linked list
|
||||
*/
|
||||
static u32 countLookasideSlots(LookasideSlot *p){
|
||||
u32 cnt = 0;
|
||||
while( p ){
|
||||
p = p->pNext;
|
||||
cnt++;
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/*
|
||||
** Count the number of slots of lookaside memory that are outstanding
|
||||
*/
|
||||
int sqlite3LookasideUsed(Lookaside *pLookaside, int *pHighwater){
|
||||
u32 nInit = countLookasideSlots(pLookaside->pInit);
|
||||
u32 nFree = countLookasideSlots(pLookaside->pFree);
|
||||
if( pHighwater ) *pHighwater = pLookaside->nSlot - nInit;
|
||||
return pLookaside->nSlot - (nInit+nFree);
|
||||
}
|
||||
|
||||
void sqlite3LookasideResetUsed(Lookaside *pLookaside){
|
||||
LookasideSlot *p = pLookaside->pFree;
|
||||
if( p ){
|
||||
while( p->pNext ) p = p->pNext;
|
||||
p->pNext = pLookaside->pInit;
|
||||
pLookaside->pInit = pLookaside->pFree;
|
||||
pLookaside->pFree = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef SQLITE_OMIT_LOOKASIDE
|
||||
|
||||
static void *lookasideSlotAlloc(Lookaside *pLookaside, u64 n){
|
||||
LookasideSlot *pBuf;
|
||||
if( (pBuf = pLookaside->pFree)!=0 ){
|
||||
pLookaside->pFree = pBuf->pNext;
|
||||
pLookaside->anStat[0]++;
|
||||
return (void*)pBuf;
|
||||
}else if( (pBuf = pLookaside->pInit)!=0 ){
|
||||
pLookaside->pInit = pBuf->pNext;
|
||||
pLookaside->anStat[0]++;
|
||||
return (void*)pBuf;
|
||||
}else{
|
||||
pLookaside->anStat[2]++;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void lookasideSlotFree(Lookaside *pLookaside, void *p){
|
||||
LookasideSlot *pBuf = (LookasideSlot*)p;
|
||||
# ifdef SQLITE_DEBUG
|
||||
/* Scribble over the content in the buffer being freed */
|
||||
memset(p, 0xaa, pLookaside->szTrue);
|
||||
# endif
|
||||
pBuf->pNext = pLookaside->pFree;
|
||||
pLookaside->pFree = pBuf;
|
||||
}
|
||||
|
||||
# ifndef SQLITE_OMIT_MINI_LOOKASIDE
|
||||
# ifndef SQLITE_MINI_LOOKASIDE_MIN_SLOT_SIZE
|
||||
# define SQLITE_MINI_LOOKASIDE_MIN_SLOT_SIZE 128
|
||||
# endif
|
||||
|
||||
static void *miniLookasideAlloc(Lookaside *pLookaside, u16 n){
|
||||
void *p = 0;
|
||||
LookasideSlot *pSlot;
|
||||
int iMiniSlot;
|
||||
|
||||
assert( n<=pLookaside->szMini );
|
||||
|
||||
if( !pLookaside->pMini ){
|
||||
pSlot = lookasideSlotAlloc(pLookaside, pLookaside->szTrue);
|
||||
if( !pSlot ){
|
||||
return p;
|
||||
}
|
||||
bzero(pSlot, sizeof(LookasideSlot));
|
||||
pLookaside->pMini = pSlot;
|
||||
}else{
|
||||
pSlot = pLookaside->pMini;
|
||||
assert( pSlot->bMembership );
|
||||
}
|
||||
|
||||
assert( pSlot->bMembership < (1<<pLookaside->nMini)-1 );
|
||||
|
||||
iMiniSlot = __builtin_ffs(~pSlot->bMembership) - 1;
|
||||
assert(iMiniSlot < pLookaside->nMini);
|
||||
assert( (pSlot->bMembership&(1<<iMiniSlot))==0 );
|
||||
pSlot->bMembership |= 1<<iMiniSlot;
|
||||
|
||||
p = (char *)pSlot + sizeof(LookasideSlot) + (pLookaside->szMini * iMiniSlot);
|
||||
|
||||
/* Remove slot from pMini if it is full of sub-allocations */
|
||||
if( pSlot->bMembership == (1<<pLookaside->nMini)-1 ){
|
||||
/* Slot is full, dequeue from list */
|
||||
if( pSlot->pNext ){
|
||||
assert( pSlot->pNext->pPrev == pSlot );
|
||||
pSlot->pNext->pPrev = pSlot->pPrev;
|
||||
}
|
||||
if( pSlot->pPrev ){
|
||||
assert( pSlot->pPrev->pNext == pSlot );
|
||||
pSlot->pPrev->pNext = pSlot->pNext;
|
||||
}else{
|
||||
assert( pLookaside->pMini == pSlot );
|
||||
pLookaside->pMini = pSlot->pNext;
|
||||
}
|
||||
pSlot->pNext = pSlot->pPrev = 0;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
static void miniLookasideFree(Lookaside *pLookaside, void *p){
|
||||
int iSlotNum = ((u8*)p - (u8*)pLookaside->pStart) / pLookaside->szTrue;
|
||||
LookasideSlot *pSlot = (LookasideSlot *)(iSlotNum * pLookaside->szTrue + (u8*)pLookaside->pStart);
|
||||
int iMiniSlot = ((u8*)p - ((u8*)pSlot + sizeof(LookasideSlot))) / pLookaside->szMini;
|
||||
|
||||
assert( pSlot->bMembership );
|
||||
assert( pSlot->bMembership < (1<<pLookaside->nMini) );
|
||||
assert( iMiniSlot<pLookaside->nMini );
|
||||
|
||||
/* Return slot to pMini list if it was full */
|
||||
if( pSlot->bMembership == (1<<pLookaside->nMini)-1 ){
|
||||
assert( pSlot->pNext == pSlot->pPrev && pSlot->pPrev == 0 );
|
||||
if( pLookaside->pMini ){
|
||||
assert( !pLookaside->pMini->pPrev );
|
||||
pSlot->pNext = pLookaside->pMini;
|
||||
pSlot->pNext->pPrev = pSlot;
|
||||
}
|
||||
pLookaside->pMini = pSlot;
|
||||
}
|
||||
|
||||
pSlot->bMembership &= ~(1<<iMiniSlot);
|
||||
#ifdef SQLITE_DEBUG
|
||||
memset(p, 0xaa, pLookaside->szMini);
|
||||
#endif
|
||||
|
||||
/* Return slot to the lookaside pool if it is empty */
|
||||
if( pSlot->bMembership == 0 ){
|
||||
if( pSlot->pNext ){
|
||||
assert( pSlot->pNext->pPrev == pSlot );
|
||||
pSlot->pNext->pPrev = pSlot->pPrev;
|
||||
}
|
||||
if( pSlot->pPrev ){
|
||||
assert( pSlot->pPrev->pNext == pSlot );
|
||||
pSlot->pPrev->pNext = pSlot->pNext;
|
||||
}else{
|
||||
assert( pLookaside->pMini==pSlot );
|
||||
pLookaside->pMini = pSlot->pNext;
|
||||
}
|
||||
lookasideSlotFree(pLookaside, pSlot);
|
||||
}
|
||||
}
|
||||
|
||||
# else
|
||||
# define miniLookasideAlloc(A, B) lookasideSlotAlloc(A, B)
|
||||
# define miniLookasideFree(A, B) lookasideSlowFree(A, B)
|
||||
# endif /* !SQLITE_OMIT_MINI_LOOKASIDE */
|
||||
|
||||
int sqlite3LookasideOpen(void *pBuf, int sz, int cnt, Lookaside *pLookaside){
|
||||
void *pStart;
|
||||
|
||||
if( sqlite3LookasideUsed(pLookaside,0)>0 ){
|
||||
return SQLITE_BUSY;
|
||||
}
|
||||
/* Free any existing lookaside buffer for this handle before
|
||||
** allocating a new one so we don't have to have space for
|
||||
** both at the same time.
|
||||
*/
|
||||
if( pLookaside->bMalloced ){
|
||||
sqlite3_free(pLookaside->pStart);
|
||||
}
|
||||
/* The size of a lookaside slot after ROUNDDOWN8 needs to be larger
|
||||
** than sizeof(LookasideSlot) to be useful.
|
||||
*/
|
||||
sz = ROUNDDOWN8(sz); /* IMP: R-33038-09382 */
|
||||
if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0;
|
||||
if( cnt<0 ) cnt = 0;
|
||||
if( sz==0 || cnt==0 ){
|
||||
sz = 0;
|
||||
pStart = 0;
|
||||
}else if( pBuf==0 ){
|
||||
sqlite3BeginBenignMalloc();
|
||||
pStart = sqlite3Malloc( sz*(sqlite3_int64)cnt ); /* IMP: R-61949-35727 */
|
||||
sqlite3EndBenignMalloc();
|
||||
if( pStart ) cnt = sqlite3MallocSize(pStart)/sz;
|
||||
}else{
|
||||
pStart = pBuf;
|
||||
}
|
||||
pLookaside->pStart = pStart;
|
||||
pLookaside->pInit = 0;
|
||||
pLookaside->pFree = 0;
|
||||
pLookaside->sz = (u16)sz;
|
||||
pLookaside->szTrue = (u16)sz;
|
||||
#ifndef SQLITE_OMIT_MINILOOKASIDE
|
||||
pLookaside->pMini = 0;
|
||||
pLookaside->nMini = (sz - sizeof(LookasideSlot)) / SQLITE_MINI_LOOKASIDE_MIN_SLOT_SIZE;
|
||||
if( pLookaside->nMini ){
|
||||
pLookaside->szMini = ((sz - sizeof(LookasideSlot)) / pLookaside->nMini) & ~(sizeof(void *) - 1);
|
||||
}else{
|
||||
pLookaside->szMini = 0;
|
||||
}
|
||||
#endif /* SQLITE_OMIT_MINILOOKASIDE */
|
||||
if( pStart ){
|
||||
int i;
|
||||
LookasideSlot *p;
|
||||
assert( sz > (int)sizeof(LookasideSlot*) );
|
||||
pLookaside->nSlot = cnt;
|
||||
p = (LookasideSlot*)pStart;
|
||||
for(i=cnt-1; i>=0; i--){
|
||||
p->pNext = pLookaside->pInit;
|
||||
pLookaside->pInit = p;
|
||||
p = (LookasideSlot*)&((u8*)p)[sz];
|
||||
}
|
||||
pLookaside->pEnd = p;
|
||||
pLookaside->bDisable = 0;
|
||||
pLookaside->bMalloced = pBuf==0 ?1:0;
|
||||
}else{
|
||||
pLookaside->pStart = 0;
|
||||
pLookaside->pEnd = 0;
|
||||
pLookaside->bDisable = 1;
|
||||
pLookaside->bMalloced = 0;
|
||||
pLookaside->nSlot = 0;
|
||||
}
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
void sqlite3LookasideClose(Lookaside *pLookaside){
|
||||
assert( sqlite3LookasideUsed(pLookaside,0)==0 );
|
||||
if( pLookaside->bMalloced ){
|
||||
sqlite3_free(pLookaside->pStart);
|
||||
}
|
||||
}
|
||||
|
||||
int sqlite3IsLookaside(Lookaside *pLookaside, void *p){
|
||||
return SQLITE_WITHIN(p, pLookaside->pStart, pLookaside->pEnd);
|
||||
}
|
||||
|
||||
/*
|
||||
** Returns a pointer to a region at least n bytes in size, or NULL if the
|
||||
** lookaside allocator has exhausted its available memory.
|
||||
*/
|
||||
void *sqlite3LookasideAlloc(Lookaside *pLookaside, u64 n){
|
||||
if( n>pLookaside->sz ){
|
||||
if( !pLookaside->bDisable ){
|
||||
pLookaside->anStat[1]++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if( n<=pLookaside->szMini && pLookaside->nMini > 1 ){
|
||||
return miniLookasideAlloc(pLookaside, n);
|
||||
}
|
||||
return lookasideSlotAlloc(pLookaside, n);
|
||||
}
|
||||
|
||||
/*
|
||||
** Free memory previously obtained from sqlite3LookasideAlloc().
|
||||
*/
|
||||
void sqlite3LookasideFree(Lookaside *pLookaside, void *p){
|
||||
assert( sqlite3IsLookaside(pLookaside, p) );
|
||||
if( ((u8*)p - (u8*)pLookaside->pStart) % pLookaside->szTrue == 0 ){
|
||||
lookasideSlotFree(pLookaside, p);
|
||||
}else{
|
||||
miniLookasideFree(pLookaside, p);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Return the size of a memory allocation previously obtained from
|
||||
** sqlite3LookasideAlloc().
|
||||
*/
|
||||
int sqlite3LookasideSize(Lookaside *pLookaside, void *p){
|
||||
assert(sqlite3IsLookaside(pLookaside, p));
|
||||
|
||||
# ifndef SQLITE_OMIT_MINI_LOOKASIDE
|
||||
if( ((u8*)p - (u8*)pLookaside->pStart) % pLookaside->szTrue != 0 ){
|
||||
return pLookaside->szMini;
|
||||
}else
|
||||
#endif /* SQLITE_OMIT_MINI_LOOKASIDE */
|
||||
{
|
||||
return pLookaside->szTrue;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* !SQLITE_OMIT_LOOKASIDE */
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
** 2019-10-02
|
||||
**
|
||||
** The author disclaims copyright to this source code. In place of
|
||||
** a legal notice, here is a blessing:
|
||||
**
|
||||
** May you do good and not evil.
|
||||
** May you find forgiveness for yourself and forgive others.
|
||||
** May you share freely, never taking more than you give.
|
||||
**
|
||||
*************************************************************************
|
||||
** Header file for the lookaside allocator
|
||||
**
|
||||
** This header defines the interface to the lookaside allocator.
|
||||
** The lookaside allocator implements a two-size memory allocator using a
|
||||
** buffer provided at initialization-time to exploit the fact that 75% of
|
||||
** SQLite's allocations are <=128B.
|
||||
*/
|
||||
#ifndef SQLITE_LOOKASIDE_H
|
||||
#define SQLITE_LOOKASIDE_H
|
||||
|
||||
/*
|
||||
** Count the number of slots of lookaside memory that are outstanding
|
||||
*/
|
||||
int sqlite3LookasideUsed(Lookaside *pLookaside, int *pHighwater);
|
||||
|
||||
void sqlite3LookasideResetUsed(Lookaside *pLookaside);
|
||||
|
||||
#define sqlite3LookasideDisable(pLookaside) do{(pLookaside)->bDisable++;\
|
||||
(pLookaside)->sz=0;}while(0)
|
||||
#define sqlite3LookasideEnable(pLookaside) do{(pLookaside)->bDisable--;\
|
||||
(pLookaside)->sz=(pLookaside)->bDisable?0:(pLookaside)->szTrue;} while(0)
|
||||
#define sqlite3LookasideEnableCnt(pLookaside, CNT) do{(pLookaside)->bDisable -= (CNT);\
|
||||
(pLookaside)->sz=(pLookaside)->bDisable?0:(pLookaside)->szTrue;} while(0)
|
||||
#define sqlite3LookasideDisabled(pLookaside) ((pLookaside)->bDisable)
|
||||
|
||||
# ifndef SQLITE_OMIT_LOOKASIDE
|
||||
|
||||
/*
|
||||
** Set up a lookaside allocator.
|
||||
** Returns SQLITE_OK on success.
|
||||
** If lookaside is already active, return SQLITE_BUSY.
|
||||
**
|
||||
** If pStart is NULL the space for the lookaside memory is obtained from
|
||||
** sqlite3_malloc(). If pStart is not NULL then it is sz*cnt bytes of memory
|
||||
** to use for the lookaside memory.
|
||||
*/
|
||||
int sqlite3LookasideOpen(
|
||||
void *pBuf, /* NULL or sz*cnt bytes of memory */
|
||||
int sz, /* Number of bytes in each lookaside slot */
|
||||
int cnt, /* Number of slots */
|
||||
Lookaside *pLookaside /* Preallocated space for the Lookaside */
|
||||
);
|
||||
|
||||
/* Reset and close the lookaside object */
|
||||
void sqlite3LookasideClose(Lookaside *pLookaside);
|
||||
|
||||
/*
|
||||
** Returns TRUE if p is a lookaside memory allocation from db
|
||||
*/
|
||||
int sqlite3IsLookaside(Lookaside *pLookaside, void *p);
|
||||
|
||||
/*
|
||||
** Returns a pointer to a region at least n bytes in size, or NULL if the
|
||||
** lookaside allocator has exhausted its available memory.
|
||||
*/
|
||||
void *sqlite3LookasideAlloc(Lookaside *pLookaside, u64 n);
|
||||
|
||||
/*
|
||||
** Free memory previously obtained from sqlite3LookasideAlloc().
|
||||
*/
|
||||
void sqlite3LookasideFree(Lookaside *pLookaside, void *p);
|
||||
|
||||
/*
|
||||
** Return the size of a memory allocation previously obtained from
|
||||
** sqlite3LookasideAlloc().
|
||||
*/
|
||||
int sqlite3LookasideSize(Lookaside *pLookaside, void *p);
|
||||
|
||||
# else
|
||||
# define sqlite3LookasideOpen(A, B, C, D) SQLITE_OK
|
||||
# define sqlite3LookasideClose(A)
|
||||
# define sqlite3IsLookaside(A, B) 0
|
||||
# define sqlite3LookasideAlloc(A, B) 0
|
||||
# define sqlite3LookasideFree(A, B) assert(0);
|
||||
# define sqlite3LookasideSize(A, B) -1
|
||||
# endif
|
||||
|
||||
#endif /* SQLITE_LOOKASIDE_H */
|
||||
+6
-82
@@ -15,6 +15,7 @@
|
||||
** accessed by users of the library.
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
|
||||
#ifdef SQLITE_ENABLE_FTS3
|
||||
# include "fts3.h"
|
||||
@@ -669,79 +670,6 @@ int sqlite3_config(int op, ...){
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
** Set up the lookaside buffers for a database connection.
|
||||
** Return SQLITE_OK on success.
|
||||
** If lookaside is already active, return SQLITE_BUSY.
|
||||
**
|
||||
** The sz parameter is the number of bytes in each lookaside slot.
|
||||
** The cnt parameter is the number of slots. If pStart is NULL the
|
||||
** space for the lookaside memory is obtained from sqlite3_malloc().
|
||||
** If pStart is not NULL then it is sz*cnt bytes of memory to use for
|
||||
** the lookaside memory.
|
||||
*/
|
||||
static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){
|
||||
#ifndef SQLITE_OMIT_LOOKASIDE
|
||||
void *pStart;
|
||||
|
||||
if( sqlite3LookasideUsed(db,0)>0 ){
|
||||
return SQLITE_BUSY;
|
||||
}
|
||||
/* Free any existing lookaside buffer for this handle before
|
||||
** allocating a new one so we don't have to have space for
|
||||
** both at the same time.
|
||||
*/
|
||||
if( db->lookaside.bMalloced ){
|
||||
sqlite3_free(db->lookaside.pStart);
|
||||
}
|
||||
/* The size of a lookaside slot after ROUNDDOWN8 needs to be larger
|
||||
** than a pointer to be useful.
|
||||
*/
|
||||
sz = ROUNDDOWN8(sz); /* IMP: R-33038-09382 */
|
||||
if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0;
|
||||
if( cnt<0 ) cnt = 0;
|
||||
if( sz==0 || cnt==0 ){
|
||||
sz = 0;
|
||||
pStart = 0;
|
||||
}else if( pBuf==0 ){
|
||||
sqlite3BeginBenignMalloc();
|
||||
pStart = sqlite3Malloc( sz*(sqlite3_int64)cnt ); /* IMP: R-61949-35727 */
|
||||
sqlite3EndBenignMalloc();
|
||||
if( pStart ) cnt = sqlite3MallocSize(pStart)/sz;
|
||||
}else{
|
||||
pStart = pBuf;
|
||||
}
|
||||
db->lookaside.pStart = pStart;
|
||||
db->lookaside.pInit = 0;
|
||||
db->lookaside.pFree = 0;
|
||||
db->lookaside.sz = (u16)sz;
|
||||
db->lookaside.szTrue = (u16)sz;
|
||||
if( pStart ){
|
||||
int i;
|
||||
LookasideSlot *p;
|
||||
assert( sz > (int)sizeof(LookasideSlot*) );
|
||||
db->lookaside.nSlot = cnt;
|
||||
p = (LookasideSlot*)pStart;
|
||||
for(i=cnt-1; i>=0; i--){
|
||||
p->pNext = db->lookaside.pInit;
|
||||
db->lookaside.pInit = p;
|
||||
p = (LookasideSlot*)&((u8*)p)[sz];
|
||||
}
|
||||
db->lookaside.pEnd = p;
|
||||
db->lookaside.bDisable = 0;
|
||||
db->lookaside.bMalloced = pBuf==0 ?1:0;
|
||||
}else{
|
||||
db->lookaside.pStart = db;
|
||||
db->lookaside.pEnd = db;
|
||||
db->lookaside.bDisable = 1;
|
||||
db->lookaside.sz = 0;
|
||||
db->lookaside.bMalloced = 0;
|
||||
db->lookaside.nSlot = 0;
|
||||
}
|
||||
#endif /* SQLITE_OMIT_LOOKASIDE */
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
** Return the mutex associated with a database connection.
|
||||
*/
|
||||
@@ -828,7 +756,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){
|
||||
void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */
|
||||
int sz = va_arg(ap, int); /* IMP: R-47871-25994 */
|
||||
int cnt = va_arg(ap, int); /* IMP: R-04460-53386 */
|
||||
rc = setupLookaside(db, pBuf, sz, cnt);
|
||||
rc = sqlite3LookasideOpen(pBuf, sz, cnt, &db->lookaside);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
@@ -1264,10 +1192,7 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){
|
||||
sqlite3_mutex_leave(db->mutex);
|
||||
db->magic = SQLITE_MAGIC_CLOSED;
|
||||
sqlite3_mutex_free(db->mutex);
|
||||
assert( sqlite3LookasideUsed(db,0)==0 );
|
||||
if( db->lookaside.bMalloced ){
|
||||
sqlite3_free(db->lookaside.pStart);
|
||||
}
|
||||
sqlite3LookasideClose(&db->lookaside);
|
||||
sqlite3_free(db);
|
||||
}
|
||||
|
||||
@@ -3065,8 +2990,7 @@ static int openDatabase(
|
||||
db->nDb = 2;
|
||||
db->magic = SQLITE_MAGIC_BUSY;
|
||||
db->aDb = db->aDbStatic;
|
||||
db->lookaside.bDisable = 1;
|
||||
db->lookaside.sz = 0;
|
||||
sqlite3LookasideDisable(&db->lookaside);
|
||||
|
||||
assert( sizeof(db->aLimit)==sizeof(aHardLimit) );
|
||||
memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit));
|
||||
@@ -3323,8 +3247,8 @@ static int openDatabase(
|
||||
if( rc ) sqlite3Error(db, rc);
|
||||
|
||||
/* Enable the lookaside-malloc subsystem */
|
||||
setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside,
|
||||
sqlite3GlobalConfig.nLookaside);
|
||||
sqlite3LookasideOpen(0, sqlite3GlobalConfig.szLookaside,
|
||||
sqlite3GlobalConfig.nLookaside, &db->lookaside);
|
||||
|
||||
sqlite3_wal_autocheckpoint(db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT);
|
||||
|
||||
|
||||
+18
-50
@@ -13,6 +13,7 @@
|
||||
** Memory allocation functions used throughout sqlite.
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
/*
|
||||
@@ -264,17 +265,6 @@ void *sqlite3_malloc64(sqlite3_uint64 n){
|
||||
return sqlite3Malloc(n);
|
||||
}
|
||||
|
||||
/*
|
||||
** TRUE if p is a lookaside memory allocation from db
|
||||
*/
|
||||
#ifndef SQLITE_OMIT_LOOKASIDE
|
||||
static int isLookaside(sqlite3 *db, void *p){
|
||||
return SQLITE_WITHIN(p, db->lookaside.pStart, db->lookaside.pEnd);
|
||||
}
|
||||
#else
|
||||
#define isLookaside(A,B) 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Return the size of a memory allocation previously obtained from
|
||||
** sqlite3Malloc() or sqlite3_malloc().
|
||||
@@ -285,7 +275,7 @@ int sqlite3MallocSize(void *p){
|
||||
}
|
||||
int sqlite3DbMallocSize(sqlite3 *db, void *p){
|
||||
assert( p!=0 );
|
||||
if( db==0 || !isLookaside(db,p) ){
|
||||
if( db==0 || !sqlite3IsLookaside(&db->lookaside,p) ){
|
||||
#ifdef SQLITE_DEBUG
|
||||
if( db==0 ){
|
||||
assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) );
|
||||
@@ -298,7 +288,7 @@ int sqlite3DbMallocSize(sqlite3 *db, void *p){
|
||||
return sqlite3GlobalConfig.m.xSize(p);
|
||||
}else{
|
||||
assert( sqlite3_mutex_held(db->mutex) );
|
||||
return db->lookaside.szTrue;
|
||||
return sqlite3LookasideSize(&db->lookaside, p);
|
||||
}
|
||||
}
|
||||
sqlite3_uint64 sqlite3_msize(void *p){
|
||||
@@ -346,14 +336,8 @@ void sqlite3DbFreeNN(sqlite3 *db, void *p){
|
||||
measureAllocationSize(db, p);
|
||||
return;
|
||||
}
|
||||
if( isLookaside(db, p) ){
|
||||
LookasideSlot *pBuf = (LookasideSlot*)p;
|
||||
#ifdef SQLITE_DEBUG
|
||||
/* Trash all content in the buffer being freed */
|
||||
memset(p, 0xaa, db->lookaside.szTrue);
|
||||
#endif
|
||||
pBuf->pNext = db->lookaside.pFree;
|
||||
db->lookaside.pFree = pBuf;
|
||||
if( sqlite3IsLookaside(&db->lookaside, p) ){
|
||||
sqlite3LookasideFree(&db->lookaside, p);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -468,10 +452,11 @@ void *sqlite3DbMallocZero(sqlite3 *db, u64 n){
|
||||
static SQLITE_NOINLINE void *dbMallocRawFinish(sqlite3 *db, u64 n){
|
||||
void *p;
|
||||
assert( db!=0 );
|
||||
if( db->mallocFailed ){ return 0; }
|
||||
p = sqlite3Malloc(n);
|
||||
if( !p ) sqlite3OomFault(db);
|
||||
sqlite3MemdebugSetType(p,
|
||||
(db->lookaside.bDisable==0) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP);
|
||||
sqlite3LookasideDisabled(&db->lookaside) ? MEMTYPE_HEAP : MEMTYPE_LOOKASIDE);
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -505,27 +490,11 @@ void *sqlite3DbMallocRaw(sqlite3 *db, u64 n){
|
||||
return p;
|
||||
}
|
||||
void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){
|
||||
#ifndef SQLITE_OMIT_LOOKASIDE
|
||||
LookasideSlot *pBuf;
|
||||
assert( db!=0 );
|
||||
assert( sqlite3_mutex_held(db->mutex) );
|
||||
assert( db->pnBytesFreed==0 );
|
||||
if( n>db->lookaside.sz ){
|
||||
if( db->lookaside.bDisable ){
|
||||
return db->mallocFailed ? 0 : dbMallocRawFinish(db, n);
|
||||
}
|
||||
db->lookaside.anStat[1]++;
|
||||
}else if( (pBuf = db->lookaside.pFree)!=0 ){
|
||||
db->lookaside.pFree = pBuf->pNext;
|
||||
db->lookaside.anStat[0]++;
|
||||
return (void*)pBuf;
|
||||
}else if( (pBuf = db->lookaside.pInit)!=0 ){
|
||||
db->lookaside.pInit = pBuf->pNext;
|
||||
db->lookaside.anStat[0]++;
|
||||
return (void*)pBuf;
|
||||
}else{
|
||||
db->lookaside.anStat[2]++;
|
||||
}
|
||||
#ifndef SQLITE_OMIT_LOOKASIDE
|
||||
return sqlite3LookasideAlloc(&db->lookaside, n) ?: dbMallocRawFinish(db, n);
|
||||
#else
|
||||
assert( db!=0 );
|
||||
assert( sqlite3_mutex_held(db->mutex) );
|
||||
@@ -533,8 +502,8 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){
|
||||
if( db->mallocFailed ){
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
return dbMallocRawFinish(db, n);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Forward declaration */
|
||||
@@ -548,7 +517,7 @@ void *sqlite3DbRealloc(sqlite3 *db, void *p, u64 n){
|
||||
assert( db!=0 );
|
||||
if( p==0 ) return sqlite3DbMallocRawNN(db, n);
|
||||
assert( sqlite3_mutex_held(db->mutex) );
|
||||
if( isLookaside(db,p) && n<=db->lookaside.szTrue ) return p;
|
||||
if( sqlite3IsLookaside(&db->lookaside,p) && n<=sqlite3LookasideSize(&db->lookaside, p) ) return p;
|
||||
return dbReallocFinish(db, p, n);
|
||||
}
|
||||
static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){
|
||||
@@ -556,10 +525,10 @@ static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){
|
||||
assert( db!=0 );
|
||||
assert( p!=0 );
|
||||
if( db->mallocFailed==0 ){
|
||||
if( isLookaside(db, p) ){
|
||||
if( sqlite3IsLookaside(&db->lookaside,p) ){
|
||||
pNew = sqlite3DbMallocRawNN(db, n);
|
||||
if( pNew ){
|
||||
memcpy(pNew, p, db->lookaside.szTrue);
|
||||
memcpy(pNew, p, sqlite3LookasideSize(&db->lookaside, p));
|
||||
sqlite3DbFree(db, p);
|
||||
}
|
||||
}else{
|
||||
@@ -570,8 +539,8 @@ static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){
|
||||
if( !pNew ){
|
||||
sqlite3OomFault(db);
|
||||
}
|
||||
sqlite3MemdebugSetType(pNew,
|
||||
(db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
|
||||
sqlite3MemdebugSetType(p,
|
||||
sqlite3LookasideDisabled(&db->lookaside) ? MEMTYPE_HEAP : MEMTYPE_LOOKASIDE);
|
||||
}
|
||||
}
|
||||
return pNew;
|
||||
@@ -648,8 +617,7 @@ void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){
|
||||
|
||||
/*
|
||||
** Call this routine to record the fact that an OOM (out-of-memory) error
|
||||
** has happened. This routine will set db->mallocFailed, and also
|
||||
** temporarily disable the lookaside memory allocator and interrupt
|
||||
** has happened. This routine will set db->mallocFailed and interrupt
|
||||
** any running VDBEs.
|
||||
*/
|
||||
void sqlite3OomFault(sqlite3 *db){
|
||||
@@ -658,7 +626,7 @@ void sqlite3OomFault(sqlite3 *db){
|
||||
if( db->nVdbeExec>0 ){
|
||||
db->u1.isInterrupted = 1;
|
||||
}
|
||||
DisableLookaside;
|
||||
sqlite3LookasideDisable(&db->lookaside);;
|
||||
if( db->pParse ){
|
||||
db->pParse->rc = SQLITE_NOMEM_BKPT;
|
||||
}
|
||||
@@ -676,7 +644,7 @@ void sqlite3OomClear(sqlite3 *db){
|
||||
if( db->mallocFailed && db->nVdbeExec==0 ){
|
||||
db->mallocFailed = 0;
|
||||
db->u1.isInterrupted = 0;
|
||||
assert( db->lookaside.bDisable>0 );
|
||||
assert( sqlite3LookasideDisabled(&db->lookaside) );
|
||||
EnableLookaside;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -51,6 +51,7 @@
|
||||
//
|
||||
%include {
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
|
||||
/*
|
||||
** Disable all error recovery processing in the parser push-down
|
||||
@@ -108,7 +109,7 @@ struct FrameBound { int eType; Expr *pExpr; };
|
||||
static void disableLookaside(Parse *pParse){
|
||||
sqlite3 *db = pParse->db;
|
||||
pParse->disableLookaside++;
|
||||
DisableLookaside;
|
||||
sqlite3LookasideDisable(&db->lookaside);
|
||||
}
|
||||
|
||||
} // end %include
|
||||
|
||||
+4
-4
@@ -14,6 +14,7 @@
|
||||
** from disk.
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
|
||||
/*
|
||||
** Fill the InitData structure with an error message that indicates
|
||||
@@ -538,9 +539,8 @@ void sqlite3ParserReset(Parse *pParse){
|
||||
sqlite3DbFree(db, pParse->aLabel);
|
||||
sqlite3ExprListDelete(db, pParse->pConstExpr);
|
||||
if( db ){
|
||||
assert( db->lookaside.bDisable >= pParse->disableLookaside );
|
||||
db->lookaside.bDisable -= pParse->disableLookaside;
|
||||
db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue;
|
||||
assert( sqlite3LookasideDisabled(&db->lookaside) >= pParse->disableLookaside );
|
||||
sqlite3LookasideEnableCnt(&db->lookaside, pParse->disableLookaside);
|
||||
}
|
||||
pParse->disableLookaside = 0;
|
||||
}
|
||||
@@ -574,7 +574,7 @@ static int sqlite3Prepare(
|
||||
*/
|
||||
if( prepFlags & SQLITE_PREPARE_PERSISTENT ){
|
||||
sParse.disableLookaside++;
|
||||
DisableLookaside;
|
||||
sqlite3LookasideDisable(&db->lookaside);
|
||||
}
|
||||
sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0;
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
** to handle SELECT statements in SQLite.
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
|
||||
/*
|
||||
** Trace output macros
|
||||
|
||||
+11
-2
@@ -1289,9 +1289,19 @@ struct Lookaside {
|
||||
LookasideSlot *pFree; /* List of available buffers */
|
||||
void *pStart; /* First byte of available memory space */
|
||||
void *pEnd; /* First byte past end of available space */
|
||||
#ifndef SQLITE_OMIT_MINILOOKASIDE
|
||||
LookasideSlot *pMini; /* List of buffers used by mini allocator */
|
||||
u16 szMini; /* Size of each mini-allocator buffer in bytes */
|
||||
u16 nMini; /* Number of mini-allocator buffers per slot */
|
||||
#endif /* SQLITE_OMIT_MINILOOKASIDE */
|
||||
};
|
||||
struct LookasideSlot {
|
||||
LookasideSlot *pNext; /* Next buffer in the list of free buffers */
|
||||
LookasideSlot *pNext; /* Next buffer in the list of buffers */
|
||||
#ifndef SQLITE_OMIT_MINILOOKASIDE
|
||||
/* The members below are only valid for slots inside the mini-allocator */
|
||||
LookasideSlot *pPrev; /* Previous partially-used buffer in the list */
|
||||
int bMembership; /* Bitfield tracking sub-allocations within slot */
|
||||
#endif /* SQLITE_OMIT_MINILOOKASIDE */
|
||||
};
|
||||
|
||||
#define DisableLookaside db->lookaside.bDisable++;db->lookaside.sz=0
|
||||
@@ -3825,7 +3835,6 @@ sqlite3_int64 sqlite3StatusValue(int);
|
||||
void sqlite3StatusUp(int, int);
|
||||
void sqlite3StatusDown(int, int);
|
||||
void sqlite3StatusHighwater(int, int);
|
||||
int sqlite3LookasideUsed(sqlite3*,int*);
|
||||
|
||||
/* Access to mutexes used by sqlite3_status() */
|
||||
sqlite3_mutex *sqlite3Pcache1Mutex(void);
|
||||
|
||||
+3
-30
@@ -14,6 +14,7 @@
|
||||
** functionality.
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "lookaside.h"
|
||||
#include "vdbeInt.h"
|
||||
|
||||
/*
|
||||
@@ -170,28 +171,6 @@ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
** Return the number of LookasideSlot elements on the linked list
|
||||
*/
|
||||
static u32 countLookasideSlots(LookasideSlot *p){
|
||||
u32 cnt = 0;
|
||||
while( p ){
|
||||
p = p->pNext;
|
||||
cnt++;
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/*
|
||||
** Count the number of slots of lookaside memory that are outstanding
|
||||
*/
|
||||
int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){
|
||||
u32 nInit = countLookasideSlots(db->lookaside.pInit);
|
||||
u32 nFree = countLookasideSlots(db->lookaside.pFree);
|
||||
if( pHighwater ) *pHighwater = db->lookaside.nSlot - nInit;
|
||||
return db->lookaside.nSlot - (nInit+nFree);
|
||||
}
|
||||
|
||||
/*
|
||||
** Query status information for a single database connection
|
||||
*/
|
||||
@@ -211,15 +190,9 @@ int sqlite3_db_status(
|
||||
sqlite3_mutex_enter(db->mutex);
|
||||
switch( op ){
|
||||
case SQLITE_DBSTATUS_LOOKASIDE_USED: {
|
||||
*pCurrent = sqlite3LookasideUsed(db, pHighwater);
|
||||
*pCurrent = sqlite3LookasideUsed(&db->lookaside, pHighwater);
|
||||
if( resetFlag ){
|
||||
LookasideSlot *p = db->lookaside.pFree;
|
||||
if( p ){
|
||||
while( p->pNext ) p = p->pNext;
|
||||
p->pNext = db->lookaside.pInit;
|
||||
db->lookaside.pInit = db->lookaside.pFree;
|
||||
db->lookaside.pFree = 0;
|
||||
}
|
||||
sqlite3LookasideResetUsed(&db->lookaside);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -98,6 +98,7 @@ foreach hdr {
|
||||
hash.h
|
||||
hwtime.h
|
||||
keywordhash.h
|
||||
lookaside.h
|
||||
msvc.h
|
||||
mutex.h
|
||||
opcodes.h
|
||||
@@ -283,6 +284,7 @@ foreach file {
|
||||
os.c
|
||||
|
||||
fault.c
|
||||
lookaside.c
|
||||
mem0.c
|
||||
mem1.c
|
||||
mem2.c
|
||||
|
||||
@@ -103,6 +103,7 @@ foreach hdr {
|
||||
hash.h
|
||||
hwtime.h
|
||||
keywordhash.h
|
||||
lookaside.h
|
||||
msvc.h
|
||||
mutex.h
|
||||
opcodes.h
|
||||
@@ -300,6 +301,7 @@ foreach file {
|
||||
os.c
|
||||
|
||||
fault.c
|
||||
lookaside.c
|
||||
mem0.c
|
||||
mem1.c
|
||||
mem2.c
|
||||
|
||||
@@ -58,6 +58,7 @@ foreach hdr {
|
||||
hash.h
|
||||
hwtime.h
|
||||
keywordhash.h
|
||||
lookaside.h
|
||||
msvc.h
|
||||
opcodes.h
|
||||
os_common.h
|
||||
|
||||
Reference in New Issue
Block a user