summaryrefslogtreecommitdiffstats
path: root/test/sort5.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/sort5.test')
-rw-r--r--test/sort5.test122
1 files changed, 122 insertions, 0 deletions
diff --git a/test/sort5.test b/test/sort5.test
new file mode 100644
index 0000000..80dce01
--- /dev/null
+++ b/test/sort5.test
@@ -0,0 +1,122 @@
+# 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