sqlite/test/bigmmap.test
drh 1da477d3ab Change the fake_big_file test command so that it fails for files larger than
2MB on Windows, as we have observed that Window10 will sometimes bluescreen
when operating on very large sparse files.

FossilOrigin-Name: d39ffd2abadcc85c46ba17612f9f575005b4818e18bf39362b8ee574837cfad9
2022-11-14 18:57:21 +00:00

109 lines
3.1 KiB
Plaintext

# 2017 August 07
#
# 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 SQLite library. The
# focus of this script testing the ability of SQLite to use mmap
# to access files larger than 4GiB.
#
if {[file exists skip-big-file]} return
if {$tcl_platform(os)=="Darwin"} return
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix bigmmap
ifcapable !mmap||!vtab {
finish_test
return
}
set mmap_limit 0
db eval {
SELECT compile_options AS x FROM pragma_compile_options
WHERE x LIKE 'max_mmap_size=%'
} {
regexp {MAX_MMAP_SIZE=([0-9]*)} $x -> mmap_limit
}
if {$mmap_limit < [expr 8 * 1<<30]} {
puts "Skipping bigmmap.test - requires SQLITE_MAX_MMAP_SIZE >= 8G"
finish_test
return
}
#-------------------------------------------------------------------------
# Create the database file roughly 8GiB in size. Most pages are unused,
# except that there is a table and index clustered around each 1GiB
# boundary.
#
do_execsql_test 1.0 {
PRAGMA page_size = 4096;
CREATE TABLE t0(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c));
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 100 )
INSERT INTO t0 SELECT i, 't0', randomblob(800) FROM s;
}
for {set i 1} {$i < 8} {incr i} {
if {[catch {fake_big_file [expr $i*1024] [get_pwd]/test.db}]} {
puts "Cannot create ${i}MB sparse file"
finish_test
return
}
hexio_write test.db 28 [format %.8x [expr ($i*1024*1024*1024/4096) - 5]]
do_execsql_test 1.$i "
CREATE TABLE t$i (a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c));
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 100 )
INSERT INTO t$i SELECT i, 't$i', randomblob(800) FROM s;
"
}
#-------------------------------------------------------------------------
# Check that data can be retrieved from the db with a variety of
# configured mmap size limits.
#
for {set i 0} {$i < 9} {incr i} {
# Configure a memory mapping $i GB in size.
#
set val [expr $i*1024*1024*1024]
execsql "PRAGMA main.mmap_size = $val"
do_execsql_test 2.$i.0 {
PRAGMA main.mmap_size
} $val
for {set t 0} {$t < 8} {incr t} {
do_execsql_test 2.$i.$t.1 "
SELECT count(*) FROM t$t;
SELECT count(b || c) FROM t$t GROUP BY b;
" {100 100}
do_execsql_test 2.$i.$t.2 "
SELECT * FROM t$t AS o WHERE
NOT EXISTS( SELECT * FROM t$t AS i WHERE a=o.a AND +b=o.b AND +c=o.c )
ORDER BY b, c;
" {}
do_eqp_test 2.$i.$t.3 "
SELECT * FROM t$t AS o WHERE
NOT EXISTS( SELECT * FROM t$t AS i WHERE a=o.a AND +b=o.b AND +c=o.c )
ORDER BY b, c;
" [string map {"\n " "\n"} "
QUERY PLAN
|--SCAN o USING COVERING INDEX sqlite_autoindex_t${t}_1
`--CORRELATED SCALAR SUBQUERY xxxxxx
`--SEARCH i USING INTEGER PRIMARY KEY (rowid=?)
"]
}
}
finish_test