sqlite/test/sort5.test

123 lines
2.7 KiB
Plaintext
Raw Normal View History

# 2014 September 15.
#
# 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.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix sort5
#-------------------------------------------------------------------------
# Verify that sorting works with a version 1 sqlite3_io_methods structure.
#
testvfs tvfs -iversion 1 -default true
reset_db
do_execsql_test 1.0 {
PRAGMA mmap_size = 10000000;
PRAGMA cache_size = 10;
CREATE TABLE t1(a, b);
} {0}
do_test 1.1 {
execsql BEGIN
for {set i 0} {$i < 2000} {incr i} {
execsql { INSERT INTO t1 VALUES($i, randomblob(2000)) }
}
execsql COMMIT
} {}
do_execsql_test 1.2 {
CREATE INDEX i1 ON t1(b);
}
db close
tvfs delete
#-------------------------------------------------------------------------
# Test that the PMA size is determined correctly. The PMA size should be
# roughly the same amount of memory allocated to the main pager cache, or
# 250 pages if this is larger.
#
testvfs tvfs
tvfs script tv_callback
tvfs filter {xOpen xWrite}
proc tv_callback {method args} {
global iTemp
global F
switch $method {
xOpen {
if {[lindex $args 0]==""} { return "temp[incr iTemp]" }
return "SQLITE_OK"
}
xWrite {
foreach {filename id off amt} $args {}
if {[info exists F($id)]==0 || $F($id)<($off + $amt)} {
set F($id) [expr $off+$amt]
}
}
}
}
catch { db close }
forcedelete test.db
sqlite3 db test.db -vfs tvfs
execsql { CREATE TABLE t1(x) }
execsql { PRAGMA temp_store = 1 }
# Each iteration of the following loop attempts to sort 10001 records
# each a bit over 100 bytes in size. In total a little more than 1MiB
# of data.
#
foreach {tn pgsz cachesz bTemp} {
1 4096 1000 0
2 1024 1000 1
3 4096 -1000 1
4 1024 -1000 1
5 4096 -9000 0
6 1024 -9000 0
} {
if {$::TEMP_STORE>2} {
set bTemp 0
}
do_execsql_test 2.$tn.0 "
PRAGMA page_size = $pgsz;
VACUUM;
PRAGMA cache_size = $cachesz;
"
if {[db one {PRAGMA page_size}]!=$pgsz} {
# SEE is not able to change page sizes and that messes up the
# results that follow.
continue
}
do_test 2.$tn.1 {
set ::iTemp 0
catch { array unset F }
execsql {
WITH x(i, j) AS (
SELECT 1, randomblob(100)
UNION ALL
SELECT i+1, randomblob(100) FROM x WHERE i<10000
)
SELECT * FROM x ORDER BY j;
}
expr {[array names F]!=""}
} $bTemp
}
finish_test