]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Make sure all memory from sqlite3DbMalloc() is freed by sqlite3DbFree()
authordrh <drh@noemail.net>
Mon, 26 Jul 2010 11:07:20 +0000 (11:07 +0000)
committerdrh <drh@noemail.net>
Mon, 26 Jul 2010 11:07:20 +0000 (11:07 +0000)
and all memory from sqlite3_malloc() is freed by sqlite3_free().

FossilOrigin-Name: 629e38a8c9e31111e351fe4625a5835576d23584

1  2 
manifest
manifest.uuid
src/analyze.c
src/build.c
src/malloc.c
src/mem2.c
src/sqliteInt.h
src/vdbeaux.c
src/vtab.c

diff --cc manifest
index 93627ae0727ca245edda907805526d2395ed197c,86934fd2402f7e4af51019e0a1fdd31c45e88ec0..63d3b1cb9b01213930ed413007620b923d4b7501
+++ b/manifest
@@@ -1,5 -1,8 +1,8 @@@
- C Experimental\scode\sto\smeasure\smemory\sconsumed\sby\sdatabase\sschemas\sand\sprepared\sstatements.
- D 2010-07-24T11:28:29
+ -----BEGIN PGP SIGNED MESSAGE-----
+ Hash: SHA1
 -C Make\ssure\sall\smemory\sfrom\ssqlite3DbMalloc()\sis\sfreed\sby\ssqlite3DbFree()\sand\nall\smemory\sfrom\ssqlite3_malloc()\sis\sfreed\sby\ssqlite3_free().
 -D 2010-07-24T16:34:38
++C Make\ssure\sall\smemory\sfrom\ssqlite3DbMalloc()\sis\sfreed\sby\ssqlite3DbFree()\nand\sall\smemory\sfrom\ssqlite3_malloc()\sis\sfreed\sby\ssqlite3_free().
++D 2010-07-26T11:07:21
  F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
  F Makefile.in ec08dc838fd8110fe24c92e5130bcd91cbb1ff2e
  F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@@ -107,25 -110,25 +110,25 @@@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47
  F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc
  F sqlite3.pc.in ae6f59a76e862f5c561eb32a380228a02afc3cad
  F src/alter.c 8dc27638e7e2553e80b2b621f232be5eb1e85ef3
- F src/analyze.c 6c2bdb1d13138d084b14010cd9fef4ff34e0d313
 -F src/analyze.c c1bcd04b720e3300edafcdfe8bd2ba6bd9a8dca8
++F src/analyze.c 3642ebcd13f1ffb5773b9e08910e0492ec4cf946
  F src/attach.c 17bec1f18254d9341369f20f90ba24ce35d20d10
  F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
  F src/backup.c 51d83300fe0baee39405c416ceb19a58ed30a8ed
  F src/bitvec.c 06ad2c36a9c3819c0b9cbffec7b15f58d5d834e0
  F src/btmutex.c 96a12f50f7a17475155971a241d85ec5171573ff
- F src/btree.c 9a214e6141555b183216b73ace058c7a499cdbe2
+ F src/btree.c ed454f53f7bf7fb89c7a89f93fa93c5cd35e7aae
  F src/btree.h dd83041eda10c17daf023257c1fc883b5f71f85a
  F src/btreeInt.h b0c87f6725b06a0aa194a6d25d54b16ce9d6e291
- F src/build.c fdf428a35c0bd6256373e7779f3744ad4c8ff2eb
- F src/callback.c 4e565b7f387e3261a19ecaf0cbbdebfb91988ea4
 -F src/build.c 6d3bd01296ac236f50519ec74711a38c8cee4fd7
++F src/build.c d4593392b8bf0753dd16f494628823f6f39ee7fb
+ F src/callback.c da3c38d0ef5d7f04fae371e519bda61aa9cb1704
  F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
  F src/ctime.c 4f3aadad62c6c9f0d4e5a96718516ac4e3c598df
  F src/date.c 5dd8448a0bfea8d31fb14cff487d0c06ff8c8b20
  F src/delete.c 7ed8a8c8b5f748ece92df173d7e0f7810c899ebd
  F src/expr.c 7490fc3b16414d1a45d5acadf559317f9244891f
  F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 -F src/fkey.c 62eed881a26a93e576b8cfeedea91952c90a8666
 +F src/fkey.c cacfe3e24b311e4e089a9c470bdb73196af6f729
- F src/func.c 0c28599430856631216b6c0131c51c89bf516026
+ F src/func.c 75dc1fd91e5692cadb80d257bab68d7343060467
  F src/global.c 02335177cf6946fe5525c6f0755cf181140debf3
  F src/hash.c 458488dcc159c301b8e7686280ab209f1fb915af
  F src/hash.h 2894c932d84d9f892d4b4023a75e501f83050970
@@@ -134,12 -137,12 +137,12 @@@ F src/insert.c ba455ebb100283ccc5da03da
  F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e
  F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
  F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
- F src/loadext.c 1c7a61ce1281041f437333f366a96aa0d29bb581
+ F src/loadext.c 6d422ea91cf3d2d00408c5a8f2391cd458da85f8
  F src/main.c a487fe90aecaccb142e4a6b738c7e26e99145bcd
- F src/malloc.c d321131022bd83f95f871cde212ddb01ed217f2f
 -F src/malloc.c 8394eba1c319a6d840ee411e23966d53a87f745a
++F src/malloc.c 1cf0f2f45926c40b638e85e9b67fe5fabd072829
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
  F src/mem1.c 89d4ea8d5cdd55635cbaa48ad53132af6294cbb2
- F src/mem2.c 2ee7bdacda8299b5a91cff9f7ee3e46573195c38
 -F src/mem2.c 716e62689d49b01ee742be6c745b1c3bbfbccd18
++F src/mem2.c 12c91260fd2320eda9355dea5445b137f848c05b
  F src/mem3.c 9b237d911ba9904142a804be727cc6664873f8a3
  F src/mem5.c eb7a5cb98915dd7a086fa415ce3a5a0f20d0acff
  F src/memjournal.c 4a93a25ad9f76c40afa070ffd7187eb3a5fd7aee
@@@ -170,11 -173,11 +173,11 @@@ F src/resolve.c 1c0f32b64f8e3f555fe1f73
  F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
  F src/select.c 74fef1334bec27e606ef0b19e5c41cd0a639e69c
  F src/shell.c fd4ccdb37c3b68de0623eb938a649e0990710714
 -F src/sqlite.h.in 2585fc82c922f2772e201e60a76d5fd1ca18370e
 +F src/sqlite.h.in 05469b38a929b31278c7ed30b3d3f4b4e17817b6
  F src/sqlite3ext.h 69dfb8116af51b84a029cddb3b35062354270c89
- F src/sqliteInt.h 0ec613ec2fbb26a1f363425c945a22667d659af5
 -F src/sqliteInt.h e24b335bd57f673c39a9098fdc98d8ad2d5dc3da
++F src/sqliteInt.h 2a057459f689e23514f0ac2c414ef900f5d02a71
  F src/sqliteLimit.h 196e2f83c3b444c4548fc1874f52f84fdbda40f3
 -F src/status.c e2ad9f18c16209dab501e26020590fcebb2b751b
 +F src/status.c ab77d17fbfe0ab800b3c54dd6853e30b1dc1634e
  F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
  F src/tclsqlite.c ae1e4fb653c91ddad7e2534d209711a12604ccc4
  F src/test1.c ff3b4533fc4d78d1bff2ef831a5791db55096ed3
@@@ -218,15 -221,15 +221,15 @@@ F src/update.c 19c899c23cd29fd102c9068e
  F src/utf.c 1baeeac91707a4df97ccc6141ec0f808278af685
  F src/util.c 32aebf04c10e51ad3977a928b7416bed671b620b
  F src/vacuum.c 241a8386727c1497eba4955933356dfba6ff8c9f
- F src/vdbe.c 6294de3327e09d14e9c06ecfd10e57c2d8e85307
+ F src/vdbe.c cefff41564b68a412e65e6a1013ec1b1c1ece6c4
 -F src/vdbe.h 471f6a3dcec4817ca33596fe7f6654d56c0e75f3
 +F src/vdbe.h 7c5de1c7e2e6bc1f301bb95297aeb5d1b8455764
  F src/vdbeInt.h 19ebc8c2a2e938340051ee65af3f377fb99102d1
  F src/vdbeapi.c dc3138f10afbc95ed3c21dd25abb154504b1db9d
- F src/vdbeaux.c 9f18d228ee96b26e10f908f8f9597c700347df71
 -F src/vdbeaux.c e102e50a86f55e0598f0dd63480688e8123ead49
++F src/vdbeaux.c 1616d797183a7b803124697bb4dfa883b3b6c12a
  F src/vdbeblob.c 258a6010ba7a82b72b327fb24c55790655689256
  F src/vdbemem.c 5e579abf6532001dfbee0e640dc34eae897a9807
  F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2
- F src/vtab.c 74bc8e035f3762d3cab1498dbbf2117e798540a5
 -F src/vtab.c 838248ec64b1eda7afdf9303df30e8f1b96bc60f
++F src/vtab.c 82200af3881fa4e1c9cf07cf31d98c09d437e3ab
  F src/wal.c 0925601f3299c2941a67c9cfff41ee710f70ca82
  F src/wal.h 906c85760598b18584921fe08008435aa4eeeeb2
  F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
@@@ -838,10 -841,18 +841,14 @@@ F tool/speedtest2.tcl ee2149167303ba8e9
  F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
  F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
  F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
--P a6bb2108bfb562a7067ef6150e43382736c0c4f5
- R 5ce07ed2a0b02fd2492d8af031b47b67
- T *branch * experimental
- T *sym-experimental *
 -R 57ad848eef21f87b491f957007f9c787
 -T *bgcolor * #a0c0f0
 -T *branch * malloc-enhancement
 -T *sym-malloc-enhancement *
--T -sym-trunk *
- U dan
- Z 4780c44291ffd7692ca32c6ddced636f
++P 9aa30342f4de4eff630520ea8e07ad253d3f0877 ac1f37a647e9ed1c00a901d26d9956a86c40117a
++R 5e97c484f0c177ee87733094e898ae28
+ U drh
 -Z 0e50e08d3aab5ed9a84c7eabe091b80c
++Z ed9a664d8006d5d1a2fa23f0a60137f2
+ -----BEGIN PGP SIGNATURE-----
+ Version: GnuPG v1.4.6 (GNU/Linux)
 -iD8DBQFMSxYioxKgR168RlERAgv5AJwKcCKth9vEcMrMziFc3bR3CMKXOgCeOwNK
 -xsMH21OEzgn+77HK/85/56Q=
 -=jlvX
++iD8DBQFMTWxtoxKgR168RlERAp5SAKCD5Wul3MvRW/uf5JygdrrU2/cnGACfcrvh
++hDUH6H64I7jMlSjVOLsS7f8=
++=ga4H
+ -----END PGP SIGNATURE-----
diff --cc manifest.uuid
index 5222381d13d3a79cf32ff08ffa275e57bba4f77e,1558b696401c555e9c9ed022ce9af55df5bb4e17..13f8d6fc8642e7c54056089d554926e5a612042f
@@@ -1,1 -1,1 +1,1 @@@
- 9aa30342f4de4eff630520ea8e07ad253d3f0877
 -ac1f37a647e9ed1c00a901d26d9956a86c40117a
++629e38a8c9e31111e351fe4625a5835576d23584
diff --cc src/analyze.c
index d96deb3c2120a7c48ec4a099a67518c302a2d5aa,88a1820ed0a11e7d6965ad5b7db095553eaa4189..42705cafd25c46a43367c409daf641708fa23a34
@@@ -619,10 -619,10 +619,8 @@@ int sqlite3AnalysisLoad(sqlite3 *db, in
                  if( n < 1){
                    pSample->u.z = 0;
                  }else{
--                  pSample->u.z = sqlite3Malloc(n);
--                  if( pSample->u.z ){
--                    memcpy(pSample->u.z, z, n);
--                  }else{
++                  pSample->u.z = sqlite3DbStrNDup(0, z, n);
++                  if( pSample->u.z==0 ){
                      db->mallocFailed = 1;
                      break;
                    }
diff --cc src/build.c
Simple merge
diff --cc src/malloc.c
index 05ea51006381cf140a406ebbf41ed50574d00713,40a9720a6a886223f96383c4db0309cde3782d16..73508bdef89ab9bdfb779fcc61ab305dd8c5daeb
@@@ -368,6 -368,7 +368,7 @@@ void sqlite3ScratchFree(void *p)
             || p<sqlite3GlobalConfig.pScratch
             || p>=(void*)mem0.aScratchFree ){
        assert( sqlite3MemdebugHasType(p, MEMTYPE_SCRATCH) );
 -      assert( !sqlite3MemdebugHasType(p, ~MEMTYPE_SCRATCH) );
++      assert( sqlite3MemdebugNoType(p, ~MEMTYPE_SCRATCH) );
        sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
        if( sqlite3GlobalConfig.bMemstat ){
          int iSize = sqlite3MallocSize(p);
  */
  #ifndef SQLITE_OMIT_LOOKASIDE
  static int isLookaside(sqlite3 *db, void *p){
--  return db && p && p>=db->lookaside.pStart && p<db->lookaside.pEnd;
++  return p && p>=db->lookaside.pStart && p<db->lookaside.pEnd;
  }
  #else
  #define isLookaside(A,B) 0
  */
  int sqlite3MallocSize(void *p){
    assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
 -  assert( !sqlite3MemdebugHasType(p, MEMTYPE_RECURSIVE) );
++  assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
    return sqlite3GlobalConfig.m.xSize(p);
  }
  int sqlite3DbMallocSize(sqlite3 *db, void *p){
    assert( db==0 || sqlite3_mutex_held(db->mutex) );
--  if( isLookaside(db, p) ){
++  if( db && isLookaside(db, p) ){
      return db->lookaside.sz;
    }else{
 -    assert( sqlite3MemdebugHasType(p, MEMTYPE_RECURSIVE) );
--    assert( sqlite3MemdebugHasType(p,
--             db ? (MEMTYPE_DB|MEMTYPE_HEAP) : MEMTYPE_HEAP) );
++    assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
++    assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
++    assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) );
      return sqlite3GlobalConfig.m.xSize(p);
    }
  }
  */
  void sqlite3_free(void *p){
    if( p==0 ) return;
 -  assert( !sqlite3MemdebugHasType(p, MEMTYPE_RECURSIVE) );
++  assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
    assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
    if( sqlite3GlobalConfig.bMemstat ){
      sqlite3_mutex_enter(mem0.mutex);
  */
  void sqlite3DbFree(sqlite3 *db, void *p){
    assert( db==0 || sqlite3_mutex_held(db->mutex) );
-   if( db && db->pnBytesFreed ){
 -  if( isLookaside(db, p) ){
 -    LookasideSlot *pBuf = (LookasideSlot*)p;
 -    pBuf->pNext = db->lookaside.pFree;
 -    db->lookaside.pFree = pBuf;
 -    db->lookaside.nOut--;
 -  }else{
 -    assert( sqlite3MemdebugHasType(p, MEMTYPE_RECURSIVE) );
 -    assert( sqlite3MemdebugHasType(p,
 -                       db ? (MEMTYPE_DB|MEMTYPE_HEAP) : MEMTYPE_HEAP) );
 -    sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
 -    sqlite3_free(p);
++  if( db ){
++    if( db->pnBytesFreed ){
++      *db->pnBytesFreed += sqlite3DbMallocSize(db, p);
++      return;
++    }
 +    if( isLookaside(db, p) ){
-       *db->pnBytesFreed += db->lookaside.sz;
-     }else{
-       *db->pnBytesFreed += sqlite3MallocSize(p);
++      LookasideSlot *pBuf = (LookasideSlot*)p;
++      pBuf->pNext = db->lookaside.pFree;
++      db->lookaside.pFree = pBuf;
++      db->lookaside.nOut--;
++      return;
 +    }
-   }else if( isLookaside(db, p) ){
-     LookasideSlot *pBuf = (LookasideSlot*)p;
-     pBuf->pNext = db->lookaside.pFree;
-     db->lookaside.pFree = pBuf;
-     db->lookaside.nOut--;
-   }else{
-     assert( sqlite3MemdebugHasType(p,
-                        db ? (MEMTYPE_DB|MEMTYPE_HEAP) : MEMTYPE_HEAP) );
-     sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
-     sqlite3_free(p);
    }
++  assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
++  assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
++  assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) );
++  sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
++  sqlite3_free(p);
  }
  
  /*
@@@ -503,6 -502,7 +508,7 @@@ void *sqlite3Realloc(void *pOld, int nB
        sqlite3MallocAlarm(nNew-nOld);
      }
      assert( sqlite3MemdebugHasType(pOld, MEMTYPE_HEAP) );
 -    assert( !sqlite3MemdebugHasType(pOld, ~MEMTYPE_HEAP) );
++    assert( sqlite3MemdebugNoType(pOld, ~MEMTYPE_HEAP) );
      pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
      if( pNew==0 && mem0.alarmCallback ){
        sqlite3MallocAlarm(nBytes);
@@@ -600,8 -600,8 +606,8 @@@ void *sqlite3DbMallocRaw(sqlite3 *db, i
    if( !p && db ){
      db->mallocFailed = 1;
    }
-   sqlite3MemdebugSetType(p,
-             (db && db->lookaside.bEnabled) ? MEMTYPE_DB : MEMTYPE_HEAP);
 -  sqlite3MemdebugSetType(p, MEMTYPE_RECURSIVE |
 -            ((db && db->lookaside.bEnabled) ? MEMTYPE_DB : MEMTYPE_HEAP));
++  sqlite3MemdebugSetType(p, MEMTYPE_DB |
++         ((db && db->lookaside.bEnabled) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
    return p;
  }
  
@@@ -627,14 -627,16 +633,16 @@@ void *sqlite3DbRealloc(sqlite3 *db, voi
          sqlite3DbFree(db, p);
        }
      }else{
 -      assert( sqlite3MemdebugHasType(p, MEMTYPE_RECURSIVE) );
--      assert( sqlite3MemdebugHasType(p, MEMTYPE_DB|MEMTYPE_HEAP) );
++      assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
++      assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
        sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
        pNew = sqlite3_realloc(p, n);
        if( !pNew ){
 -        sqlite3MemdebugSetType(p, MEMTYPE_RECURSIVE|MEMTYPE_HEAP);
++        sqlite3MemdebugSetType(p, MEMTYPE_DB|MEMTYPE_HEAP);
          db->mallocFailed = 1;
        }
-       sqlite3MemdebugSetType(pNew,
-             db->lookaside.bEnabled ? MEMTYPE_DB : MEMTYPE_HEAP);
 -      sqlite3MemdebugSetType(pNew, MEMTYPE_RECURSIVE | 
 -            (db->lookaside.bEnabled ? MEMTYPE_DB : MEMTYPE_HEAP));
++      sqlite3MemdebugSetType(pNew, MEMTYPE_DB | 
++            (db->lookaside.bEnabled ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
      }
    }
    return pNew;
diff --cc src/mem2.c
index a82fee8fdb77845775abb06148dec10914bb69b1,587d9274e0d24f2e1b789dccb52d18eebb2eaec7..528a020f556a6b15de0ad8773c29dd73b12702fa
@@@ -413,7 -407,7 +407,28 @@@ int sqlite3MemdebugHasType(void *p, u8 
    }
    return rc;
  }
-- 
++
++/*
++** Return TRUE if the mask of type in eType matches no bits of the type of the
++** allocation p.  Also return true if p==NULL.
++**
++** This routine is designed for use within an assert() statement, to
++** verify the type of an allocation.  For example:
++**
++**     assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
++*/
++int sqlite3MemdebugNoType(void *p, u8 eType){
++  int rc = 1;
++  if( p ){
++    struct MemBlockHdr *pHdr;
++    pHdr = sqlite3MemsysGetHeader(p);
++    assert( pHdr->iForeGuard==FOREGUARD );         /* Allocation is valid */
++    if( (pHdr->eType&eType)!=0 ){
++      rc = 0;
++    }
++  }
++  return rc;
++}
  
  /*
  ** Set the number of backtrace levels kept for each allocation.
diff --cc src/sqliteInt.h
index 66f1cffb5b7d4fdbe3145b98b828b7798a54af77,8f780164871d43c011c44385ef45fb400ac78a3b..02705769c383731b2f286ce9858aca6cba3d5b00
@@@ -3120,17 -3118,17 +3120,18 @@@ SQLITE_EXTERN void (*sqlite3IoTrace)(co
  ** sqlite3MemdebugHasType() returns true if any of the bits in its second
  ** argument match the type set by the previous sqlite3MemdebugSetType().
  ** sqlite3MemdebugHasType() is intended for use inside assert() statements.
--** For example:
  **
--**     assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
++** sqlite3MemdebugNoType() returns true if none of the bits in its second
++** argument match the type set by the previous sqlite3MemdebugSetType().
  **
  ** Perhaps the most important point is the difference between MEMTYPE_HEAP
--** and MEMTYPE_DB.  If an allocation is MEMTYPE_DB, that means it might have
--** been allocated by lookaside, except the allocation was too large or
--** lookaside was already full.  It is important to verify that allocations
--** that might have been satisfied by lookaside are not passed back to 
--** non-lookaside free() routines.  Asserts such as the example above are
--** placed on the non-lookaside free() routines to verify this constraint. 
++** and MEMTYPE_LOOKASIDE.  If an allocation is MEMTYPE_LOOKASIDE, that means
++** it might have been allocated by lookaside, except the allocation was
++** too large or lookaside was already full.  It is important to verify
++** that allocations that might have been satisfied by lookaside are not
++** passed back to non-lookaside free() routines.  Asserts such as the
++** example above are placed on the non-lookaside free() routines to verify
++** this constraint. 
  **
  ** All of this is no-op for a production build.  It only comes into
  ** play when the SQLITE_MEMDEBUG compile-time option is used.
  #ifdef SQLITE_MEMDEBUG
    void sqlite3MemdebugSetType(void*,u8);
    int sqlite3MemdebugHasType(void*,u8);
++  int sqlite3MemdebugNoType(void*,u8);
  #else
  # define sqlite3MemdebugSetType(X,Y)  /* no-op */
  # define sqlite3MemdebugHasType(X,Y)  1
++# define sqlite3MemdebugNoType(X,Y)   1
  #endif
- #define MEMTYPE_HEAP     0x01    /* General heap allocations */
- #define MEMTYPE_DB       0x02    /* Associated with a database connection */
- #define MEMTYPE_SCRATCH  0x04    /* Scratch allocations */
- #define MEMTYPE_PCACHE   0x08    /* Page cache allocations */
 -#define MEMTYPE_HEAP      0x01    /* General heap allocations */
 -#define MEMTYPE_DB        0x02    /* Associated with a database connection */
 -#define MEMTYPE_SCRATCH   0x04    /* Scratch allocations */
 -#define MEMTYPE_PCACHE    0x08    /* Page cache allocations */
 -#define MEMTYPE_RECURSIVE 0x10    /* Experimental */
++#define MEMTYPE_HEAP       0x01  /* General heap allocations */
++#define MEMTYPE_LOOKASIDE  0x02  /* Might have been lookaside memory */
++#define MEMTYPE_SCRATCH    0x04  /* Scratch allocations */
++#define MEMTYPE_PCACHE     0x08  /* Page cache allocations */
++#define MEMTYPE_DB         0x10  /* Uses sqlite3DbMalloc, not sqlite_malloc */
  
  #endif /* _SQLITEINT_H_ */
diff --cc src/vdbeaux.c
Simple merge
diff --cc src/vtab.c
Simple merge