SQLite

Check-in [0b45e82191]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Update an allocation routine in the sessions module to allow it to allocate the maximum size permitted by sqlite3_realloc64().
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 0b45e821911e4a852edd6d9e9cfe5f9de33337edf76fb12b79adaf11a4b83e8a
User & Date: dan 2021-05-25 15:21:54.821
Context
2021-05-25
16:10
Do not run sessionbig.test as part of the session_strm permutation. It is too slow. (check-in: 708ce7ad8a user: dan tags: trunk)
15:21
Update an allocation routine in the sessions module to allow it to allocate the maximum size permitted by sqlite3_realloc64(). (check-in: 0b45e82191 user: dan tags: trunk)
11:39
Enhance the shell tool ".dump PATTERN" command so that it dumps the contents of shadow tables when a virtual table is identified by the PATTERN. (check-in: b0bc5ab9ce user: dan tags: trunk)
Changes
Unified Diff Ignore Whitespace Patch
Added ext/session/sessionbig.test.




































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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

Changes to ext/session/sqlite3session.c.
1970
1971
1972
1973
1974
1975
1976
1977


1978
1979
1980

1981
1982

1983












1984
1985
1986
1987
1988
1989
1990
/*
** Ensure that there is room in the buffer to append nByte bytes of data.
** If not, use sqlite3_realloc() to grow the buffer so that there is.
**
** 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 ){
    u8 *aNew;
    i64 nNew = p->nAlloc ? p->nAlloc : 128;

    do {
      nNew = nNew*2;

    }while( (size_t)(nNew-p->nBuf)<nByte );













    aNew = (u8 *)sqlite3_realloc64(p->aBuf, nNew);
    if( 0==aNew ){
      *pRc = SQLITE_NOMEM;
    }else{
      p->aBuf = aNew;
      p->nAlloc = nNew;







|
>
>
|


>


>
|
>
>
>
>
>
>
>
>
>
>
>
>







1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
/*
** Ensure that there is room in the buffer to append nByte bytes of data.
** If not, use sqlite3_realloc() to grow the buffer so that there is.
**
** 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, 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( 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 ){
      *pRc = SQLITE_NOMEM;
    }else{
      p->aBuf = aNew;
      p->nAlloc = nNew;
Changes to test/permutations.test.
127
128
129
130
131
132
133

134
135
136
137
138
139
140

  fts4merge.test fts4merge2.test fts4merge4.test fts4check.test
  fts4merge5.test
  fts3cov.test fts3snippet.test fts3corrupt2.test fts3an.test
  fts3defer.test fts4langid.test fts3sort.test fts5unicode.test

  rtree4.test

}]
if {[info exists ::env(QUICKTEST_INCLUDE)]} {
  set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)]
}
if {[info exists ::env(QUICKTEST_OMIT)]} {
  # If environment variable QUICKTEST_OMIT is set, it is a comma-separated
  # list of regular expressions to match against test file names in







>







127
128
129
130
131
132
133
134
135
136
137
138
139
140
141

  fts4merge.test fts4merge2.test fts4merge4.test fts4check.test
  fts4merge5.test
  fts3cov.test fts3snippet.test fts3corrupt2.test fts3an.test
  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)]
}
if {[info exists ::env(QUICKTEST_OMIT)]} {
  # If environment variable QUICKTEST_OMIT is set, it is a comma-separated
  # list of regular expressions to match against test file names in