Index: third_party/sqlite/sqlite-src-3170000/test/sort5.test |
diff --git a/third_party/sqlite/sqlite-src-3170000/test/sort5.test b/third_party/sqlite/sqlite-src-3170000/test/sort5.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6ada81c9ccf073bdbacabe5042665549197ca993 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3170000/test/sort5.test |
@@ -0,0 +1,118 @@ |
+# 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 |