]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Update an allocation routine in the sessions module to allow it to allocate the maxim...
authordan <Dan Kennedy>
Tue, 25 May 2021 15:21:54 +0000 (15:21 +0000)
committerdan <Dan Kennedy>
Tue, 25 May 2021 15:21:54 +0000 (15:21 +0000)
FossilOrigin-Name: 0b45e821911e4a852edd6d9e9cfe5f9de33337edf76fb12b79adaf11a4b83e8a

ext/session/sessionbig.test [new file with mode: 0644]
ext/session/sqlite3session.c
manifest
manifest.uuid
test/permutations.test

diff --git a/ext/session/sessionbig.test b/ext/session/sessionbig.test
new file mode 100644 (file)
index 0000000..1470902
--- /dev/null
@@ -0,0 +1,98 @@
+# 2014 August 16
+#
+# 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.
+#
+#***********************************************************************
+#
+# This file implements regression tests for sessions SQLite extension.
+# Specifically, this file contains tests for "patchset" changes.
+#
+
+if {![info exists testdir]} {
+  set testdir [file join [file dirname [info script]] .. .. test]
+} 
+source [file join [file dirname [info script]] session_common.tcl]
+source $testdir/tester.tcl
+ifcapable !session {finish_test; return}
+
+set testprefix sessionbig
+
+forcedelete test.db2
+sqlite3 db2 test.db2
+
+do_execsql_test 1.0 {
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
+}
+do_execsql_test -db db2 1.1 {
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
+}
+
+do_test 1.2 {
+  do_then_apply_sql {
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+  }
+} {}
+
+do_test 1.3 {
+  execsql { DELETE FROM t1 }
+  execsql2 { DELETE FROM t1 }
+} {}
+
+do_test 1.4 {
+  set rc [catch {
+  do_then_apply_sql {
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+    INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) );
+  }
+  } msg]
+  list $rc $msg
+} {1 SQLITE_NOMEM}
+
+
+finish_test
+
index 1f6c58b4db67af84d096dd21930e1a172d7f1c9f..c96363b604705cfb136d1d2280d0d9abfa81b3ce 100644 (file)
@@ -1974,13 +1974,29 @@ int sqlite3session_attach(
 ** If successful, return zero. Otherwise, if an OOM condition is encountered,
 ** set *pRc to SQLITE_NOMEM and return non-zero.
 */
-static int sessionBufferGrow(SessionBuffer *p, size_t nByte, int *pRc){
-  if( *pRc==SQLITE_OK && (size_t)(p->nAlloc-p->nBuf)<nByte ){
+static int sessionBufferGrow(SessionBuffer *p, i64 nByte, int *pRc){
+#define SESSION_MAX_BUFFER_SZ (0x7FFFFF00 - 1) 
+  i64 nReq = p->nBuf + nByte;
+  if( *pRc==SQLITE_OK && nReq>p->nAlloc ){
     u8 *aNew;
     i64 nNew = p->nAlloc ? p->nAlloc : 128;
+
     do {
       nNew = nNew*2;
-    }while( (size_t)(nNew-p->nBuf)<nByte );
+    }while( nNew<nReq );
+
+    /* The value of SESSION_MAX_BUFFER_SZ is copied from the implementation
+    ** of sqlite3_realloc64(). Allocations greater than this size in bytes
+    ** always fail. It is used here to ensure that this routine can always
+    ** allocate up to this limit - instead of up to the largest power of
+    ** two smaller than the limit.  */
+    if( nNew>SESSION_MAX_BUFFER_SZ ){
+      nNew = SESSION_MAX_BUFFER_SZ;
+      if( nNew<nReq ){
+        *pRc = SQLITE_NOMEM;
+        return 1;
+      }
+    }
 
     aNew = (u8 *)sqlite3_realloc64(p->aBuf, nNew);
     if( 0==aNew ){
index 890839994848ec713ee7aeb70593db4c8b6b0f26..0e955af7e099b7290238a736422cce673ca6a48b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sthe\sshell\stool\s".dump\sPATTERN"\scommand\sso\sthat\sit\sdumps\sthe\scontents\sof\sshadow\stables\swhen\sa\svirtual\stable\sis\sidentified\sby\sthe\sPATTERN.
-D 2021-05-25T11:39:14.912
+C Update\san\sallocation\sroutine\sin\sthe\ssessions\smodule\sto\sallow\sit\sto\sallocate\sthe\smaximum\ssize\spermitted\sby\ssqlite3_realloc64().
+D 2021-05-25T15:21:54.821
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -446,6 +446,7 @@ F ext/session/sessionH.test b17afdbd3b8f17e9bab91e235acf167cf35485db2ab2df0ea889
 F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f46840172e9a01e8cc53e
 F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3
 F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec
+F ext/session/sessionbig.test 2a12fabf53f079042ac00e2ff01a445e774f4d4eedd54a1ada27b25c14e780d9
 F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec
 F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7
 F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181332da26f29cddd7bb
@@ -456,7 +457,7 @@ F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2
 F ext/session/sessionsize.test 6f644aff31c7f1e4871e9ff3542766e18da68fc7e587b83a347ea9820a002dd8
 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5
 F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc
-F ext/session/sqlite3session.c 703634ca25b4b903ae8ec25045802a8c8deca36a65d2b993c4bc8888f6d6c7ee
+F ext/session/sqlite3session.c af0cb1163e224b286a9cba3c1ad877d927821e6a0e317c29b289a16e5da378a8
 F ext/session/sqlite3session.h 0907de79bc13a2e3af30a6dc29acc60792a3eaf7d33d44cf52500d0f3c2b2171
 F ext/session/test_session.c f433f68a8a8c64b0f5bc74dc725078f12483301ad4ae8375205eef790274a787
 F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
@@ -1266,7 +1267,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c
 F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b
 F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442
 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff
-F test/permutations.test 9bb03106a024e9938d329a33380ea7fd91b6e45516881db68663505c444b3242
+F test/permutations.test 63da39a4234eed2ccd10bf7872de58e24d53a50d11014dc8a8ab9f252368e880
 F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f
 F test/pragma.test 50b91bedea9324d3ab48e793f908ee7d2c7dcf84bfa2281e792838be59641ec8
 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f
@@ -1915,7 +1916,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 17960165f5840cab45b7a8bb02779ebfb321c68f33ec6da9ab14063ccd134fa4
-R 566b3231aafb0b1c4d92f8d47e61c4a9
+P b0bc5ab9ceec496ac260ccfd53b51a2b53a81576fbe04c97b99f6705b063c59f
+R ef39c7464543ee69b4de0503a2bec5a4
 U dan
-Z b40b0f8d44019306141de12b3f25d01c
+Z c10587a9d81e2ad7ca989feae2bbdfdd
index a459b9cd7fd6e1afbd526e3603caef0289dee0d2..b5b0f665d7593abc0a70b9291f4418ea5698d273 100644 (file)
@@ -1 +1 @@
-b0bc5ab9ceec496ac260ccfd53b51a2b53a81576fbe04c97b99f6705b063c59f
\ No newline at end of file
+0b45e821911e4a852edd6d9e9cfe5f9de33337edf76fb12b79adaf11a4b83e8a
\ No newline at end of file
index ed39c79a0f63e814bd87236183a87057f2b2a9db..b652f8571c5edea3e8c45a3a583620d6b0bec0c6 100644 (file)
@@ -131,6 +131,7 @@ set allquicktests [test_set $alltests -exclude {
   fts3defer.test fts4langid.test fts3sort.test fts5unicode.test
 
   rtree4.test
+  sessionbig.test
 }]
 if {[info exists ::env(QUICKTEST_INCLUDE)]} {
   set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)]