1# 2013 March 20 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# 12# This file tests the effect of the mmap() or mremap() system calls 13# returning an error on the library. 14# 15# If either mmap() or mremap() fails, SQLite should log an error 16# message, then continue accessing the database using read() and 17# write() exclusively. 18# 19 20set testdir [file dirname $argv0] 21source $testdir/tester.tcl 22set testprefix mmap2 23 24if {$::tcl_platform(platform)!="unix" || [test_syscall defaultvfs] != "unix"} { 25 finish_test 26 return 27} 28ifcapable !mmap { 29 finish_test 30 return 31} 32 33db close 34sqlite3_shutdown 35test_sqlite3_log xLog 36proc xLog {error_code msg} { 37 if {[string match os_unix.c* $msg]} { 38 lappend ::log $msg 39 } 40} 41 42foreach syscall {mmap mremap} { 43 test_syscall uninstall 44 if {[catch {test_syscall install $syscall}]} continue 45 46 for {set i 1} {$i < 20} {incr i} { 47 reset_db 48 execsql { PRAGMA mmap_size = 8000000 } 49 50 test_syscall fault $i 1 51 test_syscall errno $syscall ENOMEM 52 set ::log "" 53 54 do_execsql_test 1.$syscall.$i.1 { 55 CREATE TABLE t1(a, b, UNIQUE(a, b)); 56 INSERT INTO t1 VALUES(randomblob(1000), randomblob(1000)); 57 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; 58 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; 59 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; 60 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; 61 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; 62 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; 63 } 64 65 set nFail [test_syscall fault 0 0] 66 67 do_execsql_test 1.$syscall.$i.2 { 68 SELECT count(*) FROM t1; 69 PRAGMA integrity_check; 70 } {64 ok} 71 72 do_test 1.$syscall.$i.3 { 73 expr {$nFail==0 || $nFail==1} 74 } {1} 75 76 do_test 1.$syscall.$i.4.nFail=$nFail { 77 regexp ".*${syscall}.*" $::log 78 } [expr $nFail>0] 79 } 80} 81 82db close 83test_syscall uninstall 84sqlite3_shutdown 85test_sqlite3_log 86sqlite3_initialize 87finish_test 88