Add the new internal interface sqlite3DbNNFreeNN(db,ptr) where both the

db and ptr parameters are guaranteed to be non-NULL.  Use this where
appropriate to save more than 2 million CPU cycles on the standard
performance test.

FossilOrigin-Name: e5eaa80e81fdf86f2875a912b880272b8d099b82b08e945a7988c5dd0fe9d6b5
This commit is contained in:
drh 2022-08-22 02:00:26 +00:00
parent 05cb948bf7
commit 41ce47c4f4
18 changed files with 128 additions and 69 deletions

View File

@ -1,5 +1,5 @@
C Merge\sthe\stest\scase\sfor\sdbsqlfuzz\s18fe4e257be7fa3ecfb0424ab7427e41e97ef9e3\nassertion\sfault,\swhich\sis\sfixed\swith\sthe\sprevious\scheck-in. C Add\sthe\snew\sinternal\sinterface\ssqlite3DbNNFreeNN(db,ptr)\swhere\sboth\sthe\ndb\sand\sptr\sparameters\sare\sguaranteed\sto\sbe\snon-NULL.\s\sUse\sthis\swhere\nappropriate\sto\ssave\smore\sthan\s2\smillion\sCPU\scycles\son\sthe\sstandard\nperformance\stest.
D 2022-08-20T19:45:41.430 D 2022-08-22T02:00:26.214
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -527,33 +527,33 @@ F src/attach.c 4431f82f0247bf3aaf91589acafdff77d1882235c95407b36da1585c765fbbc8
F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7 F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d
F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca
F src/btree.c 4a8d349b9ed4dc6d252c535227699d75319b633058a56432ebf43c9f56f9085e F src/btree.c 4a8d349b9ed4dc6d252c535227699d75319b633058a56432ebf43c9f56f9085e
F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22
F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e
F src/build.c 1e96f35d5912a1606c9c9463dfd8eaffc76b2bc01207ee372cb3249eef5173c4 F src/build.c 898884afd67d953808cb687babc15b66a10213f99fe2ce7db98960e959881f98
F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/callback.c 4cd7225b26a97f7de5fee5ae10464bed5a78f2adefe19534cc2095b3a8ca484a
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/ctime.c 93e4b5f4faf6d3f688988a116773259a4fbfb4ddac0e9bf9d0ae0429390c2543 F src/ctime.c 93e4b5f4faf6d3f688988a116773259a4fbfb4ddac0e9bf9d0ae0429390c2543
F src/date.c 94ce83b4cd848a387680a5f920c9018c16655db778c4d36525af0a0f34679ac5 F src/date.c 94ce83b4cd848a387680a5f920c9018c16655db778c4d36525af0a0f34679ac5
F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec
F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
F src/delete.c cba80ff7370f9d49e147470ef15f05cf00359f0725256a3703b422b6f376e270 F src/delete.c 86573edae75e3d3e9a8b590d87db8e47222103029df4f3e11fa56044459b514e
F src/expr.c 0f72468b64eef40c280fd6b273c19f3b221444b00f535c7ba6f34faa657e63da F src/expr.c 24e828db6b2fab8aabfb5d2c0d83dbdfc5a1972b1147fa893350e317ab7e282f
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/fkey.c 722f20779f5342a787922deded3628d8c74b5249cab04098cf17ee2f2aaff002
F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1
F src/global.c e83ee571b79ee3adc32e380cf554cf1254bc43763d23786c71721fbcdfbbb965 F src/global.c e83ee571b79ee3adc32e380cf554cf1254bc43763d23786c71721fbcdfbbb965
F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19
F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
F src/insert.c a8c994e3c3b8b08f61745bedabdf5affc79584a2b3c80ee2e4f038817838bd0a F src/insert.c aea5361767817f917b0f0f647a1f0b1621bd858938ae6ae545c3b6b9814b798f
F src/json.c 7749b98c62f691697c7ee536b570c744c0583cab4a89200fdd0fc2aa8cc8cbd6 F src/json.c 7749b98c62f691697c7ee536b570c744c0583cab4a89200fdd0fc2aa8cc8cbd6
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 853385cc7a604157e137585097949252d5d0c731768e16b044608e5c95c3614b F src/loadext.c 853385cc7a604157e137585097949252d5d0c731768e16b044608e5c95c3614b
F src/main.c b91c7e71af6f33640c35b8239a285040aad8dfcfdaaf979152e743c0f8017ea8 F src/main.c b91c7e71af6f33640c35b8239a285040aad8dfcfdaaf979152e743c0f8017ea8
F src/malloc.c 4a3785323104678a8b4b0a482fe0c2a80900e7468ddf76ab0f2ea1c79a8ca8cd F src/malloc.c 24369414a0fa402451cec0f0d1e94b637ce8e93c93cd29038ffe7629a8780ebf
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75
@ -583,17 +583,17 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
F src/pcache1.c 0b4245cd4964e635f2630908c2533cd8e9da7af3ca592e23ae8730aa25ae5eb9 F src/pcache1.c 0b4245cd4964e635f2630908c2533cd8e9da7af3ca592e23ae8730aa25ae5eb9
F src/pragma.c b57a859a366472131194a9ad35cd76d5920577226b04c884b1b9085605faa280 F src/pragma.c b57a859a366472131194a9ad35cd76d5920577226b04c884b1b9085605faa280
F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7 F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
F src/prepare.c c62820c15dcb63013519c8e41d9f928d7478672cc902cfd0581c733c271dbf45 F src/prepare.c 971d5819a4bda88038c2283d71fc0a2974ffc3dd480f9bd941341017abacfd1b
F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764
F src/random.c 546d6feb15ec69c1aafe9bb351a277cbb498fd5410e646add673acb805714960 F src/random.c 546d6feb15ec69c1aafe9bb351a277cbb498fd5410e646add673acb805714960
F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633 F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
F src/select.c 4750fbe9d8ecb7236baf7a9bea4299bb87126e08c209645666a0ae8f0efbe0fc F src/select.c ccce37e7fbe71089cf6aec91e7134c9c0c1d4840cff9f02587bbc71240d914a5
F src/shell.c.in 269f682249c1bce2962883e5b99c8702b16a488a43b9ae186daa178713a93c5d F src/shell.c.in 269f682249c1bce2962883e5b99c8702b16a488a43b9ae186daa178713a93c5d
F src/sqlite.h.in b9b7fd73239d94db20332bb6e504688001e5564b655e1318a4427a1caef4b99e F src/sqlite.h.in b9b7fd73239d94db20332bb6e504688001e5564b655e1318a4427a1caef4b99e
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h a988810c9b21c0dc36dc7a62735012339dc76fc7ab448fb0792721d30eacb69d F src/sqlite3ext.h a988810c9b21c0dc36dc7a62735012339dc76fc7ab448fb0792721d30eacb69d
F src/sqliteInt.h 3ae1d20f579149c18ddd995bbeffabf036cad9f4359dc2f27dc1b778d108ff35 F src/sqliteInt.h 51ccf8da51d5263a21543631f0c3bdca06e9fbe8238a1b2c8d7ba4f4cd118aea
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@ -652,7 +652,7 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9
F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f
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 36eb0799e487759bbe73e5742b82ee676f06cea2515ff578d03c59a74ccf2d6c F src/tokenize.c 1305797eab3542a0896b552c6e7669c972c1468e11e92b370533c1f37a37082b
F src/treeview.c 07787f67cd297a6d09d04b8d70c06769c60c9c1d9080378f93929c16f8fd3298 F src/treeview.c 07787f67cd297a6d09d04b8d70c06769c60c9c1d9080378f93929c16f8fd3298
F src/trigger.c 61bea163b1fa3039bc572ed8312461b978e5c527e5301f302b078f4c1ccdec6a F src/trigger.c 61bea163b1fa3039bc572ed8312461b978e5c527e5301f302b078f4c1ccdec6a
F src/update.c c52a7991bece0453d22c77c08469512ee2f1391c12503fd347d1c939220c5877 F src/update.c c52a7991bece0453d22c77c08469512ee2f1391c12503fd347d1c939220c5877
@ -664,20 +664,20 @@ F src/vdbe.c 4e57ac969bb2252598024ee3ebcb0885cb7976f1606e2bd77975a506da93ed50
F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0
F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da
F src/vdbeapi.c 4cfbf7ec3ed60366a38655f3f10316c5a3d68f6d4d06e462f88679392611c756 F src/vdbeapi.c 4cfbf7ec3ed60366a38655f3f10316c5a3d68f6d4d06e462f88679392611c756
F src/vdbeaux.c 8584f4a20997fd918f0d957ab4f73d7411159772297c5020c188973bdc41dbf0 F src/vdbeaux.c cd9fc2fb24755366b2718f5e9e02103c39804bdc9e630620aaec08bb3093c46c
F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd
F src/vdbemem.c c3ce80af15e2ff5c2824a8db881681cbf511376f13613da020bac6d320c535b1 F src/vdbemem.c c3ce80af15e2ff5c2824a8db881681cbf511376f13613da020bac6d320c535b1
F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35 F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c
F src/vtab.c 3d72c780d1ea08906a198e4f033921a658a54590e3ed72c544995d84f3f9464a F src/vtab.c bb53f9e2eaeecca07158643dd3d5039cf13b525fe2d267e113b39a36f374556c
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
F src/where.c 8bfe41220558a03be393d064ef3d942cd1ceaf57cd88a85b6cb59b7dda555202 F src/where.c 6d1ee6f6bc048406554176eb6146b27ac16ec96cca018848aa0b9836b2b71143
F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7
F src/wherecode.c 719a5bb0102711a6ebed8d4385b831a27ce679172f3ae8e9aaec0dc1e415a95a F src/wherecode.c 6bb1cf9d0a4e3e04dab0bf0ea4a8d936a0dcc05a7e2207beeda6c61aea6dd341
F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46
F src/window.c 928e215840e2f2d9a2746e018c9643ef42c66c4ab6630ef0df7fa388fa145e86 F src/window.c 928e215840e2f2d9a2746e018c9643ef42c66c4ab6630ef0df7fa388fa145e86
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
@ -1999,9 +1999,8 @@ 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 9433ea4070f52135be64569057f439e7bdb4b3f425d87167c9ebda50011210c1 8372468bb5d8922cf20b8bbee34cfd6044ceb09c26a4efa79a5e6df2c7c4b730 P 2d13ec086e96a5446462ce0f689c40c8196e740cd693f5967bfe9eb961f03463
R 8a2bc608dd9e0c10d3cc034d5ec85f92 R bf88e8a14ba34da9f9b58cc1ee676092
T +closed 8372468bb5d8922cf20b8bbee34cfd6044ceb09c26a4efa79a5e6df2c7c4b730
U drh U drh
Z 96d7e346000d7bc7e6cdccdd39e9e0b9 Z 1f007ec3ec70bab2436c890728aeb636
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
2d13ec086e96a5446462ce0f689c40c8196e740cd693f5967bfe9eb961f03463 e5eaa80e81fdf86f2875a912b880272b8d099b82b08e945a7988c5dd0fe9d6b5

View File

@ -252,6 +252,7 @@ int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){
int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema){ int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema){
Btree *p; Btree *p;
assert( db!=0 ); assert( db!=0 );
if( db->pVfs==0 && db->nDb==0 ) return 1;
if( pSchema ) iDb = sqlite3SchemaToIndex(db, pSchema); if( pSchema ) iDb = sqlite3SchemaToIndex(db, pSchema);
assert( iDb>=0 && iDb<db->nDb ); assert( iDb>=0 && iDb<db->nDb );
if( !sqlite3_mutex_held(db->mutex) ) return 0; if( !sqlite3_mutex_held(db->mutex) ) return 0;

View File

@ -775,16 +775,17 @@ void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){
int i; int i;
Column *pCol; Column *pCol;
assert( pTable!=0 ); assert( pTable!=0 );
assert( db!=0 );
if( (pCol = pTable->aCol)!=0 ){ if( (pCol = pTable->aCol)!=0 ){
for(i=0; i<pTable->nCol; i++, pCol++){ for(i=0; i<pTable->nCol; i++, pCol++){
assert( pCol->zCnName==0 || pCol->hName==sqlite3StrIHash(pCol->zCnName) ); assert( pCol->zCnName==0 || pCol->hName==sqlite3StrIHash(pCol->zCnName) );
sqlite3DbFree(db, pCol->zCnName); sqlite3DbFree(db, pCol->zCnName);
} }
sqlite3DbFree(db, pTable->aCol); sqlite3DbNNFreeNN(db, pTable->aCol);
if( IsOrdinaryTable(pTable) ){ if( IsOrdinaryTable(pTable) ){
sqlite3ExprListDelete(db, pTable->u.tab.pDfltList); sqlite3ExprListDelete(db, pTable->u.tab.pDfltList);
} }
if( db==0 || db->pnBytesFreed==0 ){ if( db->pnBytesFreed==0 ){
pTable->aCol = 0; pTable->aCol = 0;
pTable->nCol = 0; pTable->nCol = 0;
if( IsOrdinaryTable(pTable) ){ if( IsOrdinaryTable(pTable) ){
@ -821,7 +822,8 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
** a Table object that was going to be marked ephemeral. So do not check ** a Table object that was going to be marked ephemeral. So do not check
** that no lookaside memory is used in this case either. */ ** that no lookaside memory is used in this case either. */
int nLookaside = 0; int nLookaside = 0;
if( db && !db->mallocFailed && (pTable->tabFlags & TF_Ephemeral)==0 ){ assert( db!=0 );
if( !db->mallocFailed && (pTable->tabFlags & TF_Ephemeral)==0 ){
nLookaside = sqlite3LookasideUsed(db, 0); nLookaside = sqlite3LookasideUsed(db, 0);
} }
#endif #endif
@ -831,7 +833,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
pNext = pIndex->pNext; pNext = pIndex->pNext;
assert( pIndex->pSchema==pTable->pSchema assert( pIndex->pSchema==pTable->pSchema
|| (IsVirtual(pTable) && pIndex->idxType!=SQLITE_IDXTYPE_APPDEF) ); || (IsVirtual(pTable) && pIndex->idxType!=SQLITE_IDXTYPE_APPDEF) );
if( (db==0 || db->pnBytesFreed==0) && !IsVirtual(pTable) ){ if( db->pnBytesFreed==0 && !IsVirtual(pTable) ){
char *zName = pIndex->zName; char *zName = pIndex->zName;
TESTONLY ( Index *pOld = ) sqlite3HashInsert( TESTONLY ( Index *pOld = ) sqlite3HashInsert(
&pIndex->pSchema->idxHash, zName, 0 &pIndex->pSchema->idxHash, zName, 0
@ -868,8 +870,9 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
} }
void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
/* Do not delete the table until the reference count reaches zero. */ /* Do not delete the table until the reference count reaches zero. */
assert( db!=0 );
if( !pTable ) return; if( !pTable ) return;
if( ((!db || db->pnBytesFreed==0) && (--pTable->nTabRef)>0) ) return; if( db->pnBytesFreed==0 && (--pTable->nTabRef)>0 ) return;
deleteTable(db, pTable); deleteTable(db, pTable);
} }
@ -4689,12 +4692,13 @@ IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token *pToken){
*/ */
void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ void sqlite3IdListDelete(sqlite3 *db, IdList *pList){
int i; int i;
assert( db!=0 );
if( pList==0 ) return; if( pList==0 ) return;
assert( pList->eU4!=EU4_EXPR ); /* EU4_EXPR mode is not currently used */ assert( pList->eU4!=EU4_EXPR ); /* EU4_EXPR mode is not currently used */
for(i=0; i<pList->nId; i++){ for(i=0; i<pList->nId; i++){
sqlite3DbFree(db, pList->a[i].zName); sqlite3DbFree(db, pList->a[i].zName);
} }
sqlite3DbFreeNN(db, pList); sqlite3DbNNFreeNN(db, pList);
} }
/* /*
@ -4897,11 +4901,12 @@ void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){
void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){
int i; int i;
SrcItem *pItem; SrcItem *pItem;
assert( db!=0 );
if( pList==0 ) return; if( pList==0 ) return;
for(pItem=pList->a, i=0; i<pList->nSrc; i++, pItem++){ for(pItem=pList->a, i=0; i<pList->nSrc; i++, pItem++){
if( pItem->zDatabase ) sqlite3DbFreeNN(db, pItem->zDatabase); if( pItem->zDatabase ) sqlite3DbNNFreeNN(db, pItem->zDatabase);
sqlite3DbFree(db, pItem->zName); if( pItem->zName ) sqlite3DbNNFreeNN(db, pItem->zName);
if( pItem->zAlias ) sqlite3DbFreeNN(db, pItem->zAlias); if( pItem->zAlias ) sqlite3DbNNFreeNN(db, pItem->zAlias);
if( pItem->fg.isIndexedBy ) sqlite3DbFree(db, pItem->u1.zIndexedBy); if( pItem->fg.isIndexedBy ) sqlite3DbFree(db, pItem->u1.zIndexedBy);
if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg); if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg);
sqlite3DeleteTable(db, pItem->pTab); sqlite3DeleteTable(db, pItem->pTab);
@ -4912,7 +4917,7 @@ void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){
sqlite3ExprDelete(db, pItem->u3.pOn); sqlite3ExprDelete(db, pItem->u3.pOn);
} }
} }
sqlite3DbFreeNN(db, pList); sqlite3DbNNFreeNN(db, pList);
} }
/* /*

View File

@ -490,19 +490,21 @@ void sqlite3SchemaClear(void *p){
Hash temp2; Hash temp2;
HashElem *pElem; HashElem *pElem;
Schema *pSchema = (Schema *)p; Schema *pSchema = (Schema *)p;
sqlite3 xdb;
memset(&xdb, 0, sizeof(xdb));
temp1 = pSchema->tblHash; temp1 = pSchema->tblHash;
temp2 = pSchema->trigHash; temp2 = pSchema->trigHash;
sqlite3HashInit(&pSchema->trigHash); sqlite3HashInit(&pSchema->trigHash);
sqlite3HashClear(&pSchema->idxHash); sqlite3HashClear(&pSchema->idxHash);
for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
sqlite3DeleteTrigger(0, (Trigger*)sqliteHashData(pElem)); sqlite3DeleteTrigger(&xdb, (Trigger*)sqliteHashData(pElem));
} }
sqlite3HashClear(&temp2); sqlite3HashClear(&temp2);
sqlite3HashInit(&pSchema->tblHash); sqlite3HashInit(&pSchema->tblHash);
for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
Table *pTab = sqliteHashData(pElem); Table *pTab = sqliteHashData(pElem);
sqlite3DeleteTable(0, pTab); sqlite3DeleteTable(&xdb, pTab);
} }
sqlite3HashClear(&temp1); sqlite3HashClear(&temp1);
sqlite3HashClear(&pSchema->fkeyHash); sqlite3HashClear(&pSchema->fkeyHash);

View File

@ -676,7 +676,7 @@ delete_from_cleanup:
sqlite3ExprListDelete(db, pOrderBy); sqlite3ExprListDelete(db, pOrderBy);
sqlite3ExprDelete(db, pLimit); sqlite3ExprDelete(db, pLimit);
#endif #endif
sqlite3DbFree(db, aToOpen); if( aToOpen ) sqlite3DbNNFreeNN(db, aToOpen);
return; return;
} }
/* Make sure "isView" and other macros defined above are undefined. Otherwise /* Make sure "isView" and other macros defined above are undefined. Otherwise

View File

@ -1220,6 +1220,7 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){
*/ */
static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){
assert( p!=0 ); assert( p!=0 );
assert( db!=0 );
assert( !ExprUseUValue(p) || p->u.iValue>=0 ); assert( !ExprUseUValue(p) || p->u.iValue>=0 );
assert( !ExprUseYWin(p) || !ExprUseYSub(p) ); assert( !ExprUseYWin(p) || !ExprUseYSub(p) );
assert( !ExprUseYWin(p) || p->y.pWin!=0 || db->mallocFailed ); assert( !ExprUseYWin(p) || p->y.pWin!=0 || db->mallocFailed );
@ -1252,7 +1253,7 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){
} }
} }
if( !ExprHasProperty(p, EP_Static) ){ if( !ExprHasProperty(p, EP_Static) ){
sqlite3DbFreeNN(db, p); sqlite3DbNNFreeNN(db, p);
} }
} }
void sqlite3ExprDelete(sqlite3 *db, Expr *p){ void sqlite3ExprDelete(sqlite3 *db, Expr *p){
@ -2038,12 +2039,13 @@ static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){
int i = pList->nExpr; int i = pList->nExpr;
struct ExprList_item *pItem = pList->a; struct ExprList_item *pItem = pList->a;
assert( pList->nExpr>0 ); assert( pList->nExpr>0 );
assert( db!=0 );
do{ do{
sqlite3ExprDelete(db, pItem->pExpr); sqlite3ExprDelete(db, pItem->pExpr);
sqlite3DbFree(db, pItem->zEName); if( pItem->zEName ) sqlite3DbNNFreeNN(db, pItem->zEName);
pItem++; pItem++;
}while( --i>0 ); }while( --i>0 );
sqlite3DbFreeNN(db, pList); sqlite3DbNNFreeNN(db, pList);
} }
void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){
if( pList ) exprListDeleteNN(db, pList); if( pList ) exprListDeleteNN(db, pList);
@ -6075,6 +6077,7 @@ static int exprRefToSrcList(Walker *pWalker, Expr *pExpr){
int sqlite3ReferencesSrcList(Parse *pParse, Expr *pExpr, SrcList *pSrcList){ int sqlite3ReferencesSrcList(Parse *pParse, Expr *pExpr, SrcList *pSrcList){
Walker w; Walker w;
struct RefSrcList x; struct RefSrcList x;
assert( pParse->db!=0 );
memset(&w, 0, sizeof(w)); memset(&w, 0, sizeof(w));
memset(&x, 0, sizeof(x)); memset(&x, 0, sizeof(x));
w.xExprCallback = exprRefToSrcList; w.xExprCallback = exprRefToSrcList;
@ -6091,7 +6094,7 @@ int sqlite3ReferencesSrcList(Parse *pParse, Expr *pExpr, SrcList *pSrcList){
sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter); sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter);
} }
#endif #endif
sqlite3DbFree(pParse->db, x.aiExclude); if( x.aiExclude ) sqlite3DbNNFreeNN(pParse->db, x.aiExclude);
if( w.eCode & 0x01 ){ if( w.eCode & 0x01 ){
return 1; return 1;
}else if( w.eCode ){ }else if( w.eCode ){

View File

@ -1439,11 +1439,12 @@ void sqlite3FkDelete(sqlite3 *db, Table *pTab){
FKey *pNext; /* Copy of pFKey->pNextFrom */ FKey *pNext; /* Copy of pFKey->pNextFrom */
assert( IsOrdinaryTable(pTab) ); assert( IsOrdinaryTable(pTab) );
assert( db!=0 );
for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pNext){ for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pNext){
assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) );
/* Remove the FK from the fkeyHash hash table. */ /* Remove the FK from the fkeyHash hash table. */
if( !db || db->pnBytesFreed==0 ){ if( db->pnBytesFreed==0 ){
if( pFKey->pPrevTo ){ if( pFKey->pPrevTo ){
pFKey->pPrevTo->pNextTo = pFKey->pNextTo; pFKey->pPrevTo->pNextTo = pFKey->pNextTo;
}else{ }else{

View File

@ -1417,7 +1417,7 @@ insert_cleanup:
sqlite3UpsertDelete(db, pUpsert); sqlite3UpsertDelete(db, pUpsert);
sqlite3SelectDelete(db, pSelect); sqlite3SelectDelete(db, pSelect);
sqlite3IdListDelete(db, pColumn); sqlite3IdListDelete(db, pColumn);
sqlite3DbFree(db, aRegIdx); if( aRegIdx ) sqlite3DbNNFreeNN(db, aRegIdx);
} }
/* Make sure "isView" and other macros defined above are undefined. Otherwise /* Make sure "isView" and other macros defined above are undefined. Otherwise

View File

@ -441,6 +441,41 @@ void sqlite3DbFreeNN(sqlite3 *db, void *p){
sqlite3MemdebugSetType(p, MEMTYPE_HEAP); sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
sqlite3_free(p); sqlite3_free(p);
} }
void sqlite3DbNNFreeNN(sqlite3 *db, void *p){
assert( db!=0 );
assert( sqlite3_mutex_held(db->mutex) );
assert( p!=0 );
if( db->pnBytesFreed ){
measureAllocationSize(db, p);
return;
}
if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){
#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE
if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){
LookasideSlot *pBuf = (LookasideSlot*)p;
#ifdef SQLITE_DEBUG
memset(p, 0xaa, LOOKASIDE_SMALL); /* Trash freed content */
#endif
pBuf->pNext = db->lookaside.pSmallFree;
db->lookaside.pSmallFree = pBuf;
return;
}
#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */
if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){
LookasideSlot *pBuf = (LookasideSlot*)p;
#ifdef SQLITE_DEBUG
memset(p, 0xaa, db->lookaside.szTrue); /* Trash freed content */
#endif
pBuf->pNext = db->lookaside.pFree;
db->lookaside.pFree = pBuf;
return;
}
}
assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
sqlite3_free(p);
}
void sqlite3DbFree(sqlite3 *db, void *p){ void sqlite3DbFree(sqlite3 *db, void *p){
assert( db==0 || sqlite3_mutex_held(db->mutex) ); assert( db==0 || sqlite3_mutex_held(db->mutex) );
if( p ) sqlite3DbFreeNN(db, p); if( p ) sqlite3DbFreeNN(db, p);

View File

@ -574,15 +574,15 @@ void sqlite3ParseObjectReset(Parse *pParse){
assert( db->pParse==pParse ); assert( db->pParse==pParse );
assert( pParse->nested==0 ); assert( pParse->nested==0 );
#ifndef SQLITE_OMIT_SHARED_CACHE #ifndef SQLITE_OMIT_SHARED_CACHE
sqlite3DbFree(db, pParse->aTableLock); if( pParse->aTableLock ) sqlite3DbNNFreeNN(db, pParse->aTableLock);
#endif #endif
while( pParse->pCleanup ){ while( pParse->pCleanup ){
ParseCleanup *pCleanup = pParse->pCleanup; ParseCleanup *pCleanup = pParse->pCleanup;
pParse->pCleanup = pCleanup->pNext; pParse->pCleanup = pCleanup->pNext;
pCleanup->xCleanup(db, pCleanup->pPtr); pCleanup->xCleanup(db, pCleanup->pPtr);
sqlite3DbFreeNN(db, pCleanup); sqlite3DbNNFreeNN(db, pCleanup);
} }
sqlite3DbFree(db, pParse->aLabel); if( pParse->aLabel ) sqlite3DbNNFreeNN(db, pParse->aLabel);
if( pParse->pConstExpr ){ if( pParse->pConstExpr ){
sqlite3ExprListDelete(db, pParse->pConstExpr); sqlite3ExprListDelete(db, pParse->pConstExpr);
} }

View File

@ -76,6 +76,7 @@ struct SortCtx {
** If bFree==0, Leave the first Select object unfreed ** If bFree==0, Leave the first Select object unfreed
*/ */
static void clearSelect(sqlite3 *db, Select *p, int bFree){ static void clearSelect(sqlite3 *db, Select *p, int bFree){
assert( db!=0 );
while( p ){ while( p ){
Select *pPrior = p->pPrior; Select *pPrior = p->pPrior;
sqlite3ExprListDelete(db, p->pEList); sqlite3ExprListDelete(db, p->pEList);
@ -95,7 +96,7 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){
sqlite3WindowUnlinkFromSelect(p->pWin); sqlite3WindowUnlinkFromSelect(p->pWin);
} }
#endif #endif
if( bFree ) sqlite3DbFreeNN(db, p); if( bFree ) sqlite3DbNNFreeNN(db, p);
p = pPrior; p = pPrior;
bFree = 1; bFree = 1;
} }
@ -1501,9 +1502,10 @@ KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){
*/ */
void sqlite3KeyInfoUnref(KeyInfo *p){ void sqlite3KeyInfoUnref(KeyInfo *p){
if( p ){ if( p ){
assert( p->db!=0 );
assert( p->nRef>0 ); assert( p->nRef>0 );
p->nRef--; p->nRef--;
if( p->nRef==0 ) sqlite3DbFreeNN(p->db, p); if( p->nRef==0 ) sqlite3DbNNFreeNN(p->db, p);
} }
} }

View File

@ -4364,6 +4364,7 @@ void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64);
void *sqlite3DbRealloc(sqlite3 *, void *, u64); void *sqlite3DbRealloc(sqlite3 *, void *, u64);
void sqlite3DbFree(sqlite3*, void*); void sqlite3DbFree(sqlite3*, void*);
void sqlite3DbFreeNN(sqlite3*, void*); void sqlite3DbFreeNN(sqlite3*, void*);
void sqlite3DbNNFreeNN(sqlite3*, void*);
int sqlite3MallocSize(const void*); int sqlite3MallocSize(const void*);
int sqlite3DbMallocSize(sqlite3*, const void*); int sqlite3DbMallocSize(sqlite3*, const void*);
void *sqlite3PageMalloc(int); void *sqlite3PageMalloc(int);

View File

@ -711,7 +711,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql){
if( pParse->pNewTrigger && !IN_RENAME_OBJECT ){ if( pParse->pNewTrigger && !IN_RENAME_OBJECT ){
sqlite3DeleteTrigger(db, pParse->pNewTrigger); sqlite3DeleteTrigger(db, pParse->pNewTrigger);
} }
if( pParse->pVList ) sqlite3DbFreeNN(db, pParse->pVList); if( pParse->pVList ) sqlite3DbNNFreeNN(db, pParse->pVList);
db->pParse = pParentParse; db->pParse = pParentParse;
assert( nErr==0 || pParse->rc!=SQLITE_OK ); assert( nErr==0 || pParse->rc!=SQLITE_OK );
return nErr; return nErr;

View File

@ -884,7 +884,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
} }
resolve_p2_values_loop_exit: resolve_p2_values_loop_exit:
if( aLabel ){ if( aLabel ){
sqlite3DbFreeNN(p->db, pParse->aLabel); sqlite3DbNNFreeNN(p->db, pParse->aLabel);
pParse->aLabel = 0; pParse->aLabel = 0;
} }
pParse->nLabel = 0; pParse->nLabel = 0;
@ -1195,8 +1195,9 @@ void sqlite3VdbeJumpHereOrPopInst(Vdbe *p, int addr){
** the FuncDef is not ephermal, then do nothing. ** the FuncDef is not ephermal, then do nothing.
*/ */
static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){
assert( db!=0 );
if( (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){ if( (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){
sqlite3DbFreeNN(db, pDef); sqlite3DbNNFreeNN(db, pDef);
} }
} }
@ -1205,11 +1206,12 @@ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){
*/ */
static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){ static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){
if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc);
sqlite3DbFreeNN(db, p); sqlite3DbNNFreeNN(db, p);
} }
static SQLITE_NOINLINE void freeP4FuncCtx(sqlite3 *db, sqlite3_context *p){ static SQLITE_NOINLINE void freeP4FuncCtx(sqlite3 *db, sqlite3_context *p){
assert( db!=0 );
freeEphemeralFunction(db, p->pFunc); freeEphemeralFunction(db, p->pFunc);
sqlite3DbFreeNN(db, p); sqlite3DbNNFreeNN(db, p);
} }
static void freeP4(sqlite3 *db, int p4type, void *p4){ static void freeP4(sqlite3 *db, int p4type, void *p4){
assert( db ); assert( db );
@ -1222,7 +1224,7 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){
case P4_INT64: case P4_INT64:
case P4_DYNAMIC: case P4_DYNAMIC:
case P4_INTARRAY: { case P4_INTARRAY: {
sqlite3DbFree(db, p4); if( p4 ) sqlite3DbNNFreeNN(db, p4);
break; break;
} }
case P4_KEYINFO: { case P4_KEYINFO: {
@ -1261,6 +1263,7 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){
*/ */
static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){
assert( nOp>=0 ); assert( nOp>=0 );
assert( db!=0 );
if( aOp ){ if( aOp ){
Op *pOp = &aOp[nOp-1]; Op *pOp = &aOp[nOp-1];
while(1){ /* Exit via break */ while(1){ /* Exit via break */
@ -1271,7 +1274,7 @@ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){
if( pOp==aOp ) break; if( pOp==aOp ) break;
pOp--; pOp--;
} }
sqlite3DbFreeNN(db, aOp); sqlite3DbNNFreeNN(db, aOp);
} }
} }
@ -2025,7 +2028,7 @@ static void releaseMemArray(Mem *p, int N){
sqlite3VdbeMemRelease(p); sqlite3VdbeMemRelease(p);
p->flags = MEM_Undefined; p->flags = MEM_Undefined;
}else if( p->szMalloc ){ }else if( p->szMalloc ){
sqlite3DbFreeNN(db, p->zMalloc); sqlite3DbNNFreeNN(db, p->zMalloc);
p->szMalloc = 0; p->szMalloc = 0;
p->flags = MEM_Undefined; p->flags = MEM_Undefined;
} }
@ -3546,10 +3549,11 @@ void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, int mask){
*/ */
static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
SubProgram *pSub, *pNext; SubProgram *pSub, *pNext;
assert( db!=0 );
assert( p->db==0 || p->db==db ); assert( p->db==0 || p->db==db );
if( p->aColName ){ if( p->aColName ){
releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); releaseMemArray(p->aColName, p->nResColumn*COLNAME_N);
sqlite3DbFreeNN(db, p->aColName); sqlite3DbNNFreeNN(db, p->aColName);
} }
for(pSub=p->pProgram; pSub; pSub=pNext){ for(pSub=p->pProgram; pSub; pSub=pNext){
pNext = pSub->pNext; pNext = pSub->pNext;
@ -3558,11 +3562,11 @@ static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
} }
if( p->eVdbeState!=VDBE_INIT_STATE ){ if( p->eVdbeState!=VDBE_INIT_STATE ){
releaseMemArray(p->aVar, p->nVar); releaseMemArray(p->aVar, p->nVar);
if( p->pVList ) sqlite3DbFreeNN(db, p->pVList); if( p->pVList ) sqlite3DbNNFreeNN(db, p->pVList);
if( p->pFree ) sqlite3DbFreeNN(db, p->pFree); if( p->pFree ) sqlite3DbNNFreeNN(db, p->pFree);
} }
vdbeFreeOpArray(db, p->aOp, p->nOp); vdbeFreeOpArray(db, p->aOp, p->nOp);
sqlite3DbFree(db, p->zSql); if( p->zSql ) sqlite3DbNNFreeNN(db, p->zSql);
#ifdef SQLITE_ENABLE_NORMALIZE #ifdef SQLITE_ENABLE_NORMALIZE
sqlite3DbFree(db, p->zNormSql); sqlite3DbFree(db, p->zNormSql);
{ {
@ -3592,6 +3596,7 @@ void sqlite3VdbeDelete(Vdbe *p){
assert( p!=0 ); assert( p!=0 );
db = p->db; db = p->db;
assert( db!=0 );
assert( sqlite3_mutex_held(db->mutex) ); assert( sqlite3_mutex_held(db->mutex) );
sqlite3VdbeClearObject(db, p); sqlite3VdbeClearObject(db, p);
if( db->pnBytesFreed==0 ){ if( db->pnBytesFreed==0 ){
@ -3605,7 +3610,7 @@ void sqlite3VdbeDelete(Vdbe *p){
p->pNext->pPrev = p->pPrev; p->pNext->pPrev = p->pPrev;
} }
} }
sqlite3DbFreeNN(db, p); sqlite3DbNNFreeNN(db, p);
} }
/* /*
@ -5221,13 +5226,14 @@ void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){
** the vdbeUnpackRecord() function found in vdbeapi.c. ** the vdbeUnpackRecord() function found in vdbeapi.c.
*/ */
static void vdbeFreeUnpacked(sqlite3 *db, int nField, UnpackedRecord *p){ static void vdbeFreeUnpacked(sqlite3 *db, int nField, UnpackedRecord *p){
assert( db!=0 );
if( p ){ if( p ){
int i; int i;
for(i=0; i<nField; i++){ for(i=0; i<nField; i++){
Mem *pMem = &p->aMem[i]; Mem *pMem = &p->aMem[i];
if( pMem->zMalloc ) sqlite3VdbeMemReleaseMalloc(pMem); if( pMem->zMalloc ) sqlite3VdbeMemReleaseMalloc(pMem);
} }
sqlite3DbFreeNN(db, p); sqlite3DbNNFreeNN(db, p);
} }
} }
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
@ -5298,7 +5304,7 @@ void sqlite3VdbePreUpdateHook(
for(i=0; i<pCsr->nField; i++){ for(i=0; i<pCsr->nField; i++){
sqlite3VdbeMemRelease(&preupdate.aNew[i]); sqlite3VdbeMemRelease(&preupdate.aNew[i]);
} }
sqlite3DbFreeNN(db, preupdate.aNew); sqlite3DbNNFreeNN(db, preupdate.aNew);
} }
} }
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */

View File

@ -340,7 +340,8 @@ void sqlite3VtabUnlockList(sqlite3 *db){
*/ */
void sqlite3VtabClear(sqlite3 *db, Table *p){ void sqlite3VtabClear(sqlite3 *db, Table *p){
assert( IsVirtual(p) ); assert( IsVirtual(p) );
if( !db || db->pnBytesFreed==0 ) vtabDisconnectAll(0, p); assert( db!=0 );
if( db->pnBytesFreed==0 ) vtabDisconnectAll(0, p);
if( p->u.vtab.azArg ){ if( p->u.vtab.azArg ){
int i; int i;
for(i=0; i<p->u.vtab.nArg; i++){ for(i=0; i<p->u.vtab.nArg; i++){

View File

@ -2251,8 +2251,9 @@ static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){
** Delete a WhereLoop object ** Delete a WhereLoop object
*/ */
static void whereLoopDelete(sqlite3 *db, WhereLoop *p){ static void whereLoopDelete(sqlite3 *db, WhereLoop *p){
assert( db!=0 );
whereLoopClear(db, p); whereLoopClear(db, p);
sqlite3DbFreeNN(db, p); sqlite3DbNNFreeNN(db, p);
} }
/* /*
@ -2260,6 +2261,7 @@ static void whereLoopDelete(sqlite3 *db, WhereLoop *p){
*/ */
static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){
assert( pWInfo!=0 ); assert( pWInfo!=0 );
assert( db!=0 );
sqlite3WhereClauseClear(&pWInfo->sWC); sqlite3WhereClauseClear(&pWInfo->sWC);
while( pWInfo->pLoops ){ while( pWInfo->pLoops ){
WhereLoop *p = pWInfo->pLoops; WhereLoop *p = pWInfo->pLoops;
@ -2269,10 +2271,10 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){
assert( pWInfo->pExprMods==0 ); assert( pWInfo->pExprMods==0 );
while( pWInfo->pMemToFree ){ while( pWInfo->pMemToFree ){
WhereMemBlock *pNext = pWInfo->pMemToFree->pNext; WhereMemBlock *pNext = pWInfo->pMemToFree->pNext;
sqlite3DbFreeNN(db, pWInfo->pMemToFree); sqlite3DbNNFreeNN(db, pWInfo->pMemToFree);
pWInfo->pMemToFree = pNext; pWInfo->pMemToFree = pNext;
} }
sqlite3DbFreeNN(db, pWInfo); sqlite3DbNNFreeNN(db, pWInfo);
} }
/* Undo all Expr node modifications /* Undo all Expr node modifications
@ -5073,7 +5075,8 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
pWInfo->nRowOut = pFrom->nRow; pWInfo->nRowOut = pFrom->nRow;
/* Free temporary memory and return success */ /* Free temporary memory and return success */
sqlite3DbFreeNN(db, pSpace); assert( db!=0 );
sqlite3DbNNFreeNN(db, pSpace);
return SQLITE_OK; return SQLITE_OK;
} }

View File

@ -2109,8 +2109,8 @@ Bitmask sqlite3WhereCodeOneLoopStart(
} }
nConstraint++; nConstraint++;
} }
sqlite3DbFree(db, zStartAff); if( zStartAff ) sqlite3DbNNFreeNN(db, zStartAff);
sqlite3DbFree(db, zEndAff); if( zEndAff ) sqlite3DbNNFreeNN(db, zEndAff);
/* Top of the loop body */ /* Top of the loop body */
if( pLevel->p2==0 ) pLevel->p2 = sqlite3VdbeCurrentAddr(v); if( pLevel->p2==0 ) pLevel->p2 = sqlite3VdbeCurrentAddr(v);