# 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) } # 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 } { 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