]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the SQLITE_CONFIG_MMAP_LIMIT configuration option for overriding the
authordrh <drh@noemail.net>
Mon, 1 Apr 2013 22:38:06 +0000 (22:38 +0000)
committerdrh <drh@noemail.net>
Mon, 1 Apr 2013 22:38:06 +0000 (22:38 +0000)
SQLITE_DEFAULT_MMAP_LIMIT compile-time setting.  Enhance "PRAGMA mmap_limit"
so that without a specific database name, it sets the limit on all database
files and changes the default for any future databases that might be added
using ATTACH.

FossilOrigin-Name: 78141d0a16dd1d56b575fccd149de7fa789cb06c

manifest
manifest.uuid
src/btree.c
src/global.c
src/main.c
src/os_unix.c
src/pager.c
src/pragma.c
src/sqlite.h.in
src/sqliteInt.h

index 9d43650636e1cde27a1c1493d2ad277f845d0178..995cb45fa0cca684a761a94064697cf2f1ad6c14 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sa\scomment\sto\sxUnfetch\son\swindows\sto\ssay\sthat\sthe\scall\sto\swinUnmapfile()\nmight\sbe\sunnecessary.
-D 2013-04-01T18:25:48.030
+C Add\sthe\sSQLITE_CONFIG_MMAP_LIMIT\sconfiguration\soption\sfor\soverriding\sthe\nSQLITE_DEFAULT_MMAP_LIMIT\scompile-time\ssetting.\s\sEnhance\s"PRAGMA\smmap_limit"\nso\sthat\swithout\sa\sspecific\sdatabase\sname,\sit\ssets\sthe\slimit\son\sall\sdatabase\nfiles\sand\schanges\sthe\sdefault\sfor\sany\sfuture\sdatabases\sthat\smight\sbe\sadded\nusing\sATTACH.
+D 2013-04-01T22:38:06.929
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in df3e48659d80e1b7765785d8d66c86b320f72cc7
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -121,7 +121,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
 F src/backup.c b2cac9f7993f3f9588827b824b1501d0c820fa68
 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
 F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
-F src/btree.c 84c9a4a20b827a6f7dbcbcda59607dbee57af446
+F src/btree.c bb679fddb7269dd7cfb950f845b1b18f19df4f4a
 F src/btree.h d9490cd37aaeb530a41b07f06e1262950b1be916
 F src/btreeInt.h eecc84f02375b2bb7a44abbcbbe3747dde73edb2
 F src/build.c 083da8466fd7e481cb8bd5264398f537507f6176
@@ -134,7 +134,7 @@ F src/expr.c 48048fca951eedbc74aa32262154410d56c83812
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c e16942bd5c8a868ac53287886464a5ed0e72b179
 F src/func.c 48987c025d69399f59a1c2a553cea5da41bf105d
-F src/global.c e59ecd2c553ad0d4bfbc84ca71231336f8993a7a
+F src/global.c d2494a1cea8f66a2cab8258449df07f8f0ae6330
 F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4
 F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22
 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
@@ -143,7 +143,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
 F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b
 F src/loadext.c 1422eba4aa2b1fb5f7b3aef574752272477d21e2
-F src/main.c 379160ec3680e3009aa4978eac47027c3ef27ac5
+F src/main.c 54a841854734b6731c4d026834788cac6a19f3d1
 F src/malloc.c fe085aa851b666b7c375c1ff957643dc20a04bf6
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c 437c7c4af964895d4650f29881df63535caaa1fa
@@ -160,15 +160,15 @@ F src/notify.c 976dd0f6171d4588e89e874fcc765e92914b6d30
 F src/os.c 809d0707cec693e1b9b376ab229271ad74c3d35d
 F src/os.h ae08bcc5f6ec6b339f4a2adf3931bb88cc14c3e4
 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
-F src/os_unix.c d136eca0cff2f8a5ac2f45867d5e5153d60e377c
+F src/os_unix.c 9912ab0cfcd7fa2b058544d861a9fead3adac8da
 F src/os_win.c a2f41c9dfb9b065285ba94d4a40a31ca2e2b6ea3
-F src/pager.c 2b9980e87296812a6ce51121a3335550ae25e3ec
+F src/pager.c 072512d05dacd61b1f147736825bd32fdc890ba4
 F src/pager.h 5cb78b8e1adfd5451e600be7719f5a99d87ac3b1
 F src/parse.y 5d5e12772845805fdfeb889163516b84fbb9ae95
 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
 F src/pcache1.c 9fd22671c270b35131ef480bbc00392b8b5f8ab9
-F src/pragma.c 8875d32d54530300e6aa31a9d5426b2088a69b12
+F src/pragma.c d0231f412dea33c35c1309b45b535cf0c10c63c8
 F src/prepare.c 310eaff1ee5f3c700b3545afb095cfe9346efc3a
 F src/printf.c 4a9f882f1c1787a8b494a2987765acf9d97ac21f
 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
@@ -176,10 +176,10 @@ F src/resolve.c 9079da7d59aed2bb14ec8315bc7f720dd85b5b65
 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
 F src/select.c 01540bcd3df3c8f1187158e77986028b1c667258
 F src/shell.c 7c41bfcd9e5bf9d96b9215f79b03a5b2b44a3bca
-F src/sqlite.h.in 921ba42ec3531fe8cf021492ffd781b161383f1b
+F src/sqlite.h.in 42c69ea00dfcce84394d6ce0d8dac7bb3d2ecff2
 F src/sqlite3.rc fea433eb0a59f4c9393c8e6d76a6e2596b1fe0c0
 F src/sqlite3ext.h 7183ab832e23db0f934494f16928da127a571d75
-F src/sqliteInt.h 0f8f05ee4db4ba9120b38f7a3992b325698f6e8a
+F src/sqliteInt.h 1664dc5ad6f8d4dab871416628aa3271044d66c0
 F src/sqliteLimit.h 83d0cd0ce3050a80930406d3c7aecb48c1ccdfc5
 F src/status.c bedc37ec1a6bb9399944024d63f4c769971955a9
 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -1040,7 +1040,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 0e44ed1badde6d766f18d1373d968e5b286b15bd
-R 8c3ade0fe410bf8f08819b27491eb958
+P e3c63c31a21b27806592d066a013a111b280c61f
+R 6d1c950d2134f5ef56d487146725ba7a
 U drh
-Z 1d97c5c3c6a55788c16fe769f3e976ae
+Z 72c1547cadf3e5127066e34139489015
index 224e9238f1cfc5a368e99a0dfe91aa1a197c934b..838dd7eeb0ce909e9adc76c190cfbb4b008eaa90 100644 (file)
@@ -1 +1 @@
-e3c63c31a21b27806592d066a013a111b280c61f
\ No newline at end of file
+78141d0a16dd1d56b575fccd149de7fa789cb06c
\ No newline at end of file
index 03764a9267c2712554a155d1f3fe375937b6a0c4..9672e0e000b7a1fc49062902f92250f8c0dfe1e8 100644 (file)
@@ -1864,6 +1864,7 @@ int sqlite3BtreeOpen(
     rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename,
                           EXTRA_SIZE, flags, vfsFlags, pageReinit);
     if( rc==SQLITE_OK ){
+      sqlite3PagerSetMmapLimit(pBt->pPager, db->mxMmap);
       rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader);
     }
     if( rc!=SQLITE_OK ){
index f5da7e7f1f42619e98602cca8a98d33dff72fb0f..aec3958c1f07a60d16e86a5dbec95dc7e337c9b4 100644 (file)
@@ -156,6 +156,7 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = {
    (void*)0,                  /* pHeap */
    0,                         /* nHeap */
    0, 0,                      /* mnHeap, mxHeap */
+   SQLITE_DEFAULT_MMAP_LIMIT, /* mxMmap */                       
    (void*)0,                  /* pScratch */
    0,                         /* szScratch */
    0,                         /* nScratch */
index 2fcb236e83377347e6caf704308408781e401f20..288d4535f3042d4343273aa4e0948e238bbbe397 100644 (file)
@@ -496,6 +496,13 @@ int sqlite3_config(int op, ...){
     }
 #endif
 
+    case SQLITE_CONFIG_MMAP_LIMIT: {
+      sqlite3_int64 mxMmap = va_arg(ap, sqlite3_int64);
+      if( mxMmap<0 ) mxMmap = SQLITE_DEFAULT_MMAP_LIMIT;
+      sqlite3GlobalConfig.mxMmap = mxMmap;
+      break;
+    }
+
     default: {
       rc = SQLITE_ERROR;
       break;
@@ -2316,6 +2323,7 @@ static int openDatabase(
   memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit));
   db->autoCommit = 1;
   db->nextAutovac = -1;
+  db->mxMmap = sqlite3GlobalConfig.mxMmap;
   db->nextPagesize = 0;
   db->flags |= SQLITE_ShortColNames | SQLITE_AutoIndex | SQLITE_EnableTrigger
 #if SQLITE_DEFAULT_FILE_FORMAT<4
index e92c7cc4a47658e8f59e517f766820b07b2cfd30..c10841abf9f71b2bdb59d29b3005d5e7c12da4ca 100644 (file)
@@ -3711,6 +3711,7 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){
     }
     case SQLITE_FCNTL_MMAP_LIMIT: {
       pFile->mmapLimit = *(i64*)pArg;
+printf("MMAP-LIMIT(%s) -> %lld\n", pFile->zPath, pFile->mmapLimit);
       return SQLITE_OK;
     }
 #ifdef SQLITE_DEBUG
index 550c6c7564102027cf2e2503cb3d7012924e8a91..68b2e2d6674557c85d4c38e90dd50b0190dd6225 100644 (file)
@@ -4749,7 +4749,7 @@ int sqlite3PagerOpen(
   /* pPager->pBusyHandlerArg = 0; */
   pPager->xReiniter = xReinit;
   /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
-  pPager->mxMmap = SQLITE_DEFAULT_MMAP_LIMIT;
+  /* pPager->mxMmap = SQLITE_DEFAULT_MMAP_LIMIT // will be set by btree.c */
 
   *ppPager = pPager;
   return SQLITE_OK;
index cd1cfbe2131846b30a91bb6ac1c4e17e0743a24f..7a515cba2eeee01e8aa30b8219077ec8a46172a8 100644 (file)
@@ -750,7 +750,9 @@ void sqlite3Pragma(
   ** Used to set mapping size limit. The mapping size limit is
   ** used to limit the aggregate size of all memory mapped regions of the
   ** database file. If this parameter is set to zero, then memory mapping
-  ** is not used at all. The parameter N is measured in bytes.
+  ** is not used at all.  If N is negative, then the default memory map
+  ** limit determined by sqlite3_config(SQLITE_CONFIG_MMAP_LIMIT) is set.
+  ** The parameter N is measured in bytes.
   **
   ** This value is advisory.  The underlying VFS is free to memory map
   ** as little or as much as it wants.  Except, if N is set to 0 then the
@@ -760,8 +762,15 @@ void sqlite3Pragma(
     assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
     if( zRight ){
       sqlite3_int64 size;
+      int ii;
       sqlite3Atoi64(zRight, &size, 1000, SQLITE_UTF8);
-      sqlite3BtreeSetMmapLimit(pDb->pBt, size);
+      if( size<0 ) size = sqlite3GlobalConfig.mxMmap;
+      if( pId2->n==0 ) db->mxMmap = size;
+      for(ii=db->nDb-1; ii>=0; ii--){
+        if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){
+          sqlite3BtreeSetMmapLimit(db->aDb[ii].pBt, size);
+        }
+      }
     }
   }else
 
index acb49bf5f9dc14adca8e4803c6c71c006d5a3a83..de1316606b177a4d92dbbf29a3ed92ee0a86dab1 100644 (file)
@@ -1637,6 +1637,19 @@ struct sqlite3_mem_methods {
 ** points to has just been executed. Or, if the fourth parameter is 2, then
 ** the connection being passed as the second parameter is being closed. The
 ** third parameter is passed NULL In this case.
+**
+** [[SQLITE_CONFIG_MMAP_LIMIT]]
+** <dt>SQLITE_CONFIG_MMAP_LIMIT
+** <dd>The sole argument should be a 64-bit integer (an sqlite3_int64) that
+** is the default maximum number of bytes of process address space that
+** should be used for accessing each database file using memory mapping.
+** The default setting can be overridden by each database connection using
+** either the [PRAGMA mmap_limit] command or the "mmaplimit" query parameter
+** on the [URI filename] when opening the databaes file or by using the
+** [SQLITE_FCNTL_MMAP_LIMIT] file control.  The value set here overrides the
+** compile-time default that is set using the [SQLITE_DEFAULT_MMAP_LIMIT]
+** compile-time option.  If the argument to this option is negative, then
+** the memory map limit is set to the compile-time default.
 ** </dl>
 */
 #define SQLITE_CONFIG_SINGLETHREAD  1  /* nil */
@@ -1660,6 +1673,7 @@ struct sqlite3_mem_methods {
 #define SQLITE_CONFIG_GETPCACHE2   19  /* sqlite3_pcache_methods2* */
 #define SQLITE_CONFIG_COVERING_INDEX_SCAN 20  /* int */
 #define SQLITE_CONFIG_SQLLOG       21  /* xSqllog, void* */
+#define SQLITE_CONFIG_MMAP_LIMIT   22  /* sqlite3_int64 */
 
 /*
 ** CAPI3REF: Database Connection Configuration Options
index 129c4c5ea5417e68df838cd9d88ff05c675e4555..d894051790d8073c32ec695d527e7c81decc4493 100644 (file)
@@ -834,6 +834,7 @@ struct sqlite3 {
   int nDb;                      /* Number of backends currently in use */
   int flags;                    /* Miscellaneous flags. See below */
   i64 lastRowid;                /* ROWID of most recent insert (see above) */
+  i64 mxMmap;                   /* Default mmap_limit setting */
   unsigned int openFlags;       /* Flags passed to sqlite3_vfs.xOpen() */
   int errCode;                  /* Most recent error code (SQLITE_*) */
   int errMask;                  /* & result codes with this before returning */
@@ -2505,6 +2506,7 @@ struct Sqlite3Config {
   void *pHeap;                      /* Heap storage space */
   int nHeap;                        /* Size of pHeap[] */
   int mnReq, mxReq;                 /* Min and max heap requests sizes */
+  sqlite3_int64 mxMmap;             /* Maximum mmap() space per open file */
   void *pScratch;                   /* Scratch memory */
   int szScratch;                    /* Size of each scratch buffer */
   int nScratch;                     /* Number of scratch buffers */