18daefc2aSdan# 2014 March 25. 28daefc2aSdan# 38daefc2aSdan# The author disclaims copyright to this source code. In place of 48daefc2aSdan# a legal notice, here is a blessing: 58daefc2aSdan# 68daefc2aSdan# May you do good and not evil. 78daefc2aSdan# May you find forgiveness for yourself and forgive others. 88daefc2aSdan# May you share freely, never taking more than you give. 98daefc2aSdan# 108daefc2aSdan#*********************************************************************** 118daefc2aSdan# This file implements regression tests for SQLite library. 128daefc2aSdan# 130d51def2Sdan# The tests in this file verify that sorting works when the library is 140d51def2Sdan# configured to use mmap(), but the temporary files generated by the 150d51def2Sdan# sorter are too large to be completely mapped. 160d51def2Sdan# 178daefc2aSdan 188daefc2aSdanset testdir [file dirname $argv0] 198daefc2aSdansource $testdir/tester.tcl 208daefc2aSdanset testprefix sort3 218daefc2aSdan 22*be7721d1Sdan#------------------------------------------------------------------------- 23*be7721d1Sdan# Sort some large ( > 4KiB) records. 24*be7721d1Sdan# 25*be7721d1Sdanproc cksum {x} { 26*be7721d1Sdan set i1 1 27*be7721d1Sdan set i2 2 28*be7721d1Sdan binary scan $x c* L 29*be7721d1Sdan foreach {a b} $L { 30*be7721d1Sdan set i1 [expr (($i2<<3) + $a) & 0x7FFFFFFF] 31*be7721d1Sdan set i2 [expr (($i1<<3) + $b) & 0x7FFFFFFF] 32*be7721d1Sdan } 33*be7721d1Sdan list $i1 $i2 34*be7721d1Sdan} 35*be7721d1Sdandb func cksum cksum 36*be7721d1Sdan 37*be7721d1Sdando_execsql_test 1.0 { 38*be7721d1Sdan PRAGMA cache_size = 5; 39*be7721d1Sdan CREATE TABLE t11(a, b); 40*be7721d1Sdan INSERT INTO t11 VALUES(randomblob(5000), NULL); 41*be7721d1Sdan INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --2 42*be7721d1Sdan INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --3 43*be7721d1Sdan INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --4 44*be7721d1Sdan INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --5 45*be7721d1Sdan INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --6 46*be7721d1Sdan INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --7 47*be7721d1Sdan INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --8 48*be7721d1Sdan INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --9 49*be7721d1Sdan UPDATE t11 SET b = cksum(a); 50*be7721d1Sdan} 51*be7721d1Sdan 52*be7721d1Sdanforeach {tn mmap_limit} { 53*be7721d1Sdan 1 0 54*be7721d1Sdan 2 1000000 55*be7721d1Sdan} { 56*be7721d1Sdan do_test 1.$tn { 57*be7721d1Sdan sqlite3_test_control SQLITE_TESTCTRL_SORTER_MMAP db $mmap_limit 58*be7721d1Sdan set prev "" 59*be7721d1Sdan db eval { SELECT * FROM t11 ORDER BY b } { 60*be7721d1Sdan if {$b != [cksum $a]} {error "checksum failed"} 61*be7721d1Sdan if {[string compare $b $prev] < 0} {error "sort failed"} 62*be7721d1Sdan set prev $b 63*be7721d1Sdan } 64*be7721d1Sdan set {} {} 65*be7721d1Sdan } {} 66*be7721d1Sdan} 67*be7721d1Sdan 68*be7721d1Sdan 698daefc2aSdan# Sort roughly 20MB of data. Once with a mmap limit of 5MB and once without. 708daefc2aSdan# 718daefc2aSdanforeach {itest limit} { 728daefc2aSdan 1 5000000 738daefc2aSdan 2 0x7FFFFFFF 748daefc2aSdan} { 758daefc2aSdan sqlite3_test_control SQLITE_TESTCTRL_SORTER_MMAP db $limit 76*be7721d1Sdan do_execsql_test 2.$itest { 778daefc2aSdan WITH r(x,y) AS ( 788daefc2aSdan SELECT 1, randomblob(1000) 798daefc2aSdan UNION ALL 808daefc2aSdan SELECT x+1, randomblob(1000) FROM r 818daefc2aSdan LIMIT 20000 828daefc2aSdan ) 838daefc2aSdan SELECT count(*), sum(length(y)) FROM r GROUP BY (x%5); 848daefc2aSdan } { 858daefc2aSdan 4000 4000000 868daefc2aSdan 4000 4000000 878daefc2aSdan 4000 4000000 888daefc2aSdan 4000 4000000 898daefc2aSdan 4000 4000000 908daefc2aSdan } 918daefc2aSdan} 928daefc2aSdan 938daefc2aSdan# Sort more than 2GB of data. At one point this was causing a problem. 948daefc2aSdan# This test might take one minute or more to run. 958daefc2aSdan# 96*be7721d1Sdando_execsql_test 3 { 978daefc2aSdan PRAGMA cache_size = 20000; 988daefc2aSdan WITH r(x,y) AS ( 998daefc2aSdan SELECT 1, randomblob(1000) 1008daefc2aSdan UNION ALL 1018daefc2aSdan SELECT x+1, randomblob(1000) FROM r 1028daefc2aSdan LIMIT 2200000 1038daefc2aSdan ) 1048daefc2aSdan SELECT count(*), sum(length(y)) FROM r GROUP BY (x%5); 1058daefc2aSdan} { 1068daefc2aSdan 440000 440000000 1078daefc2aSdan 440000 440000000 1088daefc2aSdan 440000 440000000 1098daefc2aSdan 440000 440000000 1108daefc2aSdan 440000 440000000 1118daefc2aSdan} 1128daefc2aSdan 1138daefc2aSdanfinish_test 114