gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/sort5.test (about) 1 # 2014 September 15. 2 # 3 # The author disclaims copyright to this source code. In place of 4 # a legal notice, here is a blessing: 5 # 6 # May you do good and not evil. 7 # May you find forgiveness for yourself and forgive others. 8 # May you share freely, never taking more than you give. 9 # 10 #*********************************************************************** 11 # This file implements regression tests for SQLite library. 12 # 13 14 set testdir [file dirname $argv0] 15 source $testdir/tester.tcl 16 set testprefix sort5 17 18 19 #------------------------------------------------------------------------- 20 # Verify that sorting works with a version 1 sqlite3_io_methods structure. 21 # 22 testvfs tvfs -iversion 1 -default true 23 reset_db 24 do_execsql_test 1.0 { 25 PRAGMA mmap_size = 10000000; 26 PRAGMA cache_size = 10; 27 CREATE TABLE t1(a, b); 28 } {0} 29 30 do_test 1.1 { 31 execsql BEGIN 32 for {set i 0} {$i < 2000} {incr i} { 33 execsql { INSERT INTO t1 VALUES($i, randomblob(2000)) } 34 } 35 execsql COMMIT 36 } {} 37 38 do_execsql_test 1.2 { 39 CREATE INDEX i1 ON t1(b); 40 } 41 42 db close 43 tvfs delete 44 45 #------------------------------------------------------------------------- 46 # Test that the PMA size is determined correctly. The PMA size should be 47 # roughly the same amount of memory allocated to the main pager cache, or 48 # 250 pages if this is larger. 49 # 50 testvfs tvfs 51 tvfs script tv_callback 52 tvfs filter {xOpen xWrite} 53 54 proc tv_callback {method args} { 55 global iTemp 56 global F 57 switch $method { 58 xOpen { 59 if {[lindex $args 0]==""} { return "temp[incr iTemp]" } 60 return "SQLITE_OK" 61 } 62 63 xWrite { 64 foreach {filename id off amt} $args {} 65 if {[info exists F($id)]==0 || $F($id)<($off + $amt)} { 66 set F($id) [expr $off+$amt] 67 } 68 } 69 } 70 } 71 72 catch { db close } 73 forcedelete test.db 74 sqlite3 db test.db -vfs tvfs 75 execsql { CREATE TABLE t1(x) } 76 execsql { PRAGMA temp_store = 1 } 77 78 # Each iteration of the following loop attempts to sort 10001 records 79 # each a bit over 100 bytes in size. In total a little more than 1MiB 80 # of data. 81 # 82 foreach {tn pgsz cachesz bTemp} { 83 1 4096 1000 0 84 2 1024 1000 1 85 86 3 4096 -1000 1 87 4 1024 -1000 1 88 89 5 4096 -9000 0 90 6 1024 -9000 0 91 } { 92 if {$::TEMP_STORE>2} { 93 set bTemp 0 94 } 95 do_execsql_test 2.$tn.0 " 96 PRAGMA page_size = $pgsz; 97 VACUUM; 98 PRAGMA cache_size = $cachesz; 99 " 100 101 if {[db one {PRAGMA page_size}]!=$pgsz} { 102 # SEE is not able to change page sizes and that messes up the 103 # results that follow. 104 continue 105 } 106 107 do_test 2.$tn.1 { 108 set ::iTemp 0 109 catch { array unset F } 110 execsql { 111 WITH x(i, j) AS ( 112 SELECT 1, randomblob(100) 113 UNION ALL 114 SELECT i+1, randomblob(100) FROM x WHERE i<10000 115 ) 116 SELECT * FROM x ORDER BY j; 117 } 118 expr {[array names F]!=""} 119 } $bTemp 120 } 121 122 finish_test