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
14set testdir [file dirname $argv0]
15source $testdir/tester.tcl
16set testprefix sort5
17
18
19#-------------------------------------------------------------------------
20# Verify that sorting works with a version 1 sqlite3_io_methods structure.
21#
22testvfs tvfs -iversion 1 -default true
23reset_db
24do_execsql_test 1.0 {
25  PRAGMA mmap_size = 10000000;
26  PRAGMA cache_size = 10;
27  CREATE TABLE t1(a, b);
28} {0}
29
30do_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
38do_execsql_test 1.2 {
39  CREATE INDEX i1 ON t1(b);
40}
41
42db close
43tvfs 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#
50testvfs tvfs
51tvfs script tv_callback
52tvfs filter {xOpen xWrite}
53
54proc 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
72catch { db close }
73forcedelete test.db
74sqlite3 db test.db -vfs tvfs
75execsql { CREATE TABLE t1(x) }
76
77# Each iteration of the following loop attempts to sort 10001 records
78# each a bit over 100 bytes in size. In total a little more than 1MiB
79# of data.
80#
81foreach {tn pgsz cachesz bTemp} {
82  1 4096   1000  0
83  2 1024   1000  1
84
85  3 4096  -1000  1
86  4 1024  -1000  1
87
88  5 4096  -9000  0
89  6 1024  -9000  0
90} {
91  do_execsql_test 2.$tn.0 "
92    PRAGMA page_size = $pgsz;
93    VACUUM;
94    PRAGMA cache_size = $cachesz;
95  "
96
97  if {[db one {PRAGMA page_size}]!=$pgsz} {
98    # SEE is not able to change page sizes and that messes up the
99    # results that follow.
100    continue
101  }
102
103  do_test 2.$tn.1 {
104    set ::iTemp 0
105    catch { array unset F }
106    execsql {
107      WITH x(i, j) AS (
108        SELECT 1, randomblob(100)
109        UNION ALL
110        SELECT i+1, randomblob(100) FROM x WHERE i<10000
111      )
112      SELECT * FROM x ORDER BY j;
113    }
114    expr {[array names F]!=""}
115  } $bTemp
116}
117
118finish_test
119