xref: /sqlite-3.40.0/test/mmap4.test (revision be7721d1)
1*be7721d1Sdan# 2016 February 04
2*be7721d1Sdan#
3*be7721d1Sdan# The author disclaims copyright to this source code.  In place of
4*be7721d1Sdan# a legal notice, here is a blessing:
5*be7721d1Sdan#
6*be7721d1Sdan#    May you do good and not evil.
7*be7721d1Sdan#    May you find forgiveness for yourself and forgive others.
8*be7721d1Sdan#    May you share freely, never taking more than you give.
9*be7721d1Sdan#
10*be7721d1Sdan#***********************************************************************
11*be7721d1Sdan#
12*be7721d1Sdan# This file tests the effect of the mmap() or mremap() system calls
13*be7721d1Sdan# returning an error on the library.
14*be7721d1Sdan#
15*be7721d1Sdan# If either mmap() or mremap() fails, SQLite should log an error
16*be7721d1Sdan# message, then continue accessing the database using read() and
17*be7721d1Sdan# write() exclusively.
18*be7721d1Sdan#
19*be7721d1Sdanset testdir [file dirname $argv0]
20*be7721d1Sdansource $testdir/tester.tcl
21*be7721d1Sdanifcapable !mmap {
22*be7721d1Sdan  finish_test
23*be7721d1Sdan  return
24*be7721d1Sdan}
25*be7721d1Sdansource $testdir/lock_common.tcl
26*be7721d1Sdanset testprefix mmap4
27*be7721d1Sdan
28*be7721d1Sdan# Return a Tcl script that registers a user-defined scalar function
29*be7721d1Sdan# named rblob() with database handle $dbname. The function returns a
30*be7721d1Sdan# sequence of pseudo-random blobs based on seed value $seed.
31*be7721d1Sdan#
32*be7721d1Sdanproc register_rblob_code {dbname seed} {
33*be7721d1Sdan  return [subst -nocommands {
34*be7721d1Sdan    set ::rcnt $seed
35*be7721d1Sdan    proc rblob {n} {
36*be7721d1Sdan      set ::rcnt [expr (([set ::rcnt] << 3) + [set ::rcnt] + 456) & 0xFFFFFFFF]
37*be7721d1Sdan      set str [format %.8x [expr [set ::rcnt] ^ 0xbdf20da3]]
38*be7721d1Sdan      string range [string repeat [set str] [expr [set n]/4]] 1 [set n]
39*be7721d1Sdan    }
40*be7721d1Sdan    $dbname func rblob rblob
41*be7721d1Sdan  }]
42*be7721d1Sdan}
43*be7721d1Sdan
44*be7721d1Sdan#-------------------------------------------------------------------------
45*be7721d1Sdan# Test various mmap_size settings.
46*be7721d1Sdan#
47*be7721d1Sdanforeach {tn1 mmap1 mmap2} {
48*be7721d1Sdan     1 6144       167773
49*be7721d1Sdan     2 18432      140399
50*be7721d1Sdan     3 43008      401302
51*be7721d1Sdan     4 92160      253899
52*be7721d1Sdan     5 190464          2
53*be7721d1Sdan     6 387072     752431
54*be7721d1Sdan     7 780288     291143
55*be7721d1Sdan     8 1566720    594306
56*be7721d1Sdan     9 3139584    829137
57*be7721d1Sdan     10 6285312   793963
58*be7721d1Sdan     11 12576768 1015590
59*be7721d1Sdan} {
60*be7721d1Sdan  do_multiclient_test tn {
61*be7721d1Sdan    sql1 {
62*be7721d1Sdan      CREATE TABLE t1(a PRIMARY KEY);
63*be7721d1Sdan      CREATE TABLE t2(x);
64*be7721d1Sdan      INSERT INTO t2 VALUES('');
65*be7721d1Sdan    }
66*be7721d1Sdan
67*be7721d1Sdan    code1 [register_rblob_code db  0]
68*be7721d1Sdan    code2 [register_rblob_code db2 444]
69*be7721d1Sdan
70*be7721d1Sdan    sql1 "PRAGMA mmap_size = $mmap1"
71*be7721d1Sdan    sql2 "PRAGMA mmap_size = $mmap2"
72*be7721d1Sdan
73*be7721d1Sdan    do_test $tn1.$tn {
74*be7721d1Sdan      for {set i 1} {$i <= 100} {incr i} {
75*be7721d1Sdan        if {$i % 2} {
76*be7721d1Sdan          set c1 sql1
77*be7721d1Sdan            set c2 sql2
78*be7721d1Sdan        } else {
79*be7721d1Sdan          set c1 sql2
80*be7721d1Sdan            set c2 sql1
81*be7721d1Sdan        }
82*be7721d1Sdan
83*be7721d1Sdan        $c1 {
84*be7721d1Sdan          INSERT INTO t1 VALUES( rblob(5000) );
85*be7721d1Sdan          UPDATE t2 SET x = (SELECT md5sum(a) FROM t1);
86*be7721d1Sdan        }
87*be7721d1Sdan
88*be7721d1Sdan        set res [$c2 {
89*be7721d1Sdan            SELECT count(*) FROM t1;
90*be7721d1Sdan            SELECT x == (SELECT md5sum(a) FROM t1) FROM t2;
91*be7721d1Sdan            PRAGMA integrity_check;
92*be7721d1Sdan        }]
93*be7721d1Sdan        if {$res != [list $i 1 ok]} {
94*be7721d1Sdan          do_test $tn1.$tn.$i {
95*be7721d1Sdan            set ::res
96*be7721d1Sdan          } [list $i 1 ok]
97*be7721d1Sdan        }
98*be7721d1Sdan      }
99*be7721d1Sdan      set res 1
100*be7721d1Sdan    } {1}
101*be7721d1Sdan  }
102*be7721d1Sdan}
103*be7721d1Sdan
104*be7721d1Sdanfinish_test
105