]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the SQLITE_CONFIG_PMASZ start-time option.
authordrh <drh@noemail.net>
Fri, 2 Jan 2015 15:55:29 +0000 (15:55 +0000)
committerdrh <drh@noemail.net>
Fri, 2 Jan 2015 15:55:29 +0000 (15:55 +0000)
FossilOrigin-Name: acb0d1e8324f19da3d4d577d58748848de1bcef7

12 files changed:
manifest
manifest.uuid
src/global.c
src/main.c
src/sqlite.h.in
src/sqliteInt.h
src/test_malloc.c
src/vdbesort.c
test/sort.test
test/sort2.test
test/sort4.test
test/sortfault.test

index be8e05d98a4ff759737c0888744ab78dfc03290f..5142e98f04222b76c68ef01b291cb7fe58be3b4d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\slogic\sto\sreleasetest.tcl\sthat\sdetects\s-fsanitize=undefined\serrors.\nFix\sa\sfew\sfalse-positivies\sthat\scome\sup\swhen\srunning\sthe\ssanitize=undefined\ntest.
-D 2015-01-01T23:02:01.908
+C Add\sthe\sSQLITE_CONFIG_PMASZ\sstart-time\soption.
+D 2015-01-02T15:55:29.645
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 335e2d3ff0f2455eacbfa3075fc37495e3321410
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -186,7 +186,7 @@ F src/expr.c 00da3072f362b06f39ce4052baa1d4ce2bb36d1c
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c e0444b61bed271a76840cbe6182df93a9baa3f12
 F src/func.c 6d3c4ebd72aa7923ce9b110a7dc15f9b8c548430
-F src/global.c 6ded36dda9466fc1c9a3c5492ded81d79bf3977d
+F src/global.c 12561d70a1b25f67b21154622bb1723426724f75
 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094
 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
@@ -195,7 +195,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
 F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e
 F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770
 F src/loadext.c 86bd4e2fccd520b748cba52492ab60c4a770f660
-F src/main.c fa2128ef7d6a3dcd6770b2b1f3c284b696f11a2a
+F src/main.c b0a7f3f9ff70106b7735f38c602d1b3ca56eb065
 F src/malloc.c 740db54387204c9a2eb67c6d98e68b08e9ef4eab
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c faf615aafd8be74a71494dfa027c113ea5c6615f
@@ -230,10 +230,10 @@ F src/resolve.c f6c46d3434439ab2084618d603e6d6dbeb0d6ada
 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e
 F src/select.c f377fb8a5c73c10678ea74f3400f7913943e3d75
 F src/shell.c 45d9c9bd7cde07845af957f2d849933b990773cf
-F src/sqlite.h.in 47cb601ed2b2ea7f01119e2763185c809d8e82fa
+F src/sqlite.h.in ed799ff5c814227c7957eb4f4a217f67fdc0da48
 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
 F src/sqlite3ext.h 17d487c3c91b0b8c584a32fbeb393f6f795eea7d
-F src/sqliteInt.h d36da9a07130cae13cbfee0986bf20028cb01465
+F src/sqliteInt.h 3e0079855cb7b3c85dffac5bcbb1cd712ac62e65
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 81712116e826b0089bb221b018929536b2b5406f
 F src/table.c e7a09215315a978057fb42c640f890160dbcc45e
@@ -263,7 +263,7 @@ F src/test_intarray.c 6c610a21ab8edde85a3a2c7f2b069244ecf4d834
 F src/test_intarray.h 9dc57417fb65bc7835cc18548852cc08cc062202
 F src/test_journal.c f5c0a05b7b3d5930db769b5ee6c3766dc2221a64
 F src/test_loadext.c a5251f956ab6af21e138dc1f9c0399394a510cb4
-F src/test_malloc.c ba34143f941a9d74b30bbffc8818389bb73a1ca2
+F src/test_malloc.c fffc66b2e7743ce93f039187d3fd78664193c664
 F src/test_multiplex.c caadb62cc777268b4f8fb94d5b27b80156c8f7c0
 F src/test_multiplex.h c08e4e8f8651f0c5e0509b138ff4d5b43ed1f5d3
 F src/test_mutex.c 293042d623ebba969160f471a82aa1551626454f
@@ -298,7 +298,7 @@ F src/vdbeapi.c 4bc511a46b9839392ae0e90844a71dc96d9dbd71
 F src/vdbeaux.c 07ef87c6d4b5abdf13ff33babb10205702fdab0a
 F src/vdbeblob.c 4af4bfb71f6df7778397b4a0ebc1879793276778
 F src/vdbemem.c 31d8eabb0cd78bfeab4e5124c7363c3e9e54db9f
-F src/vdbesort.c 80e40d889ebb536cb7a5ac4c12fa2a4662bc9181
+F src/vdbesort.c fc1aa0d1a8b539bf3a272945d02c9f9ede93039b
 F src/vdbetrace.c 7e4222955e07dd707a2f360c0eb73452be1cb010
 F src/vtab.c c08ec66f45919eaa726bf88aa53eb08379d607f9
 F src/wal.c 85353539f2d9d0c91ebd057c32525b1e1aa3335e
@@ -869,12 +869,12 @@ F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2
 F test/skipscan6.test 5866039d03a56f5bd0b3d172a012074a1d90a15b
 F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f
 F test/softheap1.test 40562fe6cac6d9827b7b42b86d45aedf12c15e24
-F test/sort.test c4400e7533748f6bd7413851ff148645e82b9e2d
-F test/sort2.test 84a92eebf697feee9c6697746918c7d67373eea1
+F test/sort.test 3f492e5b7be1d3f756728d2ff6edf4f6091e84cb
+F test/sort2.test 37afbc03f5559f2eb0f18940b55d38dfbb5172ac
 F test/sort3.test 6178ade30810ac9166fcdf14b7065e49c0f534e2
-F test/sort4.test 6c37d85f7cd28d50cce222fcab84ccd771e105cb
+F test/sort4.test d5e8903194ae551551349ce25dc8d0b40ca2b9c3
 F test/sort5.test a448240a42b49239edc00f85d6d7ac7a1b261e1f
-F test/sortfault.test b8e35177f97438b930ee87c9419ca2599e8073e1
+F test/sortfault.test d4ccf606a0c77498e2beb542764fd9394acb4d66
 F test/speed1.test f2974a91d79f58507ada01864c0e323093065452
 F test/speed1p.explain d841e650a04728b39e6740296b852dccdca9b2cb
 F test/speed1p.test b180e98609c7677382cf618c0ec9b69f789033a8
@@ -1234,7 +1234,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P c55c05fe22b9ddb61de55d473a411a11090d3d68
-R e6aaf3935879f250648e86cbf64d3bdf
+P 2835e79a0afec6e4d449ac9340afec068c2d4c11
+R 382d23526375da181cc875b46066d9ad
 U drh
-Z 20260de80f5f5cb2f8311d6a05cba05e
+Z bc81c476960284f7c54d9feff6b6453a
index b69d1dbdb9ba52b3150ac707abfaa60c3637e605..4fa42f8241ae75d41a8ec49dea3d8e84d4cf5e08 100644 (file)
@@ -1 +1 @@
-2835e79a0afec6e4d449ac9340afec068c2d4c11
\ No newline at end of file
+acb0d1e8324f19da3d4d577d58748848de1bcef7
\ No newline at end of file
index 4bc8edb3bc7457fb7210b039fa57ae5455c16874..c7043bba48fc74f79976459a06c07cf695b2bb98 100644 (file)
@@ -152,6 +152,13 @@ const unsigned char sqlite3CtypeMap[256] = {
 # define SQLITE_ALLOW_COVERING_INDEX_SCAN 1
 #endif
 
+/* The minimum PMA size is set to this value multiplied by the database
+** page size in bytes.
+*/
+#ifndef SQLITE_SORTER_PMASZ
+# define SQLITE_SORTER_PMASZ 250
+#endif
+
 /*
 ** The following singleton contains the global configuration for
 ** the SQLite library.
@@ -182,6 +189,7 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = {
    0,                         /* nPage */
    0,                         /* mxParserStack */
    0,                         /* sharedCacheEnabled */
+   SQLITE_SORTER_PMASZ,       /* szPma */
    /* All the rest should always be initialized to zero */
    0,                         /* isInit */
    0,                         /* inProgress */
index 3220cfe8f69868e1a56ea7624ca811adc54c1635..8af34cc2f10bb58bd30abdab3cafaf127d2557df 100644 (file)
@@ -594,6 +594,11 @@ int sqlite3_config(int op, ...){
     }
 #endif
 
+    case SQLITE_CONFIG_PMASZ: {
+      sqlite3GlobalConfig.szPma = va_arg(ap, unsigned int);
+      break;
+    }
+
     default: {
       rc = SQLITE_ERROR;
       break;
index b525b396f4c5319e72034e03cfb19b2a693f4d98..e13ee0acc9354329ab1d7594d5f51f4b3a028eda 100644 (file)
@@ -1745,6 +1745,17 @@ struct sqlite3_mem_methods {
 ** bytes per page required for each page in [SQLITE_CONFIG_PAGECACHE].
 ** The amount of extra space required can change depending on the compiler,
 ** target platform, and SQLite version.
+**
+** [[SQLITE_CONFIG_PMASZ]]
+** <dt>SQLITE_CONFIG_PMASZ
+** <dd>^The SQLITE_CONFIG_PMASZ option takes a single parameter which
+** is an unsigned integer and sets the "Minimum PMA Size" for the multithreaded
+** sorter to that integer.  The default minimum PMA Size is set by the
+** [SQLITE_SORTER_PMASZ] compile-time option.  New threads are launched
+** to help with sort operations when multithreaded sorting
+** is enabled (using the [PRAGMA threads] command) and the amount of content
+** to be sorted exceeds the page size times the minimum of the
+** [PRAGMA cache_size] setting and this value.
 ** </dl>
 */
 #define SQLITE_CONFIG_SINGLETHREAD  1  /* nil */
@@ -1771,6 +1782,7 @@ struct sqlite3_mem_methods {
 #define SQLITE_CONFIG_MMAP_SIZE    22  /* sqlite3_int64, sqlite3_int64 */
 #define SQLITE_CONFIG_WIN32_HEAPSIZE      23  /* int nByte */
 #define SQLITE_CONFIG_PCACHE_HDRSZ        24  /* int *psz */
+#define SQLITE_CONFIG_PMASZ               25  /* unsigned int szPma */
 
 /*
 ** CAPI3REF: Database Connection Configuration Options
index d90089ba0ee33df3e2bd3141df87b2a1116b4b58..4a4137f0f64ef5aaab5e7170efd81fd0bd2db396 100644 (file)
@@ -2839,6 +2839,7 @@ struct Sqlite3Config {
   int nPage;                        /* Number of pages in pPage[] */
   int mxParserStack;                /* maximum depth of the parser stack */
   int sharedCacheEnabled;           /* true if shared-cache mode enabled */
+  u32 szPma;                        /* Maximum Sorter PMA size */
   /* The above might be initialized to non-zero.  The following need to always
   ** initially be zero, however. */
   int isInit;                       /* True after initialization has finished */
index bd0a3d1ffd2cc95131c43db362eba580533084a0..54a89472d04f0b29ff706d86e04a6b4d02d8f709 100644 (file)
@@ -1260,6 +1260,34 @@ static int test_config_cis(
   return TCL_OK;
 }
 
+/*
+** Usage:    sqlite3_config_pmasz  INTEGER
+**
+** Set the minimum PMA size.
+*/
+static int test_config_pmasz(
+  void * clientData, 
+  Tcl_Interp *interp,
+  int objc,
+  Tcl_Obj *CONST objv[]
+){
+  int rc;
+  int iPmaSz;
+
+  if( objc!=2 ){
+    Tcl_WrongNumArgs(interp, 1, objv, "BOOL");
+    return TCL_ERROR;
+  }
+  if( Tcl_GetIntFromObj(interp, objv[1], &iPmaSz) ){
+    return TCL_ERROR;
+  }
+
+  rc = sqlite3_config(SQLITE_CONFIG_PMASZ, iPmaSz);
+  Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_VOLATILE);
+
+  return TCL_OK;
+}
+
 
 /*
 ** Usage:    sqlite3_dump_memsys3  FILENAME
@@ -1514,6 +1542,7 @@ int Sqlitetest_malloc_Init(Tcl_Interp *interp){
      { "sqlite3_config_error",       test_config_error             ,0 },
      { "sqlite3_config_uri",         test_config_uri               ,0 },
      { "sqlite3_config_cis",         test_config_cis               ,0 },
+     { "sqlite3_config_pmasz",       test_config_pmasz             ,0 },
      { "sqlite3_db_config_lookaside",test_db_config_lookaside      ,0 },
      { "sqlite3_dump_memsys3",       test_dump_memsys3             ,3 },
      { "sqlite3_dump_memsys5",       test_dump_memsys3             ,5 },
index d022af9af600011f284d79b5eaab9572cafd7999..0d16324e2a7c8ebefd3705dd9dddd5a8f3ddebe8 100644 (file)
 ** to a level 0 PMA. The purpose of this limit is to prevent various integer
 ** overflows. 512MiB.
 */
-#define SQLITE_MAX_MXPMASIZE    (1<<29)
+#define SQLITE_MAX_PMASZ    (1<<29)
 
 /*
 ** Private objects used by the sorter
@@ -448,11 +448,6 @@ struct SorterRecord {
 */
 #define SRVAL(p) ((void*)((SorterRecord*)(p) + 1))
 
-/* The minimum PMA size is set to this value multiplied by the database
-** page size in bytes.  */
-#ifndef SQLITE_SORTER_PMASZ
-# define SQLITE_SORTER_PMASZ 10
-#endif
 
 /* Maximum number of PMAs that a single MergeEngine can merge */
 #define SORTER_MAX_MERGE_COUNT 16
@@ -851,10 +846,11 @@ int sqlite3VdbeSorterInit(
     }
 
     if( !sqlite3TempInMemory(db) ){
-      pSorter->mnPmaSize = SQLITE_SORTER_PMASZ * pgsz;
+      u32 szPma = sqlite3GlobalConfig.szPma;
+      pSorter->mnPmaSize = szPma * pgsz;
       mxCache = db->aDb[0].pSchema->cache_size;
-      if( mxCache<SQLITE_SORTER_PMASZ ) mxCache = SQLITE_SORTER_PMASZ;
-      pSorter->mxPmaSize = MIN((i64)mxCache*pgsz, SQLITE_MAX_MXPMASIZE);
+      if( mxCache<szPma ) mxCache = szPma;
+      pSorter->mxPmaSize = MIN((i64)mxCache*pgsz, SQLITE_MAX_PMASZ);
 
       /* EVIDENCE-OF: R-26747-61719 When the application provides any amount of
       ** scratch memory using SQLITE_CONFIG_SCRATCH, SQLite avoids unnecessary
index be2a6f531c05826cf85fbd1f60044ca62f9d0650..21b11d6c8818e239bee4f071290a1301bb995675 100644 (file)
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix sort
+db close
+sqlite3_shutdown
+sqlite3_config_pmasz 10
+sqlite3_initialize
+sqlite3 db test.db
 
 # Create a bunch of data to sort against
 #
index a4c55c9f2481c3ce410a50de49655be99968c604..890025a5d0c5cf4692e6cc70f7cbcfdad8fff285 100644 (file)
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix sort2
+db close
+sqlite3_shutdown
+sqlite3_config_pmasz 10
+sqlite3_initialize
+sqlite3 db test.db
 
 foreach {tn script} {
   1 { }
index 01fcbfee95bd7dded149141a9783c7f66892a802..7b913610da9b74170bc8ffcd95194900ed28e031 100644 (file)
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix sort4
+db close
+sqlite3_shutdown
+sqlite3_config_pmasz 10
+sqlite3_initialize
+sqlite3 db test.db
+
 
 # Configure the sorter to use 3 background threads.
 db eval {PRAGMA threads=3}
index a1983ac1c0b8c251deb336df005edbf451348d3a..f9fe2be48af0383c0d1a867f3a506dfb85701d82 100644 (file)
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix sortfault
+db close
+sqlite3_shutdown
+sqlite3_config_pmasz 10
+sqlite3_initialize
+sqlite3 db test.db
+
 
 do_execsql_test 1.0 {
   PRAGMA cache_size = 5;